diff options
Diffstat (limited to 'connectivity/source/drivers')
341 files changed, 11403 insertions, 9789 deletions
diff --git a/connectivity/source/drivers/ado/ACallableStatement.cxx b/connectivity/source/drivers/ado/ACallableStatement.cxx index 94ad744d0134..fae8b0f5394e 100644 --- a/connectivity/source/drivers/ado/ACallableStatement.cxx +++ b/connectivity/source/drivers/ado/ACallableStatement.cxx @@ -117,7 +117,6 @@ sal_Int32 SAL_CALL OCallableStatement::getInt( sal_Int32 columnIndex ) return m_aValue.getInt32(); } - sal_Int64 SAL_CALL OCallableStatement::getLong( sal_Int32 columnIndex ) { ADOParameter* pParam = nullptr; @@ -127,14 +126,11 @@ sal_Int64 SAL_CALL OCallableStatement::getLong( sal_Int32 columnIndex ) return static_cast<sal_Int64>(m_aValue.getCurrency().int64); } - Any SAL_CALL OCallableStatement::getObject( sal_Int32 /*columnIndex*/, const Reference< css::container::XNameAccess >& /*typeMap*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getObject", *this ); - return Any(); } - sal_Int16 SAL_CALL OCallableStatement::getShort( sal_Int32 columnIndex ) { ADOParameter* pParam = nullptr; @@ -144,7 +140,6 @@ sal_Int16 SAL_CALL OCallableStatement::getShort( sal_Int32 columnIndex ) return m_aValue.getInt16(); } - OUString SAL_CALL OCallableStatement::getString( sal_Int32 columnIndex ) { ADOParameter* pParam = nullptr; @@ -154,8 +149,7 @@ OUString SAL_CALL OCallableStatement::getString( sal_Int32 columnIndex ) return m_aValue.getString(); } - - css::util::Time SAL_CALL OCallableStatement::getTime( sal_Int32 columnIndex ) +css::util::Time SAL_CALL OCallableStatement::getTime( sal_Int32 columnIndex ) { ADOParameter* pParam = nullptr; m_pParameters->get_Item(OLEVariant(sal_Int32(columnIndex-1)),&pParam); @@ -202,43 +196,33 @@ void SAL_CALL OCallableStatement::registerNumericOutParameter( sal_Int32 paramet Reference< css::io::XInputStream > SAL_CALL OCallableStatement::getBinaryStream( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getBinaryStream", *this ); - return nullptr; } Reference< css::io::XInputStream > SAL_CALL OCallableStatement::getCharacterStream( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getCharacterStream", *this ); - return nullptr; } - Reference< XArray > SAL_CALL OCallableStatement::getArray( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getArray", *this ); - return nullptr; } - Reference< XClob > SAL_CALL OCallableStatement::getClob( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getClob", *this ); - return nullptr; } Reference< XBlob > SAL_CALL OCallableStatement::getBlob( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getBlob", *this ); - return nullptr; } - Reference< XRef > SAL_CALL OCallableStatement::getRef( sal_Int32 /*columnIndex*/) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getRef", *this ); - return nullptr; } - void SAL_CALL OCallableStatement::acquire() noexcept { OPreparedStatement::acquire(); @@ -249,5 +233,4 @@ void SAL_CALL OCallableStatement::release() noexcept OPreparedStatement::release(); } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/ado/AColumn.cxx b/connectivity/source/drivers/ado/AColumn.cxx index 98b4c899595a..8e4dd370a023 100644 --- a/connectivity/source/drivers/ado/AColumn.cxx +++ b/connectivity/source/drivers/ado/AColumn.cxx @@ -40,19 +40,7 @@ using namespace com::sun::star::sdbc; void WpADOColumn::Create() { - _ADOColumn* pColumn = nullptr; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOCOLUMN_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOCOLUMN_25, - reinterpret_cast<void**>(&pColumn) ); - - - if( !FAILED( hr ) ) - { - operator=( pColumn ); - pColumn->Release( ); - } + pInterface.CoCreateInstance(ADOS::CLSID_ADOCOLUMN_25, nullptr, CLSCTX_INPROC_SERVER); } OAdoColumn::OAdoColumn(bool _bCase,OConnection* _pConnection,_ADOColumn* _pColumn) @@ -61,7 +49,7 @@ OAdoColumn::OAdoColumn(bool _bCase,OConnection* _pConnection,_ADOColumn* _pColum { construct(); OSL_ENSURE(_pColumn,"Column can not be null!"); - m_aColumn = WpADOColumn(_pColumn); + m_aColumn.set(_pColumn); // m_aColumn.put_ParentCatalog(_pConnection->getAdoCatalog()->getCatalog()); fillPropertyValues(); } @@ -78,20 +66,6 @@ OAdoColumn::OAdoColumn(bool _bCase,OConnection* _pConnection) } -Sequence< sal_Int8 > OAdoColumn::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoColumn::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OColumn_ADO>{}); -} - void OAdoColumn::construct() { sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY; @@ -167,7 +141,6 @@ void OAdoColumn::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& r getBOOL(rValue)); break; - case PROPERTY_ID_IM001: case PROPERTY_ID_DESCRIPTION: sAdoPropertyName = u"Description"; break; diff --git a/connectivity/source/drivers/ado/AColumns.cxx b/connectivity/source/drivers/ado/AColumns.cxx index 6297871d5b62..5e8cba1f8ac0 100644 --- a/connectivity/source/drivers/ado/AColumns.cxx +++ b/connectivity/source/drivers/ado/AColumns.cxx @@ -43,7 +43,7 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; -sdbcx::ObjectType OColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OColumns::createObject(const OUString& _rName) { return new OAdoColumn(isCaseSensitive(),m_pConnection,m_aCollection.GetItem(_rName)); } @@ -60,9 +60,9 @@ Reference< XPropertySet > OColumns::createDescriptor() } // XAppend -sdbcx::ObjectType OColumns::appendObject( const OUString&, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OColumns::appendObject( const OUString&, const Reference< XPropertySet >& descriptor ) { - rtl::Reference<OAdoColumn> pColumn = getFromUnoTunnel<OAdoColumn>( descriptor ); + rtl::Reference<OAdoColumn> pColumn = dynamic_cast<OAdoColumn*>( descriptor.get() ); Reference< XPropertySet > xColumn; if ( !pColumn.is() ) { @@ -109,7 +109,7 @@ sdbcx::ObjectType OColumns::appendObject( const OUString&, const Reference< XPro aAddedColumn.put_RelatedColumn(aColumn.get_RelatedColumn()); } } - ADOS::ThrowException(*m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); return new OAdoColumn(isCaseSensitive(),m_pConnection,pColumn->getColumnImpl()); } @@ -118,7 +118,7 @@ sdbcx::ObjectType OColumns::appendObject( const OUString&, const Reference< XPro void OColumns::dropObject(sal_Int32 /*_nPos*/,const OUString& _sElementName) { if(!m_aCollection.Delete(_sElementName)) - ADOS::ThrowException(*m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); } diff --git a/connectivity/source/drivers/ado/AConnection.cxx b/connectivity/source/drivers/ado/AConnection.cxx index 19276dfac73c..8fe1f3920c1e 100644 --- a/connectivity/source/drivers/ado/AConnection.cxx +++ b/connectivity/source/drivers/ado/AConnection.cxx @@ -19,6 +19,7 @@ #include <sal/config.h> +#include <cstddef> #include <string_view> #include <ado/AConnection.hxx> @@ -34,7 +35,9 @@ #include <com/sun/star/lang/DisposedException.hpp> #include <comphelper/servicehelper.hxx> #include <connectivity/dbexception.hxx> +#include <o3tl/string_view.hxx> #include <osl/file.hxx> +#include <systools/win32/oleauto.hxx> #include <strings.hrc> using namespace dbtools; @@ -51,44 +54,25 @@ IMPLEMENT_SERVICE_INFO(OConnection,"com.sun.star.sdbcx.AConnection","com.sun.sta OConnection::OConnection(ODriver* _pDriver) : m_xCatalog(nullptr), m_pDriver(_pDriver), - m_pAdoConnection(nullptr), - m_pCatalog(nullptr), m_nEngineType(0), m_bClosed(false), m_bAutocommit(true) { osl_atomic_increment( &m_refCount ); - IClassFactory2* pIUnknown = nullptr; - HRESULT hr; - hr = CoGetClassObject( ADOS::CLSID_ADOCONNECTION_21, - CLSCTX_INPROC_SERVER, - nullptr, - IID_IClassFactory2, - reinterpret_cast<void**>(&pIUnknown) ); - - if( !FAILED( hr ) ) + sal::systools::COMReference<IClassFactory2> pIUnknown; + if (!FAILED(pIUnknown.CoGetClassObject(ADOS::CLSID_ADOCONNECTION_21, CLSCTX_INPROC_SERVER))) { - ADOConnection *pCon = nullptr; - IUnknown *pOuter = nullptr; - hr = pIUnknown->CreateInstanceLic( pOuter, + HRESULT hr = pIUnknown->CreateInstanceLic(nullptr, nullptr, ADOS::IID_ADOCONNECTION_21, - ADOS::GetKeyStr().asBSTR(), - reinterpret_cast<void**>(&pCon)); + ADOS::GetKeyStr(), + reinterpret_cast<void**>(&m_aAdoConnection)); if( !FAILED( hr ) ) { - OSL_ENSURE( pCon, "OConnection::OConnection: invalid ADO object!" ); - - m_pAdoConnection = new WpADOConnection( pCon ); - // CreateInstanceLic returned an object which was already acquired - pCon->Release( ); - + OSL_ENSURE(m_aAdoConnection, "OConnection::OConnection: invalid ADO object!"); } - - // Class Factory is no longer needed - pIUnknown->Release(); } osl_atomic_decrement( &m_refCount ); @@ -98,47 +82,45 @@ OConnection::~OConnection() { } -void OConnection::construct(const OUString& url,const Sequence< PropertyValue >& info) +void OConnection::construct(std::u16string_view url,const Sequence< PropertyValue >& info) { osl_atomic_increment( &m_refCount ); setConnectionInfo(info); - sal_Int32 nLen = url.indexOf(':'); - nLen = url.indexOf(':',nLen+1); - OUString aDSN(url.copy(nLen+1)),aUID,aPWD; - if ( aDSN.startsWith("access:") ) - aDSN = aDSN.copy(7); + std::size_t nLen = url.find(':'); + nLen = url.find(':',nLen == std::u16string_view::npos ? 0 : nLen+1); + std::u16string_view aDSN(url.substr(nLen == std::u16string_view::npos ? 0 : nLen+1)); + OUString aUID,aPWD; + o3tl::starts_with(aDSN, u"access:", &aDSN); sal_Int32 nTimeout = 20; - const PropertyValue *pIter = info.getConstArray(); - const PropertyValue *pEnd = pIter + info.getLength(); - for(;pIter != pEnd;++pIter) + for (const auto& propval : info) { - if(pIter->Name == "Timeout") - pIter->Value >>= nTimeout; - else if(pIter->Name == "user") - pIter->Value >>= aUID; - else if(pIter->Name == "password") - pIter->Value >>= aPWD; + if (propval.Name == "Timeout") + propval.Value >>= nTimeout; + else if (propval.Name == "user") + propval.Value >>= aUID; + else if (propval.Name == "password") + propval.Value >>= aPWD; } try { - if(m_pAdoConnection) + if(m_aAdoConnection) { - if(m_pAdoConnection->Open(aDSN,aUID,aPWD,adConnectUnspecified)) - m_pAdoConnection->PutCommandTimeout(nTimeout); + if(m_aAdoConnection.Open(aDSN,aUID,aPWD,adConnectUnspecified)) + m_aAdoConnection.PutCommandTimeout(nTimeout); else - ADOS::ThrowException(*m_pAdoConnection,*this); - if(m_pAdoConnection->get_State() != adStateOpen) + ADOS::ThrowException(m_aAdoConnection,*this); + if(m_aAdoConnection.get_State() != adStateOpen) throwGenericSQLException( STR_NO_CONNECTION,*this ); - WpADOProperties aProps = m_pAdoConnection->get_Properties(); + WpADOProperties aProps = m_aAdoConnection.get_Properties(); if(aProps.IsValid()) { - OTools::putValue(aProps, std::u16string_view(u"Jet OLEDB:ODBC Parsing"), true); + OTools::putValue(aProps, std::u16string_view(u"ACE OLEDB:ODBC Parsing"), true); OLEVariant aVar( - OTools::getValue(aProps, std::u16string_view(u"Jet OLEDB:Engine Type"))); + OTools::getValue(aProps, std::u16string_view(u"ACE OLEDB:Engine Type"))); if(!aVar.isNull() && !aVar.isEmpty()) m_nEngineType = aVar.getInt32(); } @@ -196,13 +178,13 @@ OUString SAL_CALL OConnection::nativeSQL( const OUString& _sql ) OUString sql = _sql; - WpADOProperties aProps = m_pAdoConnection->get_Properties(); + WpADOProperties aProps = m_aAdoConnection.get_Properties(); if(aProps.IsValid()) { - OTools::putValue(aProps, std::u16string_view(u"Jet OLEDB:ODBC Parsing"), true); + OTools::putValue(aProps, std::u16string_view(u"ACE OLEDB:ODBC Parsing"), true); WpADOCommand aCommand; aCommand.Create(); - aCommand.put_ActiveConnection(static_cast<IDispatch*>(*m_pAdoConnection)); + aCommand.put_ActiveConnection(static_cast<IDispatch*>(m_aAdoConnection)); aCommand.put_CommandText(sql); sql = aCommand.get_CommandText(); } @@ -218,9 +200,9 @@ void SAL_CALL OConnection::setAutoCommit( sal_Bool autoCommit ) m_bAutocommit = autoCommit; if(!autoCommit) - m_pAdoConnection->BeginTrans(); + m_aAdoConnection.BeginTrans(); else - m_pAdoConnection->RollbackTrans(); + m_aAdoConnection.RollbackTrans(); } sal_Bool SAL_CALL OConnection::getAutoCommit( ) @@ -238,7 +220,7 @@ void SAL_CALL OConnection::commit( ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - m_pAdoConnection->CommitTrans(); + m_aAdoConnection.CommitTrans(); } void SAL_CALL OConnection::rollback( ) @@ -247,14 +229,14 @@ void SAL_CALL OConnection::rollback( ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - m_pAdoConnection->RollbackTrans(); + m_aAdoConnection.RollbackTrans(); } sal_Bool SAL_CALL OConnection::isClosed( ) { ::osl::MutexGuard aGuard( m_aMutex ); - return OConnection_BASE::rBHelper.bDisposed && !m_pAdoConnection->get_State(); + return OConnection_BASE::rBHelper.bDisposed && !m_aAdoConnection.get_State(); } Reference< XDatabaseMetaData > SAL_CALL OConnection::getMetaData( ) @@ -279,8 +261,8 @@ void SAL_CALL OConnection::setReadOnly( sal_Bool readOnly ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - m_pAdoConnection->put_Mode(readOnly ? adModeRead : adModeReadWrite); - ADOS::ThrowException(*m_pAdoConnection,*this); + m_aAdoConnection.put_Mode(readOnly ? adModeRead : adModeReadWrite); + ADOS::ThrowException(m_aAdoConnection,*this); } sal_Bool SAL_CALL OConnection::isReadOnly( ) @@ -289,7 +271,7 @@ sal_Bool SAL_CALL OConnection::isReadOnly( ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - return m_pAdoConnection->get_Mode() == adModeRead; + return m_aAdoConnection.get_Mode() == adModeRead; } void SAL_CALL OConnection::setCatalog( const OUString& catalog ) @@ -297,8 +279,8 @@ void SAL_CALL OConnection::setCatalog( const OUString& catalog ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - m_pAdoConnection->PutDefaultDatabase(catalog); - ADOS::ThrowException(*m_pAdoConnection,*this); + m_aAdoConnection.PutDefaultDatabase(catalog); + ADOS::ThrowException(m_aAdoConnection,*this); } OUString SAL_CALL OConnection::getCatalog( ) @@ -306,7 +288,7 @@ OUString SAL_CALL OConnection::getCatalog( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - return m_pAdoConnection->GetDefaultDatabase(); + return m_aAdoConnection.GetDefaultDatabase(); } void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) @@ -337,8 +319,8 @@ void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) OSL_FAIL("OConnection::setTransactionIsolation invalid level"); return; } - m_pAdoConnection->put_IsolationLevel(eIso); - ADOS::ThrowException(*m_pAdoConnection,*this); + m_aAdoConnection.put_IsolationLevel(eIso); + ADOS::ThrowException(m_aAdoConnection,*this); } sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) @@ -348,7 +330,7 @@ sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) sal_Int32 nRet = 0; - switch(m_pAdoConnection->get_IsolationLevel()) + switch(m_aAdoConnection.get_IsolationLevel()) { case adXactUnspecified: nRet = TransactionIsolation::NONE; @@ -368,7 +350,7 @@ sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) default: OSL_FAIL("OConnection::setTransactionIsolation invalid level"); } - ADOS::ThrowException(*m_pAdoConnection,*this); + ADOS::ThrowException(m_aAdoConnection,*this); return nRet; } @@ -411,7 +393,7 @@ void OConnection::buildTypeInfo() { ::osl::MutexGuard aGuard( m_aMutex ); - ADORecordset *pRecordset = m_pAdoConnection->getTypeInfo(); + ADORecordset *pRecordset = m_aAdoConnection.getTypeInfo(); if ( pRecordset ) { pRecordset->AddRef(); @@ -473,18 +455,17 @@ void OConnection::disposing() m_bClosed = true; m_xMetaData = css::uno::WeakReference< css::sdbc::XDatabaseMetaData>(); - m_xCatalog = css::uno::WeakReference< css::sdbcx::XTablesSupplier>(); + m_xCatalog.clear(); m_pDriver = nullptr; - m_pAdoConnection->Close(); + m_aAdoConnection.Close(); for (auto& rEntry : m_aTypeInfo) delete rEntry.second; m_aTypeInfo.clear(); - delete m_pAdoConnection; - m_pAdoConnection = nullptr; + m_aAdoConnection.clear(); } sal_Int64 SAL_CALL OConnection::getSomething( const css::uno::Sequence< sal_Int8 >& rId ) diff --git a/connectivity/source/drivers/ado/ADatabaseMetaData.cxx b/connectivity/source/drivers/ado/ADatabaseMetaData.cxx index b3f319203834..fc4244e4965b 100644 --- a/connectivity/source/drivers/ado/ADatabaseMetaData.cxx +++ b/connectivity/source/drivers/ado/ADatabaseMetaData.cxx @@ -42,15 +42,15 @@ using namespace com::sun::star::sdbc; ODatabaseMetaData::ODatabaseMetaData(OConnection* _pCon) : ::connectivity::ODatabaseMetaDataBase(_pCon,_pCon->getConnectionInfo()) - ,m_pADOConnection(_pCon->getConnection()) + ,m_rADOConnection(_pCon->getConnection()) ,m_pConnection(_pCon) { } sal_Int32 ODatabaseMetaData::getInt32Property(const OUString& _aProperty) { - connectivity::ado::WpADOProperties aProps(m_pADOConnection->get_Properties()); - // ADOS::ThrowException(*m_pADOConnection,*this); + connectivity::ado::WpADOProperties aProps(m_rADOConnection.get_Properties()); + // ADOS::ThrowException(m_rADOConnection,*this); OSL_ENSURE(aProps.IsValid(),"There are no properties at the connection"); ADO_PROP(_aProperty); sal_Int32 nValue(0); @@ -62,8 +62,8 @@ sal_Int32 ODatabaseMetaData::getInt32Property(const OUString& _aProperty) bool ODatabaseMetaData::getBoolProperty(const OUString& _aProperty) { - connectivity::ado::WpADOProperties aProps(m_pADOConnection->get_Properties()); - ADOS::ThrowException(*m_pADOConnection,*this); + connectivity::ado::WpADOProperties aProps(m_rADOConnection.get_Properties()); + ADOS::ThrowException(m_rADOConnection,*this); OSL_ENSURE(aProps.IsValid(),"There are no properties at the connection"); ADO_PROP(_aProperty); return !aVar.isNull() && !aVar.isEmpty() && aVar.getBool(); @@ -71,8 +71,8 @@ bool ODatabaseMetaData::getBoolProperty(const OUString& _aProperty) OUString ODatabaseMetaData::getStringProperty(const OUString& _aProperty) { - connectivity::ado::WpADOProperties aProps(m_pADOConnection->get_Properties()); - ADOS::ThrowException(*m_pADOConnection,*this); + connectivity::ado::WpADOProperties aProps(m_rADOConnection.get_Properties()); + ADOS::ThrowException(m_rADOConnection,*this); OSL_ENSURE(aProps.IsValid(),"There are no properties at the connection"); ADO_PROP(_aProperty); @@ -85,7 +85,7 @@ OUString ODatabaseMetaData::getStringProperty(const OUString& _aProperty) Reference< XResultSet > ODatabaseMetaData::impl_getTypeInfo_throw( ) { - ADORecordset *pRecordset = m_pADOConnection->getTypeInfo(); + ADORecordset *pRecordset = m_rADOConnection.getTypeInfo(); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setTypeInfoMap(ADOS::isJetEngine(m_pConnection->getEngineType())); @@ -98,8 +98,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCatalogs( ) vtEmpty.setNoArg(); ADORecordset *pRecordset = nullptr; - m_pADOConnection->OpenSchema(adSchemaCatalogs,vtEmpty,vtEmpty,&pRecordset); - ADOS::ThrowException(*m_pADOConnection,*this); + m_rADOConnection.OpenSchema(adSchemaCatalogs,vtEmpty,vtEmpty,&pRecordset); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setCatalogsMap(); @@ -118,8 +118,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSchemas( ) vtEmpty.setNoArg(); ADORecordset *pRecordset = nullptr; - m_pADOConnection->OpenSchema(adSchemaSchemata,vtEmpty,vtEmpty,&pRecordset); - ADOS::ThrowException(*m_pADOConnection,*this); + m_rADOConnection.OpenSchema(adSchemaSchemata,vtEmpty,vtEmpty,&pRecordset); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setSchemasMap(); @@ -130,8 +130,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges( const Any& catalog, const OUString& schema, const OUString& table, const OUString& columnNamePattern ) { - ADORecordset *pRecordset = m_pADOConnection->getColumnPrivileges(catalog,schema,table,columnNamePattern); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getColumnPrivileges(catalog,schema,table,columnNamePattern); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setColumnPrivilegesMap(); @@ -142,8 +142,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns( const Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) { - ADORecordset *pRecordset = m_pADOConnection->getColumns(catalog,schemaPattern,tableNamePattern,columnNamePattern); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getColumns(catalog,schemaPattern,tableNamePattern,columnNamePattern); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setColumnsMap(); @@ -155,8 +155,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables( const Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const Sequence< OUString >& types ) { - ADORecordset *pRecordset = m_pADOConnection->getTables(catalog,schemaPattern,tableNamePattern,types); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getTables(catalog,schemaPattern,tableNamePattern,types); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setTablesMap(); @@ -168,8 +168,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedureColumns( const Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern, const OUString& columnNamePattern ) { - ADORecordset *pRecordset = m_pADOConnection->getProcedureColumns(catalog,schemaPattern,procedureNamePattern,columnNamePattern); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getProcedureColumns(catalog,schemaPattern,procedureNamePattern,columnNamePattern); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setProcedureColumnsMap(); @@ -182,8 +182,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedures( const OUString& procedureNamePattern ) { // Create elements used in the array - ADORecordset *pRecordset = m_pADOConnection->getProcedures(catalog,schemaPattern,procedureNamePattern); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getProcedures(catalog,schemaPattern,procedureNamePattern); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setProceduresMap(); @@ -254,8 +254,8 @@ sal_Int32 ODatabaseMetaData::impl_getMaxTablesInSelect_throw( ) Reference< XResultSet > SAL_CALL ODatabaseMetaData::getExportedKeys( const Any& catalog, const OUString& schema, const OUString& table ) { - ADORecordset *pRecordset = m_pADOConnection->getExportedKeys(catalog,schema,table); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getExportedKeys(catalog,schema,table); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setCrossReferenceMap(); @@ -266,8 +266,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getExportedKeys( Reference< XResultSet > SAL_CALL ODatabaseMetaData::getImportedKeys( const Any& catalog, const OUString& schema, const OUString& table ) { - ADORecordset *pRecordset = m_pADOConnection->getImportedKeys(catalog,schema,table); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getImportedKeys(catalog,schema,table); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setCrossReferenceMap(); @@ -278,8 +278,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getImportedKeys( Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPrimaryKeys( const Any& catalog, const OUString& schema, const OUString& table ) { - ADORecordset *pRecordset = m_pADOConnection->getPrimaryKeys(catalog,schema,table); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getPrimaryKeys(catalog,schema,table); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setPrimaryKeysMap(); @@ -291,8 +291,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo( const Any& catalog, const OUString& schema, const OUString& table, sal_Bool unique, sal_Bool approximate ) { - ADORecordset *pRecordset = m_pADOConnection->getIndexInfo(catalog,schema,table,unique,approximate); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getIndexInfo(catalog,schema,table,unique,approximate); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setIndexInfoMap(); @@ -308,8 +308,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges( { // the jet provider doesn't support this method // Create elements used in the array - ADORecordset *pRecordset = m_pADOConnection->getTablePrivileges(catalog,schemaPattern,tableNamePattern); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getTablePrivileges(catalog,schemaPattern,tableNamePattern); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setTablePrivilegesMap(); @@ -358,8 +358,8 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCrossReference( const OUString& primaryTable, const Any& foreignCatalog, const OUString& foreignSchema, const OUString& foreignTable ) { - ADORecordset *pRecordset = m_pADOConnection->getCrossReference(primaryCatalog,primarySchema,primaryTable,foreignCatalog,foreignSchema,foreignTable); - ADOS::ThrowException(*m_pADOConnection,*this); + ADORecordset *pRecordset = m_rADOConnection.getCrossReference(primaryCatalog,primarySchema,primaryTable,foreignCatalog,foreignSchema,foreignTable); + ADOS::ThrowException(m_rADOConnection,*this); rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(pRecordset); pResult->setCrossReferenceMap(); @@ -790,7 +790,7 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92IntermediateSQL( ) OUString SAL_CALL ODatabaseMetaData::getURL( ) { - return "sdbc:ado:"+ m_pADOConnection->GetConnectionString(); + return "sdbc:ado:"+ m_rADOConnection.GetConnectionString(); } OUString SAL_CALL ODatabaseMetaData::getUserName( ) @@ -836,7 +836,7 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion( ) sal_Int32 SAL_CALL ODatabaseMetaData::getDefaultTransactionIsolation( ) { sal_Int32 nRet = TransactionIsolation::NONE; - switch(m_pADOConnection->get_IsolationLevel()) + switch(m_rADOConnection.get_IsolationLevel()) { case adXactReadCommitted: nRet = TransactionIsolation::READ_COMMITTED; @@ -863,22 +863,20 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion( ) OUString SAL_CALL ODatabaseMetaData::getSQLKeywords( ) { - ADORecordset *pRecordset = nullptr; + WpADORecordset aRecordset; OLEVariant vtEmpty; vtEmpty.setNoArg(); - m_pADOConnection->OpenSchema(adSchemaDBInfoKeywords,vtEmpty,vtEmpty,&pRecordset); - OSL_ENSURE(pRecordset,"getSQLKeywords: no resultset!"); - ADOS::ThrowException(*m_pADOConnection,*this); - if ( pRecordset ) + m_rADOConnection.OpenSchema(adSchemaDBInfoKeywords,vtEmpty,vtEmpty,&aRecordset); + OSL_ENSURE(aRecordset,"getSQLKeywords: no resultset!"); + ADOS::ThrowException(m_rADOConnection,*this); + if ( aRecordset ) { - WpADORecordset aRecordset(pRecordset); - aRecordset.MoveFirst(); OLEVariant aValue; OUString aRet; while(!aRecordset.IsAtEOF()) { - WpOLEAppendCollection<ADOFields, ADOField, WpADOField> aFields(aRecordset.GetFields()); + WpOLEAppendCollection<ADOFields, WpADOField> aFields(aRecordset.GetFields()); WpADOField aField(aFields.GetItem(0)); aField.get_Value(aValue); aRet += aValue.getString() + ","; @@ -898,8 +896,7 @@ OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape( ) OUString SAL_CALL ODatabaseMetaData::getStringFunctions( ) { - OUString aValue; - return aValue.copy(0,aValue.lastIndexOf(',')); + return OUString(); } OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions( ) @@ -909,8 +906,7 @@ OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions( ) OUString SAL_CALL ODatabaseMetaData::getSystemFunctions( ) { - OUString aValue; - return aValue.copy(0,aValue.lastIndexOf(',')); + return OUString(); } OUString SAL_CALL ODatabaseMetaData::getNumericFunctions( ) @@ -1031,8 +1027,6 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsBatchUpdates( ) Reference< XResultSet > SAL_CALL ODatabaseMetaData::getUDTs( const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*typeNamePattern*/, const Sequence< sal_Int32 >& /*types*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XDatabaseMetaData::getUDTs", *this ); - return Reference< XResultSet >(); } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/ado/ADatabaseMetaDataImpl.cxx b/connectivity/source/drivers/ado/ADatabaseMetaDataImpl.cxx index 8972a4f2dee1..01a07ab96bf6 100644 --- a/connectivity/source/drivers/ado/ADatabaseMetaDataImpl.cxx +++ b/connectivity/source/drivers/ado/ADatabaseMetaDataImpl.cxx @@ -29,6 +29,9 @@ #include <ado/AIndex.hxx> #include <ado/AKey.hxx> #include <ado/ATable.hxx> + +#include <systools/win32/oleauto.hxx> + #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/ProcedureResult.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> @@ -48,24 +51,22 @@ using namespace ::com::sun::star::uno; void ODatabaseMetaData::fillLiterals() { - ADORecordset *pRecordset = nullptr; + WpADORecordset aRecordset; OLEVariant vtEmpty; vtEmpty.setNoArg(); - m_pADOConnection->OpenSchema(adSchemaDBInfoLiterals,vtEmpty,vtEmpty,&pRecordset); + m_rADOConnection.OpenSchema(adSchemaDBInfoLiterals,vtEmpty,vtEmpty,&aRecordset); - ADOS::ThrowException(*m_pADOConnection,*this); + ADOS::ThrowException(m_rADOConnection,*this); - OSL_ENSURE(pRecordset,"fillLiterals: no resultset!"); - if ( pRecordset ) + OSL_ENSURE(aRecordset,"fillLiterals: no resultset!"); + if ( aRecordset ) { - WpADORecordset aRecordset(pRecordset); - aRecordset.MoveFirst(); OLEVariant aValue; LiteralInfo aInfo; while(!aRecordset.IsAtEOF()) { - WpOLEAppendCollection<ADOFields, ADOField, WpADOField> aFields(aRecordset.GetFields()); + WpOLEAppendCollection<ADOFields, WpADOField> aFields(aRecordset.GetFields()); WpADOField aField(aFields.GetItem(1)); aInfo.pwszLiteralValue = aField.get_Value().getString(); aField = aFields.GetItem(5); @@ -387,19 +388,7 @@ RightsEnum OAdoGroup::Map2Right(sal_Int32 _eNum) void WpADOIndex::Create() { - _ADOIndex* pIndex = nullptr; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOINDEX_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOINDEX_25, - reinterpret_cast<void**>(&pIndex) ); - - - if( !FAILED( hr ) ) - { - operator=( pIndex ); - pIndex->Release(); - } + pInterface.CoCreateInstance(ADOS::CLSID_ADOINDEX_25, nullptr, CLSCTX_INPROC_SERVER); } void OAdoIndex::fillPropertyValues() @@ -415,19 +404,7 @@ void OAdoIndex::fillPropertyValues() void WpADOKey::Create() { - _ADOKey* pKey = nullptr; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOKEY_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOKEY_25, - reinterpret_cast<void**>(&pKey) ); - - - if( !FAILED( hr ) ) - { - operator=( pKey ); - pKey->Release(); - } + pInterface.CoCreateInstance(ADOS::CLSID_ADOKEY_25, nullptr, CLSCTX_INPROC_SERVER); } void OAdoKey::fillPropertyValues() @@ -524,29 +501,16 @@ KeyTypeEnum OAdoKey::Map2KeyRule(sal_Int32 _eNum) void WpADOTable::Create() { - _ADOTable* pTable = nullptr; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOTABLE_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOTABLE_25, - reinterpret_cast<void**>(&pTable) ); - - - if( !FAILED( hr ) ) - { - operator=( pTable ); - pTable->Release(); - } + pInterface.CoCreateInstance(ADOS::CLSID_ADOTABLE_25, nullptr, CLSCTX_INPROC_SERVER); } OUString WpADOCatalog::GetObjectOwner(std::u16string_view _rName, ObjectTypeEnum _eNum) { OLEVariant _rVar; _rVar.setNoArg(); - OLEString aBSTR; - OLEString sStr1(_rName); - pInterface->GetObjectOwner(sStr1.asBSTR(),_eNum,_rVar,aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->GetObjectOwner(sal::systools::BStr(_rName), _eNum, _rVar, &aBSTR); + return OUString(aBSTR); } void OAdoTable::fillPropertyValues() @@ -571,19 +535,7 @@ void OAdoTable::fillPropertyValues() void WpADOUser::Create() { - _ADOUser* pUser = nullptr; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOUSER_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOUSER_25, - reinterpret_cast<void**>(&pUser) ); - - - if( !FAILED( hr ) ) - { - operator=( pUser ); - pUser->Release(); - } + pInterface.CoCreateInstance(ADOS::CLSID_ADOUSER_25, nullptr, CLSCTX_INPROC_SERVER); } diff --git a/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx b/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx index 2b94f944656d..4234d15282ff 100644 --- a/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx +++ b/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx @@ -53,7 +53,6 @@ ODatabaseMetaDataResultSet::ODatabaseMetaDataResultSet(ADORecordset* _pRecordSet :ODatabaseMetaDataResultSet_BASE(m_aMutex) ,OPropertySetHelper(ODatabaseMetaDataResultSet_BASE::rBHelper) ,m_pRecordSet(_pRecordSet) - ,m_aStatement(nullptr) ,m_nRowPos(0) ,m_bWasNull(false) ,m_bEOF(false) @@ -88,7 +87,6 @@ void ODatabaseMetaDataResultSet::disposing() ::osl::MutexGuard aGuard(m_aMutex); if(m_pRecordSet) m_pRecordSet->Close(); - m_aStatement = nullptr; m_xMetaData.clear(); } @@ -100,11 +98,8 @@ Any SAL_CALL ODatabaseMetaDataResultSet::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL ODatabaseMetaDataResultSet::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType<css::beans::XMultiPropertySet>::get(), - cppu::UnoType<css::beans::XFastPropertySet>::get(), - cppu::UnoType<css::beans::XPropertySet>::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),ODatabaseMetaDataResultSet_BASE::getTypes()); + return comphelper::concatSequences(cppu::OPropertySetHelper::getTypes(), + ODatabaseMetaDataResultSet_BASE::getTypes()); } void ODatabaseMetaDataResultSet::checkRecordSet() @@ -113,7 +108,6 @@ void ODatabaseMetaDataResultSet::checkRecordSet() throwFunctionSequenceException(*this); } - sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::findColumn( const OUString& columnName ) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -131,9 +125,8 @@ sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::findColumn( const OUString& colum } ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); - return 0; // Never reached } + #define BLOCK_SIZE 256 Reference< css::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getBinaryStream( sal_Int32 columnIndex ) @@ -182,10 +175,8 @@ Reference< css::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getBinar Reference< css::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getCharacterStream", *this ); - return nullptr; } - sal_Bool SAL_CALL ODatabaseMetaDataResultSet::getBoolean( sal_Int32 columnIndex ) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -262,21 +253,16 @@ sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::getInt( sal_Int32 columnIndex ) return m_aValue.getInt32(); } - sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::getRow( ) { ::dbtools::throwFeatureNotImplementedSQLException( "XResultSet::getRow", *this ); - return 0; } - sal_Int64 SAL_CALL ODatabaseMetaDataResultSet::getLong( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getLong", *this ); - return sal_Int64(0); } - Reference< XResultSetMetaData > SAL_CALL ODatabaseMetaDataResultSet::getMetaData( ) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -294,30 +280,23 @@ Reference< XResultSetMetaData > SAL_CALL ODatabaseMetaDataResultSet::getMetaData Reference< XArray > SAL_CALL ODatabaseMetaDataResultSet::getArray( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getRow", *this ); - return nullptr; } - Reference< XClob > SAL_CALL ODatabaseMetaDataResultSet::getClob( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getRow", *this ); - return nullptr; } Reference< XBlob > SAL_CALL ODatabaseMetaDataResultSet::getBlob( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getRow", *this ); - return nullptr; } - Reference< XRef > SAL_CALL ODatabaseMetaDataResultSet::getRef( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getRow", *this ); - return nullptr; } - Any SAL_CALL ODatabaseMetaDataResultSet::getObject( sal_Int32 columnIndex, const Reference< css::container::XNameAccess >& /*typeMap*/ ) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -528,7 +507,7 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::previous( ) Reference< XInterface > SAL_CALL ODatabaseMetaDataResultSet::getStatement( ) { - return m_aStatement.get(); + return nullptr; } @@ -691,21 +670,41 @@ void ODatabaseMetaDataResultSet::setFetchSize(sal_Int32 _par0) ::cppu::IPropertyArrayHelper* ODatabaseMetaDataResultSet::createArrayHelper( ) const { - Sequence< css::beans::Property > aProps(5); - css::beans::Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + } + } + }; } ::cppu::IPropertyArrayHelper & ODatabaseMetaDataResultSet::getInfoHelper() diff --git a/connectivity/source/drivers/ado/ADatabaseMetaDataResultSetMetaData.cxx b/connectivity/source/drivers/ado/ADatabaseMetaDataResultSetMetaData.cxx index 94dbfddb34f9..3fa13d06b84a 100644 --- a/connectivity/source/drivers/ado/ADatabaseMetaDataResultSetMetaData.cxx +++ b/connectivity/source/drivers/ado/ADatabaseMetaDataResultSetMetaData.cxx @@ -71,9 +71,8 @@ sal_Int32 SAL_CALL ODatabaseMetaDataResultSetMetaData::getColumnCount() if (m_vMapping.size()) return m_mColumns.size(); - ADOFields* pFields = nullptr; - m_pRecordSet->get_Fields(&pFields); - WpOLEAppendCollection<ADOFields, ADOField, WpADOField> aFields(pFields); + WpOLEAppendCollection<ADOFields, WpADOField> aFields; + m_pRecordSet->get_Fields(&aFields); m_nColCount = aFields.GetItemCount(); return m_nColCount; } diff --git a/connectivity/source/drivers/ado/ADriver.cxx b/connectivity/source/drivers/ado/ADriver.cxx index 3cdfeab26888..a998664fdd86 100644 --- a/connectivity/source/drivers/ado/ADriver.cxx +++ b/connectivity/source/drivers/ado/ADriver.cxx @@ -63,7 +63,7 @@ void ODriver::disposing() for (auto& rxConnection : m_xConnections) { - Reference< XComponent > xComp(rxConnection.get(), UNO_QUERY); + rtl::Reference< OConnection > xComp(rxConnection.get()); if (xComp.is()) xComp->dispose(); } @@ -96,8 +96,7 @@ Reference< XConnection > SAL_CALL ODriver::connect( const OUString& url, const S // we need to wrap the connection as the construct call might throw rtl::Reference<OConnection> pCon(new OConnection(this)); pCon->construct(url,info); - OConnection* pPtr = pCon.get(); - m_xConnections.push_back(WeakReferenceHelper(*pPtr)); + m_xConnections.push_back(pCon); return pCon; } @@ -187,10 +186,9 @@ Reference< XTablesSupplier > SAL_CALL ODriver::getDataDefinitionByConnection( co aCatalog.Create(); if(aCatalog.IsValid()) { - aCatalog.putref_ActiveConnection(*pConnection->getConnection()); + aCatalog.putref_ActiveConnection(pConnection->getConnection()); rtl::Reference<OCatalog> pCatalog = new OCatalog(aCatalog,pConnection); xTab = pCatalog; - pConnection->setCatalog(xTab); pConnection->setCatalog(pCatalog.get()); } } @@ -206,13 +204,11 @@ Reference< XTablesSupplier > SAL_CALL ODriver::getDataDefinitionByURL( const OUS void ADOS::ThrowException(ADOConnection* _pAdoCon,const Reference< XInterface >& _xInterface) { - ADOErrors *pErrors = nullptr; + sal::systools::COMReference<ADOErrors> pErrors; _pAdoCon->get_Errors(&pErrors); if(!pErrors) return; // no error found - pErrors->AddRef( ); - // read all noted errors and issue them sal_Int32 nLen; pErrors->get_Count(&nLen); @@ -222,28 +218,25 @@ void ADOS::ThrowException(ADOConnection* _pAdoCon,const Reference< XInterface >& aException.ErrorCode = 1000; for (sal_Int32 i = nLen-1; i>=0; --i) { - ADOError *pError = nullptr; - pErrors->get_Item(OLEVariant(i),&pError); - WpADOError aErr(pError); - OSL_ENSURE(pError,"No error in collection found! BAD!"); - if(pError) + WpADOError aErr; + pErrors->get_Item(OLEVariant(i),&aErr); + OSL_ENSURE(aErr,"No error in collection found! BAD!"); + if(aErr) { if(i==nLen-1) aException = SQLException(aErr.GetDescription(),_xInterface,aErr.GetSQLState(),aErr.GetNumber(),Any()); else { SQLException aTemp(aErr.GetDescription(), - _xInterface,aErr.GetSQLState(),aErr.GetNumber(),makeAny(aException)); + _xInterface,aErr.GetSQLState(),aErr.GetNumber(),Any(aException)); aTemp.NextException <<= aException; aException = aTemp; } } } pErrors->Clear(); - pErrors->Release(); throw aException; } - pErrors->Release(); } extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* diff --git a/connectivity/source/drivers/ado/AGroup.cxx b/connectivity/source/drivers/ado/AGroup.cxx index f4ed2b12adbc..02cd239d7682 100644 --- a/connectivity/source/drivers/ado/AGroup.cxx +++ b/connectivity/source/drivers/ado/AGroup.cxx @@ -36,26 +36,14 @@ using namespace com::sun::star::sdbcx; void WpADOGroup::Create() { - ADOGroup* pGroup = nullptr; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOGROUP_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOGROUP_25, - reinterpret_cast<void**>(&pGroup) ); - - - if( !FAILED( hr ) ) - { - operator=( pGroup ); - pGroup->Release(); - } + pInterface.CoCreateInstance(ADOS::CLSID_ADOGROUP_25, nullptr, CLSCTX_INPROC_SERVER); } OAdoGroup::OAdoGroup(OCatalog* _pParent,bool _bCase, ADOGroup* _pGroup) : OGroup_ADO(_bCase),m_pCatalog(_pParent) { construct(); if(_pGroup) - m_aGroup = WpADOGroup(_pGroup); + m_aGroup.set(_pGroup); else m_aGroup.Create(); @@ -81,21 +69,6 @@ void OAdoGroup::refreshUsers() m_pUsers.reset(new OUsers(m_pCatalog, m_aMutex, aVector, aUsers, isCaseSensitive())); } -Sequence< sal_Int8 > OAdoGroup::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoGroup::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OGroup_ADO>{}); -} - - void OAdoGroup::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) { if(m_aGroup.IsValid()) diff --git a/connectivity/source/drivers/ado/AGroups.cxx b/connectivity/source/drivers/ado/AGroups.cxx index e3fb165b0a34..527cfaac13fa 100644 --- a/connectivity/source/drivers/ado/AGroups.cxx +++ b/connectivity/source/drivers/ado/AGroups.cxx @@ -40,7 +40,7 @@ using namespace com::sun::star::sdbc; using namespace com::sun::star::container; -sdbcx::ObjectType OGroups::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OGroups::createObject(const OUString& _rName) { return new OAdoGroup(m_pCatalog,isCaseSensitive(),_rName); } @@ -56,9 +56,9 @@ Reference< XPropertySet > OGroups::createDescriptor() } // XAppend -sdbcx::ObjectType OGroups::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OGroups::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { - OAdoGroup* pGroup = getFromUnoTunnel<OAdoGroup>(descriptor); + OAdoGroup* pGroup = dynamic_cast<OAdoGroup*>(descriptor.get()); if ( pGroup == nullptr ) m_pCatalog->getConnection()->throwGenericSQLException( STR_INVALID_GROUP_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); diff --git a/connectivity/source/drivers/ado/AIndex.cxx b/connectivity/source/drivers/ado/AIndex.cxx index 6b58900893b8..b183d49c2435 100644 --- a/connectivity/source/drivers/ado/AIndex.cxx +++ b/connectivity/source/drivers/ado/AIndex.cxx @@ -39,7 +39,7 @@ OAdoIndex::OAdoIndex(bool _bCase,OConnection* _pConnection,ADOIndex* _pIndex) ,m_pConnection(_pConnection) { construct(); - m_aIndex = WpADOIndex(_pIndex); + m_aIndex.set(_pIndex); fillPropertyValues(); } @@ -70,20 +70,6 @@ void OAdoIndex::refreshColumns() } -Sequence< sal_Int8 > OAdoIndex::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoIndex::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<sdbcx::OIndex>{}); -} - void SAL_CALL OAdoIndex::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) { if(m_aIndex.IsValid()) diff --git a/connectivity/source/drivers/ado/AIndexes.cxx b/connectivity/source/drivers/ado/AIndexes.cxx index c2cdb76081d2..ea80e2d6d4a7 100644 --- a/connectivity/source/drivers/ado/AIndexes.cxx +++ b/connectivity/source/drivers/ado/AIndexes.cxx @@ -40,7 +40,7 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; -sdbcx::ObjectType OIndexes::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OIndexes::createObject(const OUString& _rName) { return new OAdoIndex(isCaseSensitive(),m_pConnection,m_aCollection.GetItem(_rName)); } @@ -56,16 +56,16 @@ Reference< XPropertySet > OIndexes::createDescriptor() } // XAppend -sdbcx::ObjectType OIndexes::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OIndexes::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { - OAdoIndex* pIndex = getFromUnoTunnel<OAdoIndex>(descriptor); + OAdoIndex* pIndex = dynamic_cast<OAdoIndex*>(descriptor.get()); if ( pIndex == nullptr ) m_pConnection->throwGenericSQLException( STR_INVALID_INDEX_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); ADOIndexes* pIndexes = m_aCollection; if ( FAILED( pIndexes->Append( OLEVariant( _rForName ), OLEVariant( pIndex->getImpl() ) ) ) ) { - ADOS::ThrowException(*m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); m_pConnection->throwGenericSQLException( STR_INVALID_INDEX_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); } diff --git a/connectivity/source/drivers/ado/AKey.cxx b/connectivity/source/drivers/ado/AKey.cxx index 35e121c6bb7a..9c2734ede8f1 100644 --- a/connectivity/source/drivers/ado/AKey.cxx +++ b/connectivity/source/drivers/ado/AKey.cxx @@ -37,7 +37,7 @@ OAdoKey::OAdoKey(bool _bCase,OConnection* _pConnection, ADOKey* _pKey) ,m_pConnection(_pConnection) { construct(); - m_aKey = WpADOKey(_pKey); + m_aKey.set(_pKey); fillPropertyValues(); } @@ -66,20 +66,6 @@ void OAdoKey::refreshColumns() m_pColumns.reset(new OColumns(*this, m_aMutex, aVector, aColumns, isCaseSensitive(), m_pConnection)); } -Sequence< sal_Int8 > OAdoKey::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoKey::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OKey_ADO>{}); -} - void OAdoKey::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) { if(m_aKey.IsValid()) @@ -91,7 +77,7 @@ void OAdoKey::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rVal OUString aVal; rValue >>= aVal; m_aKey.put_Name(aVal); - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); } break; case PROPERTY_ID_TYPE: @@ -99,7 +85,7 @@ void OAdoKey::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rVal sal_Int32 nVal=0; rValue >>= nVal; m_aKey.put_Type(Map2KeyRule(nVal)); - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); } break; case PROPERTY_ID_REFERENCEDTABLE: @@ -107,7 +93,7 @@ void OAdoKey::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rVal OUString aVal; rValue >>= aVal; m_aKey.put_RelatedTable(aVal); - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); } break; case PROPERTY_ID_UPDATERULE: @@ -115,7 +101,7 @@ void OAdoKey::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rVal sal_Int32 nVal=0; rValue >>= nVal; m_aKey.put_UpdateRule(Map2Rule(nVal)); - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); } break; case PROPERTY_ID_DELETERULE: @@ -123,7 +109,7 @@ void OAdoKey::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rVal sal_Int32 nVal=0; rValue >>= nVal; m_aKey.put_DeleteRule(Map2Rule(nVal)); - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); } break; } diff --git a/connectivity/source/drivers/ado/AKeys.cxx b/connectivity/source/drivers/ado/AKeys.cxx index a18d91709455..caf7eda5a391 100644 --- a/connectivity/source/drivers/ado/AKeys.cxx +++ b/connectivity/source/drivers/ado/AKeys.cxx @@ -40,7 +40,7 @@ using namespace com::sun::star::sdbc; using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; -sdbcx::ObjectType OKeys::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OKeys::createObject(const OUString& _rName) { return new OAdoKey(isCaseSensitive(),m_pConnection,m_aCollection.GetItem(_rName)); } @@ -56,9 +56,9 @@ Reference< XPropertySet > OKeys::createDescriptor() } // XAppend -sdbcx::ObjectType OKeys::appendObject( const OUString&, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OKeys::appendObject( const OUString&, const Reference< XPropertySet >& descriptor ) { - OAdoKey* pKey = getFromUnoTunnel<OAdoKey>( descriptor ); + OAdoKey* pKey = dynamic_cast<OAdoKey*>( descriptor.get() ); if ( pKey == nullptr) m_pConnection->throwGenericSQLException( STR_INVALID_KEY_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); @@ -78,7 +78,7 @@ sdbcx::ObjectType OKeys::appendObject( const OUString&, const Reference< XProper adKeyPrimary, // must be every time adKeyPrimary vOptional)) ) { - ADOS::ThrowException(*m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); // just make sure that an SQLExceptionis thrown here m_pConnection->throwGenericSQLException( STR_INVALID_KEY_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); } @@ -90,7 +90,7 @@ sdbcx::ObjectType OKeys::appendObject( const OUString&, const Reference< XProper void OKeys::dropObject(sal_Int32 /*_nPos*/,const OUString& _sElementName) { if(!m_aCollection.Delete(OLEVariant(_sElementName).getString())) - ADOS::ThrowException(*m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pConnection->getConnection(),static_cast<XTypeProvider*>(this)); } diff --git a/connectivity/source/drivers/ado/APreparedStatement.cxx b/connectivity/source/drivers/ado/APreparedStatement.cxx index 0db461ef12d3..d7c82d184fdb 100644 --- a/connectivity/source/drivers/ado/APreparedStatement.cxx +++ b/connectivity/source/drivers/ado/APreparedStatement.cxx @@ -38,7 +38,7 @@ #define CHECK_RETURN(x) \ if(!x) \ - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); #ifdef max # undef max @@ -55,7 +55,7 @@ using namespace com::sun::star::util; IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.APreparedStatement","com.sun.star.sdbc.PreparedStatement"); OPreparedStatement::OPreparedStatement( OConnection* _pConnection, const OUString& sql) - : OStatement_Base( _pConnection ) + : OPreparedStatement_BASE(_pConnection) { osl_atomic_increment( &m_refCount ); @@ -92,24 +92,6 @@ OPreparedStatement::~OPreparedStatement() } } -Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) -{ - Any aRet = OStatement_Base::queryInterface(rType); - return aRet.hasValue() ? aRet : ::cppu::queryInterface( rType, - static_cast< XPreparedStatement*>(this), - static_cast< XParameters*>(this), - static_cast< XResultSetMetaDataSupplier*>(this)); -} - -css::uno::Sequence< css::uno::Type > SAL_CALL OPreparedStatement::getTypes( ) -{ - ::cppu::OTypeCollection aTypes( cppu::UnoType<XPreparedStatement>::get(), - cppu::UnoType<XParameters>::get(), - cppu::UnoType<XResultSetMetaDataSupplier>::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_Base::getTypes()); -} - Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData( ) { if(!m_xMetaData.is() && m_RecordSet.IsValid()) @@ -151,7 +133,7 @@ sal_Bool SAL_CALL OPreparedStatement::execute( ) try { ADORecordset* pSet=nullptr; CHECK_RETURN(m_Command.Execute(m_RecordsAffected,m_Parameters,adCmdUnknown,&pSet)) - m_RecordSet = WpADORecordset(pSet); + m_RecordSet.set(pSet); } catch (SQLWarning&) { @@ -171,11 +153,11 @@ sal_Int32 SAL_CALL OPreparedStatement::executeUpdate( ) CHECK_RETURN(m_Command.Execute(m_RecordsAffected,m_Parameters,adCmdUnknown,&pSet)) if ( VT_ERROR == m_RecordsAffected.getType() ) { - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); // to be sure that we get the error really thrown throw SQLException(); } - m_RecordSet = WpADORecordset(pSet); + m_RecordSet.set(pSet); return m_RecordsAffected.getInt32(); } @@ -199,10 +181,9 @@ void OPreparedStatement::setParameter(sal_Int32 parameterIndex, const DataTypeEn } else { - ADOParameter* pParam = nullptr; - m_pParameters->get_Item(OLEVariant(sal_Int32(parameterIndex-1)),&pParam); - WpADOParameter aParam(pParam); - if(pParam) + WpADOParameter aParam; + m_pParameters->get_Item(OLEVariant(sal_Int32(parameterIndex-1)),&aParam); + if(aParam) { DataTypeEnum eType = aParam.GetADOType(); if ( _eType != eType && _eType != adDBTimeStamp ) @@ -220,7 +201,7 @@ void OPreparedStatement::setParameter(sal_Int32 parameterIndex, const DataTypeEn CHECK_RETURN(aParam.PutValue(Val)); } } - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); } void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const OUString& x ) @@ -265,7 +246,7 @@ Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery( ) rtl::Reference<OResultSet> pSet = new OResultSet(m_RecordSet,this); pSet->construct(); pSet->setMetaData(getMetaData()); - m_xResultSet = WeakReference<XResultSet>(pSet); + m_xResultSet = pSet.get(); return pSet; } @@ -412,10 +393,9 @@ void SAL_CALL OPreparedStatement::clearParameters( ) aVal.setEmpty(); for(sal_Int32 i=0;i<nCount;++i) { - ADOParameter* pParam = nullptr; - m_pParameters->get_Item(OLEVariant(i),&pParam); - WpADOParameter aParam(pParam); - if(pParam) + WpADOParameter aParam; + m_pParameters->get_Item(OLEVariant(i),&aParam); + if(aParam) { CHECK_RETURN(aParam.PutValue(aVal)); } @@ -423,16 +403,6 @@ void SAL_CALL OPreparedStatement::clearParameters( ) } } -void SAL_CALL OPreparedStatement::acquire() noexcept -{ - OStatement_Base::acquire(); -} - -void SAL_CALL OPreparedStatement::release() noexcept -{ - OStatement_Base::release(); -} - void OPreparedStatement::replaceParameterNodeName(OSQLParseNode const * _pNode, const OUString& _sDefaultName, sal_Int32& _rParameterCount) @@ -444,7 +414,7 @@ void OPreparedStatement::replaceParameterNodeName(OSQLParseNode const * _pNode, if(SQL_ISRULE(pChildNode,parameter) && pChildNode->count() == 1) { OSQLParseNode* pNewNode = new OSQLParseNode(OUString(":") ,SQLNodeType::Punctuation,0); - delete pChildNode->replace(pChildNode->getChild(0),pNewNode); + pChildNode->replaceAndDelete(pChildNode->getChild(0), pNewNode); OUString sParameterName = _sDefaultName + OUString::number(++_rParameterCount); pChildNode->append(new OSQLParseNode( sParameterName,SQLNodeType::Name,0)); } diff --git a/connectivity/source/drivers/ado/AResultSet.cxx b/connectivity/source/drivers/ado/AResultSet.cxx index abae9087823e..ae1013c1c177 100644 --- a/connectivity/source/drivers/ado/AResultSet.cxx +++ b/connectivity/source/drivers/ado/AResultSet.cxx @@ -44,7 +44,7 @@ using namespace ::comphelper; #define CHECK_RETURN(x) \ if(!SUCCEEDED(x)) \ - ADOS::ThrowException(*m_pStmt->m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pStmt->m_pConnection->getConnection(),*this); using namespace connectivity::ado; using namespace com::sun::star::uno; @@ -132,14 +132,10 @@ Any SAL_CALL OResultSet::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL OResultSet::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType<css::beans::XMultiPropertySet>::get(), - cppu::UnoType<css::beans::XFastPropertySet>::get(), - cppu::UnoType<css::beans::XPropertySet>::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),OResultSet_BASE::getTypes()); + return comphelper::concatSequences(cppu::OPropertySetHelper::getTypes(), + OResultSet_BASE::getTypes()); } - sal_Int32 SAL_CALL OResultSet::findColumn( const OUString& columnName ) { ::osl::MutexGuard aGuard( m_aMutex ); @@ -157,9 +153,8 @@ sal_Int32 SAL_CALL OResultSet::findColumn( const OUString& columnName ) } ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); - return 0; // Never reached } + #define BLOCK_SIZE 256 Reference< css::io::XInputStream > SAL_CALL OResultSet::getBinaryStream( sal_Int32 columnIndex ) @@ -205,7 +200,6 @@ Reference< css::io::XInputStream > SAL_CALL OResultSet::getBinaryStream( sal_Int Reference< css::io::XInputStream > SAL_CALL OResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getCharacterStream", *this ); - return nullptr; } OLEVariant OResultSet::getValue(sal_Int32 columnIndex ) @@ -266,7 +260,7 @@ sal_Int32 SAL_CALL OResultSet::getRow( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - PositionEnum_Param aPos; + PositionEnum aPos; m_pRecordSet->get_AbsolutePosition(&aPos); return (aPos > 0) ? static_cast<sal_Int32>(aPos) : m_nRowPos; // return the rowcount from driver if the driver doesn't support this return our count @@ -276,7 +270,6 @@ sal_Int32 SAL_CALL OResultSet::getRow( ) sal_Int64 SAL_CALL OResultSet::getLong( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getLong", *this ); - return sal_Int64(0); } @@ -294,30 +287,23 @@ Reference< XResultSetMetaData > SAL_CALL OResultSet::getMetaData( ) Reference< XArray > SAL_CALL OResultSet::getArray( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getArray", *this ); - return nullptr; } - Reference< XClob > SAL_CALL OResultSet::getClob( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getClob", *this ); - return nullptr; } Reference< XBlob > SAL_CALL OResultSet::getBlob( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getBlob", *this ); - return nullptr; } - Reference< XRef > SAL_CALL OResultSet::getRef( sal_Int32 /*columnIndex*/ ) { ::dbtools::throwFeatureNotImplementedSQLException( "XRow::getRef", *this ); - return nullptr; } - Any SAL_CALL OResultSet::getObject( sal_Int32 columnIndex, const Reference< css::container::XNameAccess >& /*typeMap*/ ) { return getValue(columnIndex).makeAny(); @@ -596,7 +582,7 @@ sal_Bool SAL_CALL OResultSet::next( ) ++m_nRowPos; } else - ADOS::ThrowException(*m_pStmt->m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pStmt->m_pConnection->getConnection(),*this); } return bRet; @@ -818,12 +804,12 @@ Any SAL_CALL OResultSet::getBookmark( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); if(m_nRowPos < static_cast<sal_Int32>(m_aBookmarks.size())) // this bookmark was already fetched - return makeAny(sal_Int32(m_nRowPos-1)); + return Any(sal_Int32(m_nRowPos-1)); OLEVariant aVar; m_pRecordSet->get_Bookmark(&aVar); m_aBookmarks.push_back(aVar); - return makeAny(static_cast<sal_Int32>(m_aBookmarks.size()-1)); + return Any(static_cast<sal_Int32>(m_aBookmarks.size()-1)); } @@ -882,11 +868,9 @@ sal_Bool SAL_CALL OResultSet::hasOrderedBookmarks( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - ADOProperties* pProps = nullptr; - m_pRecordSet->get_Properties(&pProps); WpADOProperties aProps; - aProps.setWithOutAddRef(pProps); - ADOS::ThrowException(*static_cast<OConnection*>(m_pStmt->getConnection().get())->getConnection(),*this); + m_pRecordSet->get_Properties(&aProps); + ADOS::ThrowException(static_cast<OConnection*>(m_pStmt->getConnection().get())->getConnection(),*this); OSL_ENSURE(aProps.IsValid(),"There are no properties at the connection"); WpADOProperty aProp(aProps.GetItem(OUString("Bookmarks Ordered"))); @@ -894,7 +878,7 @@ sal_Bool SAL_CALL OResultSet::hasOrderedBookmarks( ) if(aProp.IsValid()) aVar = aProp.GetValue(); else - ADOS::ThrowException(*static_cast<OConnection*>(m_pStmt->getConnection().get())->getConnection(),*this); + ADOS::ThrowException(static_cast<OConnection*>(m_pStmt->getConnection().get())->getConnection(),*this); bool bValue(false); if(!aVar.isNull() && !aVar.isEmpty()) @@ -929,11 +913,9 @@ Sequence< sal_Int32 > SAL_CALL OResultSet::deleteRows( const Sequence< Any >& ro rgsabound[0].cElements = rows.getLength(); SAFEARRAY *psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); - const Any* pBegin = rows.getConstArray(); - const Any* pEnd = pBegin + rows.getLength(); - for(sal_Int32 i=0;pBegin != pEnd ;++pBegin,++i) + for (sal_Int32 i = 0; i < rows.getLength(); ++i) { - *pBegin >>= nPos; + rows[i] >>= nPos; SafeArrayPutElement(psa,&i,&m_aBookmarks[nPos]); } @@ -1035,26 +1017,31 @@ void OResultSet::setFetchSize(sal_Int32 _par0) ::cppu::IPropertyArrayHelper* OResultSet::createArrayHelper( ) const { - Sequence< css::beans::Property > aProps(5); - css::beans::Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), - PROPERTY_ID_ISBOOKMARKABLE, cppu::UnoType<bool>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), + PROPERTY_ID_ISBOOKMARKABLE, cppu::UnoType<bool>::get(), PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY + } + } + }; } ::cppu::IPropertyArrayHelper & OResultSet::getInfoHelper() diff --git a/connectivity/source/drivers/ado/AResultSetMetaData.cxx b/connectivity/source/drivers/ado/AResultSetMetaData.cxx index e64c1c45b6e9..d43ee5da9216 100644 --- a/connectivity/source/drivers/ado/AResultSetMetaData.cxx +++ b/connectivity/source/drivers/ado/AResultSetMetaData.cxx @@ -72,10 +72,9 @@ sal_Int32 SAL_CALL OResultSetMetaData::getColumnCount( ) if ( !m_pRecordSet ) return 0; - ADOFields* pFields = nullptr; + WpOLEAppendCollection<ADOFields, WpADOField> pFields; m_pRecordSet->get_Fields(&pFields); - WpOLEAppendCollection<ADOFields, ADOField, WpADOField> aFields(pFields); - m_nColCount = aFields.GetItemCount(); + m_nColCount = pFields.GetItemCount(); return m_nColCount; } diff --git a/connectivity/source/drivers/ado/AStatement.cxx b/connectivity/source/drivers/ado/AStatement.cxx index 9670d92292bd..0764a4b335a5 100644 --- a/connectivity/source/drivers/ado/AStatement.cxx +++ b/connectivity/source/drivers/ado/AStatement.cxx @@ -41,7 +41,7 @@ using namespace ::comphelper; #define CHECK_RETURN(x) \ if(!x) \ - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); using namespace connectivity::ado; @@ -51,7 +51,6 @@ using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -using namespace ::std; OStatement_Base::OStatement_Base(OConnection* _pConnection ) : OStatement_BASE(m_aMutex) ,OPropertySetHelper(OStatement_BASE::rBHelper) @@ -67,7 +66,7 @@ OStatement_Base::OStatement_Base(OConnection* _pConnection ) : OStatement_BASE( if(m_Command.IsValid()) m_Command.putref_ActiveConnection(m_pConnection->getConnection()); else - ADOS::ThrowException(*m_pConnection->getConnection(),*this); + ADOS::ThrowException(m_pConnection->getConnection(),*this); m_RecordsAffected.setNoArg(); m_Parameters.setNoArg(); @@ -80,7 +79,7 @@ OStatement_Base::OStatement_Base(OConnection* _pConnection ) : OStatement_BASE( void OStatement_Base::disposeResultSet() { // free the cursor if alive - Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OResultSet > xComp = m_xResultSet.get(); if (xComp.is()) xComp->dispose(); m_xResultSet.clear(); @@ -95,7 +94,7 @@ void OStatement_Base::disposing() disposeResultSet(); if ( m_Command.IsValid() ) - m_Command.putref_ActiveConnection( nullptr ); + m_Command.putref_ActiveConnection({}); m_Command.clear(); if ( m_RecordSet.IsValid() ) @@ -121,11 +120,8 @@ Any SAL_CALL OStatement_Base::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL OStatement_Base::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType<css::beans::XMultiPropertySet>::get(), - cppu::UnoType<css::beans::XFastPropertySet>::get(), - cppu::UnoType<css::beans::XPropertySet>::get()); - - return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes()); + return comphelper::concatSequences(cppu::OPropertySetHelper::getTypes(), + OStatement_BASE::getTypes()); } @@ -179,8 +175,7 @@ void OStatement_Base::clearMyResultSet () try { - Reference<XCloseable> xCloseable( - m_xResultSet.get(), css::uno::UNO_QUERY); + rtl::Reference<OResultSet> xCloseable = m_xResultSet.get(); if ( xCloseable.is() ) xCloseable->close(); } @@ -240,7 +235,7 @@ void OStatement_Base::setWarning (const SQLWarning &ex) void OStatement_Base::assignRecordSet( ADORecordset* _pRS ) { WpADORecordset aOldRS( m_RecordSet ); - m_RecordSet = WpADORecordset( _pRS ); + m_RecordSet.set( _pRS ); if ( aOldRS.IsValid() ) aOldRS.PutRefDataSource( nullptr ); @@ -287,7 +282,7 @@ Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery( const OUString& reset(); - m_xResultSet = WeakReference<XResultSet>(nullptr); + m_xResultSet.clear(); WpADORecordset aSet; aSet.Create(); @@ -309,7 +304,7 @@ Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery( const OUString& rtl::Reference<OResultSet> pSet = new OResultSet(aSet,this); pSet->construct(); - m_xResultSet = WeakReference<XResultSet>(pSet); + m_xResultSet = pSet.get(); return pSet; } @@ -376,7 +371,7 @@ Sequence< sal_Int32 > SAL_CALL OStatement::executeBatch( ) { assignRecordSet( pSet ); - ADO_LONGPTR nValue; + long nValue; if(m_RecordSet.get_RecordCount(nValue)) pArray[j] = nValue; } @@ -418,7 +413,7 @@ Reference< XResultSet > SAL_CALL OStatement_Base::getResultSet( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); - return m_xResultSet; + return m_xResultSet.get(); } @@ -428,7 +423,7 @@ sal_Int32 SAL_CALL OStatement_Base::getUpdateCount( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); - ADO_LONGPTR nRet; + long nRet; if(m_RecordSet.IsValid() && m_RecordSet.get_RecordCount(nRet)) return nRet; return -1; @@ -470,7 +465,7 @@ Any SAL_CALL OStatement_Base::getWarnings( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); - return makeAny(m_aLastWarning); + return Any(m_aLastWarning); } @@ -491,7 +486,7 @@ sal_Int32 OStatement_Base::getQueryTimeOut() const sal_Int32 OStatement_Base::getMaxRows() const { - ADO_LONGPTR nRet=-1; + long nRet = -1; if(!(m_RecordSet.IsValid() && m_RecordSet.get_MaxRecords(nRet))) ::dbtools::throwFunctionSequenceException(nullptr); return nRet; @@ -641,31 +636,71 @@ void OStatement_Base::setCursorName(std::u16string_view _par0) ::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const { - Sequence< css::beans::Property > aProps(10); - css::beans::Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), - PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), - PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), - PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), - PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), - PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), + PROPERTY_ID_ESCAPEPROCESSING, + cppu::UnoType<bool>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), + PROPERTY_ID_MAXFIELDSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), + PROPERTY_ID_MAXROWS, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), + PROPERTY_ID_QUERYTIMEOUT, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), + PROPERTY_ID_USEBOOKMARKS, + cppu::UnoType<bool>::get(), + 0 + } + } + }; } diff --git a/connectivity/source/drivers/ado/ATable.cxx b/connectivity/source/drivers/ado/ATable.cxx index 1ade9a649b77..47e22e125398 100644 --- a/connectivity/source/drivers/ado/ATable.cxx +++ b/connectivity/source/drivers/ado/ATable.cxx @@ -54,7 +54,7 @@ OAdoTable::OAdoTable(sdbcx::OCollection* _pTables,bool _bCase,OCatalog* _pCatalo ,m_pCatalog(_pCatalog) { construct(); - m_aTable = WpADOTable(_pTable); + m_aTable.set(_pTable); // m_aTable.putref_ParentCatalog(_pCatalog->getCatalog()); fillPropertyValues(); @@ -127,20 +127,6 @@ void OAdoTable::refreshIndexes() m_xIndexes.reset(new OIndexes(*this,m_aMutex,aVector,aIndexes,isCaseSensitive(),m_pCatalog->getConnection())); } -Sequence< sal_Int8 > OAdoTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoTable::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OTable_TYPEDEF>{}); -} - // XRename void SAL_CALL OAdoTable::rename( const OUString& newName ) { @@ -148,7 +134,7 @@ void SAL_CALL OAdoTable::rename( const OUString& newName ) checkDisposed(OTableDescriptor_BASE_TYPEDEF::rBHelper.bDisposed); m_aTable.put_Name(newName); - ADOS::ThrowException(*(m_pCatalog->getConnection()->getConnection()),*this); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),*this); OTable_TYPEDEF::rename(newName); } @@ -165,7 +151,7 @@ void SAL_CALL OAdoTable::alterColumnByName( const OUString& colName, const Refer checkDisposed(OTableDescriptor_BASE_TYPEDEF::rBHelper.bDisposed); bool bError = true; - OAdoColumn* pColumn = comphelper::getFromUnoTunnel<OAdoColumn>(descriptor); + OAdoColumn* pColumn = dynamic_cast<OAdoColumn*>(descriptor.get()); if(pColumn != nullptr) { WpADOColumns aColumns = m_aTable.get_Columns(); @@ -173,7 +159,7 @@ void SAL_CALL OAdoTable::alterColumnByName( const OUString& colName, const Refer bError = bError || !aColumns.Append(pColumn->getColumnImpl()); } if(bError) - ADOS::ThrowException(*(m_pCatalog->getConnection()->getConnection()),*this); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),*this); m_xColumns->refresh(); refreshColumns(); diff --git a/connectivity/source/drivers/ado/ATables.cxx b/connectivity/source/drivers/ado/ATables.cxx index 61a057344ff1..48a82ceee2d5 100644 --- a/connectivity/source/drivers/ado/ATables.cxx +++ b/connectivity/source/drivers/ado/ATables.cxx @@ -44,7 +44,7 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; -sdbcx::ObjectType OTables::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OTables::createObject(const OUString& _rName) { OSL_ENSURE(m_aCollection.IsValid(),"Collection isn't valid"); return new OAdoTable(this,isCaseSensitive(),m_pCatalog,m_aCollection.GetItem(_rName)); @@ -63,15 +63,15 @@ Reference< XPropertySet > OTables::createDescriptor() } // XAppend -sdbcx::ObjectType OTables::appendObject( const OUString&, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OTables::appendObject( const OUString&, const Reference< XPropertySet >& descriptor ) { - OAdoTable* pTable = getFromUnoTunnel<OAdoTable>( descriptor ); + OAdoTable* pTable = dynamic_cast<OAdoTable*>( descriptor.get() ); if ( pTable == nullptr ) m_pCatalog->getConnection()->throwGenericSQLException( STR_INVALID_TABLE_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); OSL_ENSURE(m_aCollection.IsValid(),"Collection isn't valid"); if(!m_aCollection.Append(pTable->getImpl())) - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); m_aCollection.Refresh(); return new OAdoTable(this,isCaseSensitive(),m_pCatalog,pTable->getImpl()); @@ -82,7 +82,7 @@ void OTables::dropObject(sal_Int32 /*_nPos*/,const OUString& _sElementName) { OSL_ENSURE(m_aCollection.IsValid(),"Collection isn't valid"); if ( !m_aCollection.Delete(_sElementName) ) - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); } void OTables::appendNew(const OUString& _rsNewTable) @@ -93,7 +93,7 @@ void OTables::appendNew(const OUString& _rsNewTable) insertElement(_rsNewTable,nullptr); // notify our container listeners - ContainerEvent aEvent(static_cast<XContainer*>(this), makeAny(_rsNewTable), Any(), Any()); + ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_rsNewTable), Any(), Any()); OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners); while (aListenerLoop.hasMoreElements()) aListenerLoop.next()->elementInserted(aEvent); diff --git a/connectivity/source/drivers/ado/AUser.cxx b/connectivity/source/drivers/ado/AUser.cxx index 09585ed81e44..eb7a5803f60c 100644 --- a/connectivity/source/drivers/ado/AUser.cxx +++ b/connectivity/source/drivers/ado/AUser.cxx @@ -40,7 +40,7 @@ OAdoUser::OAdoUser(OCatalog* _pParent,bool _bCase, ADOUser* _pUser) construct(); if(_pUser) - m_aUser = WpADOUser(_pUser); + m_aUser.set(_pUser); else m_aUser.Create(); } @@ -65,21 +65,6 @@ void OAdoUser::refreshGroups() m_pGroups.reset(new OGroups(m_pCatalog, m_aMutex, aVector, aGroups, isCaseSensitive())); } -Sequence< sal_Int8 > OAdoUser::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoUser::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OUser_TYPEDEF>{}); -} - - void OAdoUser::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) { if(m_aUser.IsValid()) @@ -157,7 +142,7 @@ sal_Int32 SAL_CALL OAdoUser::getGrantablePrivileges( const OUString& objName, sa RightsEnum eRights = m_aUser.GetPermissions(objName, ADOS::mapObjectType2Ado(objType)); if((eRights & adRightWithGrant) == adRightWithGrant) nRights = ADOS::mapAdoRights2Sdbc(eRights); - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),*this); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),*this); return nRights; } @@ -166,7 +151,7 @@ void SAL_CALL OAdoUser::grantPrivileges( const OUString& objName, sal_Int32 objT ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(OUser_BASE_TYPEDEF::rBHelper.bDisposed); m_aUser.SetPermissions(objName,ADOS::mapObjectType2Ado(objType),adAccessGrant,RightsEnum(ADOS::mapRights2Ado(objPrivileges))); - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),*this); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),*this); } void SAL_CALL OAdoUser::revokePrivileges( const OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) @@ -174,7 +159,7 @@ void SAL_CALL OAdoUser::revokePrivileges( const OUString& objName, sal_Int32 obj ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(OUser_BASE_TYPEDEF::rBHelper.bDisposed); m_aUser.SetPermissions(objName,ADOS::mapObjectType2Ado(objType),adAccessRevoke,RightsEnum(ADOS::mapRights2Ado(objPrivileges))); - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),*this); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),*this); } // XUser @@ -183,7 +168,7 @@ void SAL_CALL OAdoUser::changePassword( const OUString& objPassword, const OUStr ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(OUser_BASE_TYPEDEF::rBHelper.bDisposed); m_aUser.ChangePassword(objPassword,newPassword); - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),*this); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),*this); } diff --git a/connectivity/source/drivers/ado/AUsers.cxx b/connectivity/source/drivers/ado/AUsers.cxx index 9d0dab6e8d4c..ce45af21732c 100644 --- a/connectivity/source/drivers/ado/AUsers.cxx +++ b/connectivity/source/drivers/ado/AUsers.cxx @@ -27,6 +27,7 @@ #include <comphelper/servicehelper.hxx> #include <comphelper/types.hxx> #include <connectivity/dbexception.hxx> +#include <systools/win32/oleauto.hxx> #include <strings.hrc> using namespace comphelper; @@ -38,7 +39,7 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; -sdbcx::ObjectType OUsers::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OUsers::createObject(const OUString& _rName) { return new OAdoUser(m_pCatalog,isCaseSensitive(),_rName); } @@ -54,14 +55,14 @@ Reference< XPropertySet > OUsers::createDescriptor() } // XAppend -sdbcx::ObjectType OUsers::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OUsers::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { - OUserExtend* pUser = getFromUnoTunnel<OUserExtend>( descriptor ); + OUserExtend* pUser = dynamic_cast<OUserExtend*>( descriptor.get() ); if ( pUser == nullptr ) m_pCatalog->getConnection()->throwGenericSQLException( STR_INVALID_USER_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); ADOUsers* pUsers = m_aCollection; - pUsers->Append(OLEVariant(pUser->getImpl()),OLEString(pUser->getPassword()).asBSTR()); + pUsers->Append(OLEVariant(pUser->getImpl()), sal::systools::BStr(pUser->getPassword())); return createObject( _rForName ); } diff --git a/connectivity/source/drivers/ado/AView.cxx b/connectivity/source/drivers/ado/AView.cxx index 15f6a5cc9a6d..10a5524db95b 100644 --- a/connectivity/source/drivers/ado/AView.cxx +++ b/connectivity/source/drivers/ado/AView.cxx @@ -23,6 +23,8 @@ #include <ado/Awrapado.hxx> #include <comphelper/servicehelper.hxx> #include <comphelper/types.hxx> +#include <systools/win32/oleauto.hxx> + #include <TConnection.hxx> @@ -40,21 +42,6 @@ OAdoView::OAdoView(bool _bCase,ADOView* _pView) : OView_ADO(_bCase,nullptr) { } -Sequence< sal_Int8 > OAdoView::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OAdoView::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OView_ADO>{}); -} - - void OAdoView::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const { if(m_aView.IsValid()) @@ -76,9 +63,9 @@ void OAdoView::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const if(!aVar.isNull() && !aVar.isEmpty()) { ADOCommand* pCom = static_cast<ADOCommand*>(aVar.getIDispatch()); - OLEString aBSTR; - pCom->get_CommandText(aBSTR.getAddress()); - rValue <<= aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pCom->get_CommandText(&aBSTR); + rValue <<= OUString(aBSTR); } } break; diff --git a/connectivity/source/drivers/ado/AViews.cxx b/connectivity/source/drivers/ado/AViews.cxx index 22fe40142d25..536b95309bb2 100644 --- a/connectivity/source/drivers/ado/AViews.cxx +++ b/connectivity/source/drivers/ado/AViews.cxx @@ -28,6 +28,8 @@ #include <comphelper/types.hxx> #include <connectivity/dbexception.hxx> #include <rtl/ref.hxx> +#include <systools/win32/oleauto.hxx> + #include <strings.hrc> using namespace ::comphelper; @@ -40,7 +42,7 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; -sdbcx::ObjectType OViews::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OViews::createObject(const OUString& _rName) { rtl::Reference<OAdoView> pView = new OAdoView(isCaseSensitive(),m_aCollection.GetItem(_rName)); pView->setNew(false); @@ -59,9 +61,9 @@ Reference< XPropertySet > OViews::createDescriptor() // XAppend -sdbcx::ObjectType OViews::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OViews::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { - OAdoView* pView = getFromUnoTunnel<OAdoView>( descriptor ); + OAdoView* pView = dynamic_cast<OAdoView*>( descriptor.get() ); if ( pView == nullptr ) m_pCatalog->getConnection()->throwGenericSQLException( STR_INVALID_VIEW_DESCRIPTOR_ERROR,static_cast<XTypeProvider*>(this) ); @@ -74,8 +76,8 @@ sdbcx::ObjectType OViews::appendObject( const OUString& _rForName, const Referen aCommand.put_Name(sName); aCommand.put_CommandText(getString(descriptor->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_COMMAND)))); ADOViews* pViews = m_aCollection; - if(FAILED(pViews->Append(OLEString(sName).asBSTR(),aCommand))) - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); + if (FAILED(pViews->Append(sal::systools::BStr(sName), aCommand))) + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); OTables* pTables = static_cast<OTables*>(static_cast<OCatalog&>(m_rParent).getPrivateTables()); if ( pTables ) @@ -88,7 +90,7 @@ sdbcx::ObjectType OViews::appendObject( const OUString& _rForName, const Referen void OViews::dropObject(sal_Int32 /*_nPos*/,const OUString& _sElementName) { if(!m_aCollection.Delete(_sElementName)) - ADOS::ThrowException(*m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); + ADOS::ThrowException(m_pCatalog->getConnection()->getConnection(),static_cast<XTypeProvider*>(this)); } diff --git a/connectivity/source/drivers/ado/Aolevariant.cxx b/connectivity/source/drivers/ado/Aolevariant.cxx index 8b6ad10b4662..75591468be36 100644 --- a/connectivity/source/drivers/ado/Aolevariant.cxx +++ b/connectivity/source/drivers/ado/Aolevariant.cxx @@ -37,64 +37,6 @@ using namespace com::sun::star::uno; using namespace com::sun::star::bridge::oleautomation; using namespace connectivity::ado; -OLEString::OLEString() - :m_sStr(nullptr) -{ -} -OLEString::OLEString(const BSTR& _sBStr) - :m_sStr(_sBStr) -{ -} -OLEString::OLEString(std::u16string_view _sBStr) -{ - m_sStr = SysAllocStringLen(o3tl::toW(_sBStr.data()), _sBStr.length()); -} -OLEString::~OLEString() -{ - if(m_sStr) - ::SysFreeString(m_sStr); -} -OLEString& OLEString::operator=(std::u16string_view _rSrc) -{ - if(m_sStr) - ::SysFreeString(m_sStr); - m_sStr = SysAllocStringLen(o3tl::toW(_rSrc.data()), _rSrc.length()); - return *this; -} -OLEString& OLEString::operator=(const OLEString& _rSrc) -{ - if(this != &_rSrc) - { - if(m_sStr) - ::SysFreeString(m_sStr); - m_sStr = ::SysAllocString(_rSrc.m_sStr); - } - return *this; -} -OLEString& OLEString::operator=(const BSTR& _rSrc) -{ - if(m_sStr) - ::SysFreeString(m_sStr); - m_sStr = _rSrc; - return *this; -} -OUString OLEString::asOUString() const -{ - return (m_sStr != nullptr) ? OUString(o3tl::toU(m_sStr),::SysStringLen(m_sStr)) : OUString(); -} -BSTR OLEString::asBSTR() const -{ - return m_sStr; -} -BSTR* OLEString::getAddress() -{ - return &m_sStr; -} -sal_Int32 OLEString::length() const -{ - return (m_sStr != nullptr) ? ::SysStringLen(m_sStr) : 0; -} - OLEVariant::OLEVariant() { VariantInit(this); @@ -175,12 +117,10 @@ OLEVariant::OLEVariant(const css::uno::Sequence< sal_Int8 >& x) vt = VT_ARRAY|VT_UI1; parray = SafeArrayCreateVector(VT_UI1, 0, x.getLength()); - const sal_Int8* pBegin = x.getConstArray(); - const sal_Int8* pEnd = pBegin + x.getLength(); - for(sal_Int32 i=0;pBegin != pEnd;++i,++pBegin) + for (sal_Int32 i = 0; i < x.getLength(); ++i) { - sal_Int32 nData = *pBegin; + sal_Int32 nData = x[i]; HRESULT rs = SafeArrayPutElement(parray,&i,&nData); OSL_ENSURE(S_OK == rs,"Error while copy byte data"); } @@ -427,8 +367,8 @@ css::uno::Sequence< sal_Int8 > OLEVariant::getByteSequence() const css::uno::Sequence< sal_Int8 > aRet; if(V_VT(this) == VT_BSTR) { - OLEString sStr(V_BSTR(this)); - aRet = css::uno::Sequence<sal_Int8>(reinterpret_cast<const sal_Int8*>(sStr.asBSTR()),sizeof(sal_Unicode)*sStr.length()); + aRet = css::uno::Sequence<sal_Int8>(reinterpret_cast<sal_Int8*>(V_BSTR(this)), + ::SysStringByteLen(V_BSTR(this))); } else if(!isNull()) { diff --git a/connectivity/source/drivers/ado/Awrapado.cxx b/connectivity/source/drivers/ado/Awrapado.cxx index 6f4dd5ce1c20..74abd185353f 100644 --- a/connectivity/source/drivers/ado/Awrapado.cxx +++ b/connectivity/source/drivers/ado/Awrapado.cxx @@ -21,50 +21,38 @@ #include <ado/Awrapado.hxx> #include <ado/Awrapadox.hxx> #include <comphelper/types.hxx> +#include <o3tl/string_view.hxx> #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> +#include <systools/win32/oleauto.hxx> using namespace connectivity::ado; void WpADOCatalog::Create() { - _ADOCatalog* pCommand; - HRESULT hr = CoCreateInstance(ADOS::CLSID_ADOCATALOG_25, - nullptr, - CLSCTX_INPROC_SERVER, - ADOS::IID_ADOCATALOG_25, - reinterpret_cast<void**>(&pCommand) ); - - - if( !FAILED( hr ) ) - setWithOutAddRef(pCommand); + pInterface.CoCreateInstance(ADOS::CLSID_ADOCATALOG_25, nullptr, CLSCTX_INPROC_SERVER); } WpADOProperties WpADOConnection::get_Properties() const { - ADOProperties* pProps=nullptr; + WpADOProperties pProps; pInterface->get_Properties(&pProps); - WpADOProperties aProps; - aProps.setWithOutAddRef(pProps); - return aProps; + return pProps; } OUString WpADOConnection::GetConnectionString() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_ConnectionString(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_ConnectionString(&aBSTR); + return OUString(aBSTR); } bool WpADOConnection::PutConnectionString(std::u16string_view aCon) const { assert(pInterface); - OLEString bstr(aCon); - bool bErg = SUCCEEDED(pInterface->put_ConnectionString(bstr.asBSTR())); - - return bErg; + return SUCCEEDED(pInterface->put_ConnectionString(sal::systools::BStr(aCon))); } sal_Int32 WpADOConnection::GetCommandTimeout() const @@ -104,9 +92,8 @@ bool WpADOConnection::Close() bool WpADOConnection::Execute(std::u16string_view CommandText,OLEVariant& RecordsAffected,long Options, WpADORecordset** ppiRset) { assert(pInterface); - OLEString sStr1(CommandText); - bool bErg = SUCCEEDED(pInterface->Execute(sStr1.asBSTR(),&RecordsAffected,Options,reinterpret_cast<ADORecordset**>(ppiRset))); - return bErg; + return SUCCEEDED(pInterface->Execute(sal::systools::BStr(CommandText), &RecordsAffected, + Options, reinterpret_cast<ADORecordset**>(ppiRset))); } bool WpADOConnection::BeginTrans() @@ -131,11 +118,9 @@ bool WpADOConnection::RollbackTrans( ) bool WpADOConnection::Open(std::u16string_view ConnectionString, std::u16string_view UserID,std::u16string_view Password,long Options) { assert(pInterface); - OLEString sStr1(ConnectionString); - OLEString sStr2(UserID); - OLEString sStr3(Password); - bool bErg = SUCCEEDED(pInterface->Open(sStr1.asBSTR(),sStr2.asBSTR(),sStr3.asBSTR(),Options)); - return bErg; + return SUCCEEDED(pInterface->Open(sal::systools::BStr(ConnectionString), + sal::systools::BStr(UserID), sal::systools::BStr(Password), + Options)); } bool WpADOConnection::GetErrors(ADOErrors** pErrors) @@ -147,17 +132,14 @@ bool WpADOConnection::GetErrors(ADOErrors** pErrors) OUString WpADOConnection::GetDefaultDatabase() const { assert(pInterface); - OLEString aBSTR; pInterface->get_DefaultDatabase(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; pInterface->get_DefaultDatabase(&aBSTR); + return OUString(aBSTR); } bool WpADOConnection::PutDefaultDatabase(std::u16string_view _bstr) { assert(pInterface); - OLEString bstr(_bstr); - bool bErg = SUCCEEDED(pInterface->put_DefaultDatabase(bstr.asBSTR())); - - return bErg; + return SUCCEEDED(pInterface->put_DefaultDatabase(sal::systools::BStr(_bstr))); } IsolationLevelEnum WpADOConnection::get_IsolationLevel() const @@ -219,15 +201,14 @@ bool WpADOConnection::put_Mode(const ConnectModeEnum &eNum) OUString WpADOConnection::get_Provider() const { assert(pInterface); - OLEString aBSTR; pInterface->get_Provider(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; pInterface->get_Provider(&aBSTR); + return OUString(aBSTR); } bool WpADOConnection::put_Provider(std::u16string_view _bstr) { assert(pInterface); - OLEString bstr(_bstr); - return SUCCEEDED(pInterface->put_Provider(bstr.asBSTR())); + return SUCCEEDED(pInterface->put_Provider(sal::systools::BStr(_bstr))); } sal_Int32 WpADOConnection::get_State() const @@ -247,18 +228,15 @@ bool WpADOConnection::OpenSchema(SchemaEnum eNum,OLEVariant const & Restrictions OUString WpADOConnection::get_Version() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Version(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Version(&aBSTR); + return OUString(aBSTR); } -bool WpADOCommand::putref_ActiveConnection( WpADOConnection *pCon) +bool WpADOCommand::putref_ActiveConnection(const WpADOConnection& rCon) { assert(pInterface); - if(pCon) - return SUCCEEDED(pInterface->putref_ActiveConnection(pCon->pInterface)); - else - return SUCCEEDED(pInterface->putref_ActiveConnection(nullptr)); + return SUCCEEDED(pInterface->putref_ActiveConnection(rCon)); } void WpADOCommand::put_ActiveConnection(/* [in] */ const OLEVariant& vConn) @@ -269,31 +247,19 @@ void WpADOCommand::put_ActiveConnection(/* [in] */ const OLEVariant& vConn) void WpADOCommand::Create() { - IClassFactory2* pInterface2 = nullptr; - HRESULT hr = CoGetClassObject( ADOS::CLSID_ADOCOMMAND_21, - CLSCTX_INPROC_SERVER, - nullptr, - IID_IClassFactory2, - reinterpret_cast<void**>(&pInterface2) ); - - if( !FAILED( hr ) ) + sal::systools::COMReference<IClassFactory2> pInterface2; + if (!FAILED(pInterface2.CoGetClassObject(ADOS::CLSID_ADOCOMMAND_21, CLSCTX_INPROC_SERVER))) { - ADOCommand* pCommand=nullptr; - IUnknown* pOuter=nullptr; + sal::systools::COMReference<ADOCommand> pCommand; - hr = pInterface2->CreateInstanceLic( pOuter, + HRESULT hr = pInterface2->CreateInstanceLic(nullptr, nullptr, ADOS::IID_ADOCOMMAND_21, - ADOS::GetKeyStr().asBSTR(), + ADOS::GetKeyStr(), reinterpret_cast<void**>(&pCommand)); if( !FAILED( hr ) ) - { - operator=(pCommand); - pCommand->Release(); - } - - pInterface2->Release(); + pInterface = std::move(pCommand); } } @@ -308,18 +274,15 @@ sal_Int32 WpADOCommand::get_State() const OUString WpADOCommand::get_CommandText() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_CommandText(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_CommandText(&aBSTR); + return OUString(aBSTR); } bool WpADOCommand::put_CommandText(std::u16string_view aCon) { assert(pInterface); - OLEString bstr(aCon); - bool bErg = SUCCEEDED(pInterface->put_CommandText(bstr.asBSTR())); - - return bErg; + return SUCCEEDED(pInterface->put_CommandText(sal::systools::BStr(aCon))); } sal_Int32 WpADOCommand::get_CommandTimeout() const @@ -360,8 +323,8 @@ ADOParameter* WpADOCommand::CreateParameter(std::u16string_view _bstr,DataTypeEn { assert(pInterface); ADOParameter* pPara = nullptr; - OLEString bstr(_bstr); - bool bErg = SUCCEEDED(pInterface->CreateParameter(bstr.asBSTR(),Type,Direction,nSize,Value,&pPara)); + bool bErg = SUCCEEDED(pInterface->CreateParameter(sal::systools::BStr(_bstr), Type, Direction, + nSize, Value, &pPara)); return bErg ? pPara : nullptr; } @@ -392,18 +355,15 @@ CommandTypeEnum WpADOCommand::get_CommandType() const OUString WpADOCommand::GetName() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } bool WpADOCommand::put_Name(std::u16string_view Name) { assert(pInterface); - OLEString bstr(Name); - bool bErg = SUCCEEDED(pInterface->put_Name(bstr.asBSTR())); - - return bErg; + return SUCCEEDED(pInterface->put_Name(sal::systools::BStr(Name))); } bool WpADOCommand::Cancel() { @@ -414,17 +374,17 @@ bool WpADOCommand::Cancel() OUString WpADOError::GetDescription() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Description(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Description(&aBSTR); + return OUString(aBSTR); } OUString WpADOError::GetSource() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Source(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Source(&aBSTR); + return OUString(aBSTR); } sal_Int32 WpADOError::GetNumber() const @@ -438,9 +398,9 @@ sal_Int32 WpADOError::GetNumber() const OUString WpADOError::GetSQLState() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_SQLState(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_SQLState(&aBSTR); + return OUString(aBSTR); } sal_Int32 WpADOError::GetNativeError() const @@ -454,18 +414,15 @@ sal_Int32 WpADOError::GetNativeError() const WpADOProperties WpADOField::get_Properties() { assert(pInterface); - ADOProperties* pProps = nullptr; + WpADOProperties pProps; pInterface->get_Properties(&pProps); - WpADOProperties aProps; - - aProps.setWithOutAddRef(pProps); - return aProps; + return pProps; } sal_Int32 WpADOField::GetActualSize() const { assert(pInterface); - ADO_LONGPTR nActualSize=0; + long nActualSize = 0; pInterface->get_ActualSize(&nActualSize); return nActualSize; } @@ -488,7 +445,7 @@ sal_Int32 WpADOField::GetStatus() const sal_Int32 WpADOField::GetDefinedSize() const { assert(pInterface); - ADO_LONGPTR nDefinedSize=0; + long nDefinedSize = 0; pInterface->get_DefinedSize(&nDefinedSize); return nDefinedSize; } @@ -497,9 +454,9 @@ sal_Int32 WpADOField::GetDefinedSize() const OUString WpADOField::GetName() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } DataTypeEnum WpADOField::GetADOType() const @@ -649,9 +606,9 @@ bool WpADOProperty::PutValue(const OLEVariant &aValVar) OUString WpADOProperty::GetName() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } DataTypeEnum WpADOProperty::GetADOType() const @@ -677,30 +634,18 @@ bool WpADOProperty::PutAttributes(sal_Int32 _nDefSize) } void WpADORecordset::Create() { - IClassFactory2* pInterface2 = nullptr; - HRESULT hr = CoGetClassObject( ADOS::CLSID_ADORECORDSET_21, - CLSCTX_INPROC_SERVER, - nullptr, - IID_IClassFactory2, - reinterpret_cast<void**>(&pInterface2) ); - - if( !FAILED( hr ) ) + sal::systools::COMReference<IClassFactory2> pInterface2; + if (!FAILED(pInterface2.CoGetClassObject(ADOS::CLSID_ADORECORDSET_21, CLSCTX_INPROC_SERVER))) { - ADORecordset *pRec = nullptr; - IUnknown *pOuter = nullptr; - hr = pInterface2->CreateInstanceLic( pOuter, + sal::systools::COMReference<ADORecordset> pRec; + HRESULT hr = pInterface2->CreateInstanceLic(nullptr, nullptr, ADOS::IID_ADORECORDSET_21, - ADOS::GetKeyStr().asBSTR(), + ADOS::GetKeyStr(), reinterpret_cast<void**>(&pRec)); if( !FAILED( hr ) ) - { - operator=(pRec); - pRec->Release(); - } - - pInterface2->Release(); + pInterface = std::move(pRec); } } @@ -752,10 +697,10 @@ bool WpADORecordset::Supports( /* [in] */ CursorOptionEnum CursorOptions) return bSupports == VARIANT_TRUE; } -PositionEnum_Param WpADORecordset::get_AbsolutePosition() +PositionEnum WpADORecordset::get_AbsolutePosition() { assert(pInterface); - PositionEnum_Param aTemp=adPosUnknown; + PositionEnum aTemp = adPosUnknown; pInterface->get_AbsolutePosition(&aTemp); return aTemp; } @@ -804,11 +749,9 @@ bool WpADORecordset::SetBookmark(const OLEVariant &pSafeAr) WpADOFields WpADORecordset::GetFields() const { assert(pInterface); - ADOFields* pFields=nullptr; + WpADOFields pFields; pInterface->get_Fields(&pFields); - WpADOFields aFields; - aFields.setWithOutAddRef(pFields); - return aFields; + return pFields; } @@ -861,11 +804,9 @@ bool WpADORecordset::CancelUpdate() WpADOProperties WpADORecordset::get_Properties() const { assert(pInterface); - ADOProperties* pProps=nullptr; + WpADOProperties pProps; pInterface->get_Properties(&pProps); - WpADOProperties aProps; - aProps.setWithOutAddRef(pProps); - return aProps; + return pProps; } bool WpADORecordset::NextRecordset(OLEVariant& RecordsAffected,ADORecordset** ppiRset) @@ -874,13 +815,13 @@ bool WpADORecordset::NextRecordset(OLEVariant& RecordsAffected,ADORecordset** pp return SUCCEEDED(pInterface->NextRecordset(&RecordsAffected,ppiRset)); } -bool WpADORecordset::get_RecordCount(ADO_LONGPTR &_nRet) const +bool WpADORecordset::get_RecordCount(long& _nRet) const { assert(pInterface); return SUCCEEDED(pInterface->get_RecordCount(&_nRet)); } -bool WpADORecordset::get_MaxRecords(ADO_LONGPTR &_nRet) const +bool WpADORecordset::get_MaxRecords(long& _nRet) const { assert(pInterface); return SUCCEEDED(pInterface->get_MaxRecords(&_nRet)); @@ -937,9 +878,9 @@ bool WpADORecordset::UpdateBatch(AffectEnum AffectRecords) OUString WpADOParameter::GetName() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } DataTypeEnum WpADOParameter::GetADOType() const @@ -1021,30 +962,28 @@ bool WpADOParameter::put_Size(sal_Int32 _nSize) OUString WpADOColumn::get_Name() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } OUString WpADOColumn::get_RelatedColumn() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_RelatedColumn(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_RelatedColumn(&aBSTR); + return OUString(aBSTR); } void WpADOColumn::put_Name(std::u16string_view _rName) { assert(pInterface); - OLEString bstr(_rName); - pInterface->put_Name(bstr.asBSTR()); + pInterface->put_Name(sal::systools::BStr(_rName)); } void WpADOColumn::put_RelatedColumn(std::u16string_view _rName) { assert(pInterface); - OLEString bstr(_rName); - pInterface->put_RelatedColumn(bstr.asBSTR()); + pInterface->put_RelatedColumn(sal::systools::BStr(_rName)); } DataTypeEnum WpADOColumn::get_Type() const @@ -1127,27 +1066,23 @@ bool WpADOColumn::put_Attributes(const ColumnAttributesEnum& _eNum) WpADOProperties WpADOColumn::get_Properties() const { assert(pInterface); - ADOProperties* pProps = nullptr; + WpADOProperties pProps; pInterface->get_Properties(&pProps); - WpADOProperties aProps; - - aProps.setWithOutAddRef(pProps); - return aProps; + return pProps; } OUString WpADOKey::get_Name() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } void WpADOKey::put_Name(std::u16string_view _rName) { assert(pInterface); - OLEString bstr(_rName); - pInterface->put_Name(bstr.asBSTR()); + pInterface->put_Name(sal::systools::BStr(_rName)); } KeyTypeEnum WpADOKey::get_Type() const @@ -1167,16 +1102,15 @@ void WpADOKey::put_Type(const KeyTypeEnum& _eNum) OUString WpADOKey::get_RelatedTable() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_RelatedTable(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_RelatedTable(&aBSTR); + return OUString(aBSTR); } void WpADOKey::put_RelatedTable(std::u16string_view _rName) { assert(pInterface); - OLEString bstr(_rName); - pInterface->put_RelatedTable(bstr.asBSTR()); + pInterface->put_RelatedTable(sal::systools::BStr(_rName)); } RuleEnum WpADOKey::get_DeleteRule() const @@ -1210,26 +1144,23 @@ void WpADOKey::put_UpdateRule(const RuleEnum& _eNum) WpADOColumns WpADOKey::get_Columns() const { assert(pInterface); - ADOColumns* pCols = nullptr; + WpADOColumns pCols; pInterface->get_Columns(&pCols); - WpADOColumns aCols; - aCols.setWithOutAddRef(pCols); - return aCols; + return pCols; } OUString WpADOIndex::get_Name() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } void WpADOIndex::put_Name(std::u16string_view _rName) { assert(pInterface); - OLEString bstr(_rName); - pInterface->put_Name(bstr.asBSTR()); + pInterface->put_Name(sal::systools::BStr(_rName)); } bool WpADOIndex::get_Clustered() const @@ -1277,11 +1208,9 @@ void WpADOIndex::put_PrimaryKey(bool _b) WpADOColumns WpADOIndex::get_Columns() const { assert(pInterface); - ADOColumns* pCols = nullptr; + WpADOColumns pCols; pInterface->get_Columns(&pCols); - WpADOColumns aCols; - aCols.setWithOutAddRef(pCols); - return aCols; + return pCols; } void WpADOCatalog::putref_ActiveConnection(IDispatch* pCon) @@ -1293,41 +1222,33 @@ void WpADOCatalog::putref_ActiveConnection(IDispatch* pCon) WpADOTables WpADOCatalog::get_Tables() { assert(pInterface); - ADOTables* pRet = nullptr; + WpADOTables pRet; pInterface->get_Tables(&pRet); - WpADOTables aRet; - aRet.setWithOutAddRef(pRet); - return aRet; + return pRet; } WpADOViews WpADOCatalog::get_Views() { assert(pInterface); - ADOViews* pRet = nullptr; + WpADOViews pRet; pInterface->get_Views(&pRet); - WpADOViews aRet; - aRet.setWithOutAddRef(pRet); - return aRet; + return pRet; } WpADOGroups WpADOCatalog::get_Groups() { assert(pInterface); - ADOGroups* pRet = nullptr; + WpADOGroups pRet; pInterface->get_Groups(&pRet); - WpADOGroups aRet; - aRet.setWithOutAddRef(pRet); - return aRet; + return pRet; } WpADOUsers WpADOCatalog::get_Users() { assert(pInterface); - ADOUsers* pRet = nullptr; + WpADOUsers pRet; pInterface->get_Users(&pRet); - WpADOUsers aRet; - aRet.setWithOutAddRef(pRet); - return aRet; + return pRet; } ADOProcedures* WpADOCatalog::get_Procedures() @@ -1341,82 +1262,71 @@ ADOProcedures* WpADOCatalog::get_Procedures() OUString WpADOTable::get_Name() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } void WpADOTable::put_Name(std::u16string_view _rName) { assert(pInterface); - OLEString bstr(_rName); - pInterface->put_Name(bstr.asBSTR()); + pInterface->put_Name(sal::systools::BStr(_rName)); } OUString WpADOTable::get_Type() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Type(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Type(&aBSTR); + return OUString(aBSTR); } WpADOColumns WpADOTable::get_Columns() const { assert(pInterface); - ADOColumns* pCols = nullptr; + WpADOColumns pCols; pInterface->get_Columns(&pCols); - WpADOColumns aCols; - aCols.setWithOutAddRef(pCols); - return aCols; + return pCols; } WpADOIndexes WpADOTable::get_Indexes() const { assert(pInterface); - ADOIndexes* pCols = nullptr; - pInterface->get_Indexes(&pCols); - WpADOIndexes aRet; - aRet.setWithOutAddRef(pCols); - return aRet; + WpADOIndexes pRet; + pInterface->get_Indexes(&pRet); + return pRet; } WpADOKeys WpADOTable::get_Keys() const { assert(pInterface); - ADOKeys* pCols = nullptr; - pInterface->get_Keys(&pCols); - WpADOKeys aRet; - aRet.setWithOutAddRef(pCols); - return aRet; + WpADOKeys pRet; + pInterface->get_Keys(&pRet); + return pRet; } WpADOCatalog WpADOTable::get_ParentCatalog() const { assert(pInterface); - ADOCatalog* pCat = nullptr; + WpADOCatalog pCat; pInterface->get_ParentCatalog(&pCat); - WpADOCatalog aRet; - aRet.setWithOutAddRef(pCat); - return aRet; + return pCat; } WpADOProperties WpADOTable::get_Properties() const { assert(pInterface); - ADOProperties* pProps = nullptr; + WpADOProperties pProps; pInterface->get_Properties(&pProps); - WpADOProperties aProps; - aProps.setWithOutAddRef(pProps); - return aProps; + return pProps; } OUString WpADOView::get_Name() const { assert(pInterface); - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } void WpADOView::get_Command(OLEVariant& _rVar) const @@ -1433,15 +1343,14 @@ void WpADOView::put_Command(OLEVariant const & _rVar) OUString WpADOGroup::get_Name() const { - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } void WpADOGroup::put_Name(std::u16string_view _rName) { - OLEString bstr(_rName); - pInterface->put_Name(bstr.asBSTR()); + pInterface->put_Name(sal::systools::BStr(_rName)); } RightsEnum WpADOGroup::GetPermissions( @@ -1468,41 +1377,34 @@ bool WpADOGroup::SetPermissions( WpADOUsers WpADOGroup::get_Users( ) { - ADOUsers* pRet = nullptr; + WpADOUsers pRet; pInterface->get_Users( &pRet); - WpADOUsers aRet; - aRet.setWithOutAddRef(pRet); - return aRet; + return pRet; } OUString WpADOUser::get_Name() const { - OLEString aBSTR; - pInterface->get_Name(aBSTR.getAddress()); - return aBSTR.asOUString(); + sal::systools::BStr aBSTR; + pInterface->get_Name(&aBSTR); + return OUString(aBSTR); } void WpADOUser::put_Name(std::u16string_view _rName) { - OLEString bstr(_rName); - pInterface->put_Name(bstr.asBSTR()); + pInterface->put_Name(sal::systools::BStr(_rName)); } bool WpADOUser::ChangePassword(std::u16string_view _rPwd,std::u16string_view _rNewPwd) { - OLEString sStr1(_rPwd); - OLEString sStr2(_rNewPwd); - bool bErg = SUCCEEDED(pInterface->ChangePassword(sStr1.asBSTR(),sStr2.asBSTR())); - return bErg; + return SUCCEEDED( + pInterface->ChangePassword(sal::systools::BStr(_rPwd), sal::systools::BStr(_rNewPwd))); } WpADOGroups WpADOUser::get_Groups() { - ADOGroups* pRet = nullptr; + WpADOGroups pRet; pInterface->get_Groups(&pRet); - WpADOGroups aRet; - aRet.setWithOutAddRef(pRet); - return aRet; + return pRet; } RightsEnum WpADOUser::GetPermissions( @@ -1527,73 +1429,6 @@ bool WpADOUser::SetPermissions( return SUCCEEDED(pInterface->SetPermissions(Name,ObjectType,Action,Rights,adInheritNone,ObjectTypeId)); } -WpBase::WpBase() : pIUnknown(nullptr) -{ -} -WpBase::WpBase(IDispatch* pInt) - :pIUnknown(pInt) -{ - if (pIUnknown) - { - pIUnknown->AddRef(); - } -} - -WpBase::WpBase(const WpBase& aWrapper) - :pIUnknown(aWrapper.pIUnknown) -{ - if (pIUnknown) - pIUnknown->AddRef(); -} - -//inline -WpBase& WpBase::operator=(const WpBase& rhs) -{ - operator=(rhs.pIUnknown); - return *this; -}; - -WpBase& WpBase::operator=(IDispatch* rhs) -{ - if (pIUnknown != rhs) - { - if (pIUnknown) - pIUnknown->Release(); - pIUnknown = rhs; - if (pIUnknown) - pIUnknown->AddRef(); - } - return *this; -} - -WpBase::~WpBase() -{ - if (pIUnknown) - { - pIUnknown->Release(); - pIUnknown = nullptr; - } -} - -void WpBase::clear() -{ - if (pIUnknown) - { - pIUnknown->Release(); - pIUnknown = nullptr; - } -} - - -bool WpBase::IsValid() const -{ - return pIUnknown != nullptr; -} -WpBase::operator IDispatch*() -{ - return pIUnknown; -} - ADORecordset* WpADOConnection::getExportedKeys( const css::uno::Any& catalog, const OUString& schema, std::u16string_view table ) { // Create elements used in the array @@ -1603,7 +1438,7 @@ ADORecordset* WpADOConnection::getExportedKeys( const css::uno::Any& catalog, co // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1643,7 +1478,7 @@ ADORecordset* WpADOConnection::getImportedKeys( const css::uno::Any& catalog, co // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1685,7 +1520,7 @@ ADORecordset* WpADOConnection::getPrimaryKeys( const css::uno::Any& catalog, con // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1725,7 +1560,7 @@ ADORecordset* WpADOConnection::getIndexInfo( // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1759,7 +1594,7 @@ ADORecordset* WpADOConnection::getIndexInfo( ADORecordset* WpADOConnection::getTablePrivileges( const css::uno::Any& catalog, const OUString& schemaPattern, - const OUString& tableNamePattern ) + std::u16string_view tableNamePattern ) { SAFEARRAYBOUND rgsabound[1]; SAFEARRAY *psa = nullptr; @@ -1767,7 +1602,7 @@ ADORecordset* WpADOConnection::getTablePrivileges( const css::uno::Any& catalog, // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1779,7 +1614,7 @@ ADORecordset* WpADOConnection::getTablePrivileges( const css::uno::Any& catalog, varCriteria[nPos].setString(schemaPattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_SCHEMA - if(tableNamePattern.toChar() != '%') + if(!o3tl::starts_with(tableNamePattern, u"%")) varCriteria[nPos].setString(tableNamePattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_NAME @@ -1813,7 +1648,7 @@ ADORecordset* WpADOConnection::getCrossReference( const css::uno::Any& primaryCa // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1854,7 +1689,7 @@ ADORecordset* WpADOConnection::getCrossReference( const css::uno::Any& primaryCa ADORecordset* WpADOConnection::getProcedures( const css::uno::Any& catalog, const OUString& schemaPattern, - const OUString& procedureNamePattern ) + std::u16string_view procedureNamePattern ) { SAFEARRAYBOUND rgsabound[1]; SAFEARRAY *psa = nullptr; @@ -1862,7 +1697,7 @@ ADORecordset* WpADOConnection::getProcedures( const css::uno::Any& catalog, // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1874,7 +1709,7 @@ ADORecordset* WpADOConnection::getProcedures( const css::uno::Any& catalog, varCriteria[nPos].setString(schemaPattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_SCHEMA - if(procedureNamePattern.toChar() != '%') + if(!o3tl::starts_with(procedureNamePattern, u"%")) varCriteria[nPos].setString(procedureNamePattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_NAME @@ -1893,8 +1728,8 @@ ADORecordset* WpADOConnection::getProcedures( const css::uno::Any& catalog, ADORecordset* WpADOConnection::getProcedureColumns( const css::uno::Any& catalog, const OUString& schemaPattern, - const OUString& procedureNamePattern, - const OUString& columnNamePattern ) + std::u16string_view procedureNamePattern, + std::u16string_view columnNamePattern ) { // Create elements used in the array SAFEARRAYBOUND rgsabound[1]; @@ -1903,7 +1738,7 @@ ADORecordset* WpADOConnection::getProcedureColumns( const css::uno::Any& catalog // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -1915,11 +1750,11 @@ ADORecordset* WpADOConnection::getProcedureColumns( const css::uno::Any& catalog varCriteria[nPos].setString(schemaPattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_SCHEMA - if(procedureNamePattern.toChar() != '%') + if(!o3tl::starts_with(procedureNamePattern, u"%")) varCriteria[nPos].setString(procedureNamePattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_NAME - if(columnNamePattern.toChar() != '%') + if(!o3tl::starts_with(columnNamePattern, u"%")) varCriteria[nPos].setString(columnNamePattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// COLUMN_NAME @@ -1938,7 +1773,7 @@ ADORecordset* WpADOConnection::getProcedureColumns( const css::uno::Any& catalog ADORecordset* WpADOConnection::getTables( const css::uno::Any& catalog, const OUString& schemaPattern, - const OUString& tableNamePattern, + std::u16string_view tableNamePattern, const css::uno::Sequence< OUString >& types ) { // Create elements used in the array @@ -1955,18 +1790,16 @@ ADORecordset* WpADOConnection::getTables( const css::uno::Any& catalog, varCriteria[nPos].setString(schemaPattern); ++nPos; - if(tableNamePattern.toChar() != '%') + if(!o3tl::starts_with(tableNamePattern, u"%")) varCriteria[nPos].setString(tableNamePattern); ++nPos; OUStringBuffer aTypes; - const OUString* pIter = types.getConstArray(); - const OUString* pEnd = pIter + types.getLength(); - for( ; pIter != pEnd ; ++pIter) + for (auto& type : types) { if ( aTypes.getLength() ) aTypes.append(","); - aTypes.append(*pIter); + aTypes.append(type); } OUString sTypeNames = aTypes.makeStringAndClear(); @@ -1974,7 +1807,7 @@ ADORecordset* WpADOConnection::getTables( const css::uno::Any& catalog, varCriteria[nPos].setString(sTypeNames); // Create SafeArray Bounds and initialize the array - const sal_Int32 nCrit = SAL_N_ELEMENTS(varCriteria); + const sal_Int32 nCrit = std::size(varCriteria); SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; rgsabound[0].cElements = nCrit; @@ -2001,7 +1834,7 @@ ADORecordset* WpADOConnection::getTables( const css::uno::Any& catalog, ADORecordset* WpADOConnection::getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, - const OUString& tableNamePattern, + std::u16string_view tableNamePattern, std::u16string_view columnNamePattern ) { // Create elements used in the array @@ -2011,7 +1844,7 @@ ADORecordset* WpADOConnection::getColumns( const css::uno::Any& catalog, // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -2023,7 +1856,7 @@ ADORecordset* WpADOConnection::getColumns( const css::uno::Any& catalog, varCriteria[nPos].setString(schemaPattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_SCHEMA - if(tableNamePattern.toChar() != '%') + if(!o3tl::starts_with(tableNamePattern, u"%")) varCriteria[nPos].setString(tableNamePattern); SafeArrayPutElement(psa,&nPos,&varCriteria[nPos]);nPos++;// TABLE_NAME @@ -2055,7 +1888,7 @@ ADORecordset* WpADOConnection::getColumnPrivileges( const css::uno::Any& catalog // Create SafeArray Bounds and initialize the array rgsabound[0].lLbound = 0; - rgsabound[0].cElements = SAL_N_ELEMENTS(varCriteria); + rgsabound[0].cElements = std::size(varCriteria); psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound ); sal_Int32 nPos=0; @@ -2090,7 +1923,7 @@ ADORecordset* WpADOConnection::getTypeInfo(DataTypeEnum /*_eType*/) { // Create elements used in the array OLEVariant varCriteria[2]; - const int nCrit = SAL_N_ELEMENTS(varCriteria); + const int nCrit = std::size(varCriteria); // Create SafeArray Bounds and initialize the array SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; @@ -2128,11 +1961,6 @@ void WpADOTable::putref_ParentCatalog(/* [in] */ _ADOCatalog __RPC_FAR *ppvObjec SAL_WARN_IF(!bRet, "connectivity.ado", "Could not set ParentCatalog!"); } -void WpBase::setIDispatch(IDispatch* _pIUnknown) -{ - pIUnknown = _pIUnknown; -} - void OTools::putValue(const WpADOProperties& _rProps,const OLEVariant &_aPosition,const OLEVariant &_aValVar) { SAL_WARN_IF(!_rProps.IsValid(), "connectivity.ado", "Properties are not valid!"); diff --git a/connectivity/source/drivers/ado/adoimp.cxx b/connectivity/source/drivers/ado/adoimp.cxx index 0b4936e734f2..91f19dd7380d 100644 --- a/connectivity/source/drivers/ado/adoimp.cxx +++ b/connectivity/source/drivers/ado/adoimp.cxx @@ -23,6 +23,7 @@ #include <ado/Awrapado.hxx> #include <ado/adoimp.hxx> #include <osl/diagnose.h> +#include <systools/win32/oleauto.hxx> #include <com/sun/star/sdbc/DataType.hpp> @@ -67,9 +68,9 @@ const IID ADOS::IID_ADOUSER_25 = MYADOID(0x00000619); const CLSID ADOS::CLSID_ADOVIEW_25 = MYADOID(0x00000612); const IID ADOS::IID_ADOVIEW_25 = MYADOID(0x00000613); -OLEString& ADOS::GetKeyStr() +BSTR ADOS::GetKeyStr() { - static OLEString sKeyStr(u"gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz"); + static sal::systools::BStr sKeyStr(u"gxwaezucfyqpwjgqbcmtsncuhwsnyhiohwxz"); return sKeyStr; } @@ -310,9 +311,8 @@ WpADOField ADOS::getField(ADORecordset* _pRecordSet,sal_Int32 _nColumnIndex) if ( !_pRecordSet ) return WpADOField(); - ADOFields* pFields = nullptr; - _pRecordSet->get_Fields(&pFields); - WpOLEAppendCollection<ADOFields, ADOField, WpADOField> aFields(pFields); + WpOLEAppendCollection<ADOFields, WpADOField> aFields; + _pRecordSet->get_Fields(&aFields); if(_nColumnIndex <= 0 || _nColumnIndex > aFields.GetItemCount()) ::dbtools::throwInvalidIndexException(nullptr); WpADOField aField(aFields.GetItem(_nColumnIndex-1)); diff --git a/connectivity/source/drivers/calc/CCatalog.cxx b/connectivity/source/drivers/calc/CCatalog.cxx index 03c4358b9b65..60cf3e7ba06a 100644 --- a/connectivity/source/drivers/calc/CCatalog.cxx +++ b/connectivity/source/drivers/calc/CCatalog.cxx @@ -24,7 +24,6 @@ #include <com/sun/star/sdbc/XResultSet.hpp> using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; @@ -41,7 +40,7 @@ void OCalcCatalog::refreshTables() ::std::vector<OUString> aVector; Sequence<OUString> aTypes; OCalcConnection::ODocHolder aDocHolder(static_cast<OCalcConnection*>(m_pConnection)); - Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), "%", "%", aTypes); + Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), u"%"_ustr, u"%"_ustr, aTypes); if (xResult.is()) { diff --git a/connectivity/source/drivers/calc/CConnection.cxx b/connectivity/source/drivers/calc/CConnection.cxx index 8d4a0c01ebc1..d1ae21a38e07 100644 --- a/connectivity/source/drivers/calc/CConnection.cxx +++ b/connectivity/source/drivers/calc/CConnection.cxx @@ -62,9 +62,9 @@ void OCalcConnection::construct(const OUString& url,const Sequence< PropertyValu sal_Int32 nLen = url.indexOf(':'); nLen = url.indexOf(':',nLen+1); - OUString aDSN(url.copy(nLen+1)); - m_aFileName = aDSN; + m_aFileName = url.copy(nLen+1); // DSN + INetURLObject aURL; aURL.SetSmartProtocol(INetProtocol::File); { @@ -80,18 +80,15 @@ void OCalcConnection::construct(const OUString& url,const Sequence< PropertyValu m_aFileName = aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE); m_sPassword.clear(); - const char pPwd[] = "password"; - const PropertyValue *pIter = info.getConstArray(); - const PropertyValue *pEnd = pIter + info.getLength(); - for(;pIter != pEnd;++pIter) + for (auto& propval : info) { - if(pIter->Name == pPwd) + if (propval.Name == "password") { - pIter->Value >>= m_sPassword; + propval.Value >>= m_sPassword; break; } - } // for(;pIter != pEnd;++pIter) + } ODocHolder aDocHolder(this); // just to test that the doc can be loaded acquireDoc(); } @@ -123,7 +120,7 @@ Reference< XSpreadsheetDocument> const & OCalcConnection::acquireDoc() try { xComponent = xDesktop->loadComponentFromURL( - m_aFileName, "_blank", 0, aArgs ); + m_aFileName, u"_blank"_ustr, 0, aArgs ); } catch( const Exception& ) { @@ -142,12 +139,11 @@ Reference< XSpreadsheetDocument> const & OCalcConnection::acquireDoc() Exception aLoaderError; OSL_VERIFY( aLoaderException >>= aLoaderError ); - SQLException aDetailException; - aDetailException.Message = m_aResources.getResourceStringWithSubstitution( - STR_LOAD_FILE_ERROR_MESSAGE, - "$exception_type$", aLoaderException.getValueTypeName(), - "$error_message$", aLoaderError.Message - ); + SQLException aDetailException(m_aResources.getResourceStringWithSubstitution( + STR_LOAD_FILE_ERROR_MESSAGE, "$exception_type$", + aLoaderException.getValueTypeName(), + "$error_message$", aLoaderError.Message), + {}, {}, 0, {}); aErrorDetails <<= aDetailException; } @@ -194,7 +190,7 @@ void OCalcConnection::disposing() // XServiceInfo -IMPLEMENT_SERVICE_INFO(OCalcConnection, "com.sun.star.sdbc.drivers.calc.Connection", "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(OCalcConnection, u"com.sun.star.sdbc.drivers.calc.Connection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) Reference< XDatabaseMetaData > SAL_CALL OCalcConnection::getMetaData( ) @@ -217,11 +213,11 @@ Reference< XDatabaseMetaData > SAL_CALL OCalcConnection::getMetaData( ) css::uno::Reference< XTablesSupplier > OCalcConnection::createCatalog() { ::osl::MutexGuard aGuard( m_aMutex ); - Reference< XTablesSupplier > xTab = m_xCatalog; + rtl::Reference< connectivity::sdbcx::OCatalog > xTab = m_xCatalog; if(!xTab.is()) { xTab = new OCalcCatalog(this); - m_xCatalog = xTab; + m_xCatalog = xTab.get(); } return xTab; } @@ -257,9 +253,7 @@ Reference< XPreparedStatement > SAL_CALL OCalcConnection::prepareCall( const OUS ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::prepareCall", *this ); - return nullptr; + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::prepareCall"_ustr, *this ); } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/calc/CDatabaseMetaData.cxx b/connectivity/source/drivers/calc/CDatabaseMetaData.cxx index 31798f5bafd0..4c642e66f2e7 100644 --- a/connectivity/source/drivers/calc/CDatabaseMetaData.cxx +++ b/connectivity/source/drivers/calc/CDatabaseMetaData.cxx @@ -34,7 +34,6 @@ using namespace connectivity::file; using namespace connectivity::component; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::table; @@ -59,37 +58,37 @@ static bool lcl_IsEmptyOrHidden( const Reference<XSpreadsheets>& xSheets, const { Any aAny = xSheets->getByName( rName ); Reference<XSpreadsheet> xSheet; - if ( aAny >>= xSheet ) + if ( !(aAny >>= xSheet) ) + return false; + + // test if sheet is hidden + + Reference<XPropertySet> xProp( xSheet, UNO_QUERY ); + if (xProp.is()) { - // test if sheet is hidden + bool bVisible; + Any aVisAny = xProp->getPropertyValue(u"IsVisible"_ustr); + if ( (aVisAny >>= bVisible) && !bVisible) + return true; // hidden + } - Reference<XPropertySet> xProp( xSheet, UNO_QUERY ); - if (xProp.is()) - { - bool bVisible; - Any aVisAny = xProp->getPropertyValue("IsVisible"); - if ( (aVisAny >>= bVisible) && !bVisible) - return true; // hidden - } + // use the same data area as in OCalcTable to test for empty table - // use the same data area as in OCalcTable to test for empty table + Reference<XSheetCellCursor> xCursor = xSheet->createCursor(); + Reference<XCellRangeAddressable> xRange( xCursor, UNO_QUERY ); + if ( xRange.is() ) + { + xCursor->collapseToSize( 1, 1 ); // single (first) cell + xCursor->collapseToCurrentRegion(); // contiguous data area - Reference<XSheetCellCursor> xCursor = xSheet->createCursor(); - Reference<XCellRangeAddressable> xRange( xCursor, UNO_QUERY ); - if ( xRange.is() ) + CellRangeAddress aRangeAddr = xRange->getRangeAddress(); + if ( aRangeAddr.StartColumn == aRangeAddr.EndColumn && + aRangeAddr.StartRow == aRangeAddr.EndRow ) { - xCursor->collapseToSize( 1, 1 ); // single (first) cell - xCursor->collapseToCurrentRegion(); // contiguous data area - - CellRangeAddress aRangeAddr = xRange->getRangeAddress(); - if ( aRangeAddr.StartColumn == aRangeAddr.EndColumn && - aRangeAddr.StartRow == aRangeAddr.EndRow ) - { - // single cell -> check content - Reference<XCell> xCell = xCursor->getCellByPosition( 0, 0 ); - if ( xCell.is() && xCell->getType() == CellContentType_EMPTY ) - return true; - } + // single cell -> check content + Reference<XCell> xCell = xCursor->getCellByPosition( 0, 0 ); + if ( xCell.is() && xCell->getType() == CellContentType_EMPTY ) + return true; } } @@ -109,7 +108,7 @@ static bool lcl_IsUnnamed( const Reference<XDatabaseRanges>& xRanges, const OUSt { try { - Any aUserAny = xRangeProp->getPropertyValue("IsUserDefined"); + Any aUserAny = xRangeProp->getPropertyValue(u"IsUserDefined"_ustr); bool bUserDefined; if ( aUserAny >>= bUserDefined ) bUnnamed = !bUserDefined; @@ -135,27 +134,23 @@ Reference< XResultSet > SAL_CALL OCalcDatabaseMetaData::getTables( // check if ORowSetValue type is given // when no types are given then we have to return all tables e.g. TABLE - OUString aTable("TABLE"); + static constexpr OUString aTable(u"TABLE"_ustr); - bool bTableFound = true; - sal_Int32 nLength = types.getLength(); - if(nLength) + if (types.hasElements()) { - bTableFound = false; + bool bTableFound = false; - const OUString* pIter = types.getConstArray(); - const OUString* pEnd = pIter + nLength; - for(;pIter != pEnd;++pIter) + for (auto& type : types) { - if(*pIter == aTable) + if (type == aTable) { bTableFound = true; break; } } + if (!bTableFound) + return pResult; } - if(!bTableFound) - return pResult; // get the sheet names from the document @@ -172,7 +167,7 @@ Reference< XResultSet > SAL_CALL OCalcDatabaseMetaData::getTables( sal_Int32 nSheetCount = aSheetNames.getLength(); for (sal_Int32 nSheet=0; nSheet<nSheetCount; nSheet++) { - OUString aName = aSheetNames[nSheet]; + const OUString& aName = aSheetNames[nSheet]; if ( !lcl_IsEmptyOrHidden( xSheets, aName ) && match(tableNamePattern,aName,'\0') ) { aRows.push_back( { nullptr, nullptr, nullptr, @@ -188,7 +183,7 @@ Reference< XResultSet > SAL_CALL OCalcDatabaseMetaData::getTables( Reference<XPropertySet> xDocProp( xDoc, UNO_QUERY ); if ( xDocProp.is() ) { - Any aRangesAny = xDocProp->getPropertyValue("DatabaseRanges"); + Any aRangesAny = xDocProp->getPropertyValue(u"DatabaseRanges"_ustr); Reference<XDatabaseRanges> xRanges; if ( aRangesAny >>= xRanges ) { @@ -196,7 +191,7 @@ Reference< XResultSet > SAL_CALL OCalcDatabaseMetaData::getTables( sal_Int32 nDBCount = aDBNames.getLength(); for (sal_Int32 nRange=0; nRange<nDBCount; nRange++) { - OUString aName = aDBNames[nRange]; + const OUString& aName = aDBNames[nRange]; if ( !lcl_IsUnnamed( xRanges, aName ) && match(tableNamePattern,aName,'\0') ) { aRows.push_back( { nullptr, nullptr, nullptr, diff --git a/connectivity/source/drivers/calc/CDriver.cxx b/connectivity/source/drivers/calc/CDriver.cxx index b7b11cc29176..528df911c219 100644 --- a/connectivity/source/drivers/calc/CDriver.cxx +++ b/connectivity/source/drivers/calc/CDriver.cxx @@ -37,7 +37,7 @@ using namespace ::com::sun::star::lang; OUString SAL_CALL ODriver::getImplementationName( ) { - return "com.sun.star.comp.sdbc.calc.ODriver"; + return u"com.sun.star.comp.sdbc.calc.ODriver"_ustr; } // service names from file::OFileDriver @@ -53,7 +53,7 @@ connectivity_calc_ODriver( } if (ret) ret->acquire(); - return static_cast<cppu::OWeakObject*>(ret.get()); + return getXWeak(ret.get()); } @@ -70,7 +70,7 @@ Reference< XConnection > SAL_CALL ODriver::connect( const OUString& url, rtl::Reference<OCalcConnection> pCon = new OCalcConnection(this); pCon->construct(url,info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon.get()); return pCon; } diff --git a/connectivity/source/drivers/calc/CTable.cxx b/connectivity/source/drivers/calc/CTable.cxx index 8e37cdd99071..da7e74542af3 100644 --- a/connectivity/source/drivers/calc/CTable.cxx +++ b/connectivity/source/drivers/calc/CTable.cxx @@ -49,10 +49,8 @@ using namespace ::cppu; using namespace ::dbtools; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sheet; using namespace ::com::sun::star::table; using namespace ::com::sun::star::text; @@ -71,14 +69,11 @@ static void lcl_UpdateArea( const Reference<XCellRange>& xUsedRange, sal_Int32& CellFlags::STRING | CellFlags::VALUE | CellFlags::DATETIME | CellFlags::FORMULA | CellFlags::ANNOTATION; const Reference<XSheetCellRanges> xUsedRanges = xUsedQuery->queryContentCells( nContentFlags ); - const Sequence<CellRangeAddress> aAddresses = xUsedRanges->getRangeAddresses(); - const sal_Int32 nCount = aAddresses.getLength(); - const CellRangeAddress* pData = aAddresses.getConstArray(); - for ( sal_Int32 i=0; i<nCount; i++ ) + for (auto& address : xUsedRanges->getRangeAddresses()) { - rEndCol = std::max(pData[i].EndColumn, rEndCol); - rEndRow = std::max(pData[i].EndRow, rEndRow); + rEndCol = std::max(address.EndColumn, rEndCol); + rEndRow = std::max(address.EndRow, rEndRow); } } @@ -139,7 +134,7 @@ static CellContentType lcl_GetContentOrResultType( const Reference<XCell>& xCell Reference<XPropertySet> xProp( xCell, UNO_QUERY ); try { - xProp->getPropertyValue( "CellContentType" ) >>= eCellType; // type of cell content + xProp->getPropertyValue( u"CellContentType"_ustr ) >>= eCellType; // type of cell content } catch (UnknownPropertyException&) { @@ -191,24 +186,23 @@ static bool lcl_HasTextInColumn( const Reference<XSpreadsheet>& xSheet, sal_Int3 // look for any text cell or text result in the column Reference<XCellRangeAddressable> xAddr( xSheet, UNO_QUERY ); - if (xAddr.is()) - { - CellRangeAddress aTotalRange = xAddr->getRangeAddress(); - sal_Int32 nLastRow = aTotalRange.EndRow; - Reference<XCellRangesQuery> xQuery( xSheet->getCellRangeByPosition( nDocColumn, nDocRow, nDocColumn, nLastRow ), UNO_QUERY ); - if (xQuery.is()) - { - // are there text cells in the column? - Reference<XSheetCellRanges> xTextContent = xQuery->queryContentCells( CellFlags::STRING ); - if ( xTextContent.is() && xTextContent->hasElements() ) - return true; - - // are there formulas with text results in the column? - Reference<XSheetCellRanges> xTextFormula = xQuery->queryFormulaCells( FormulaResult::STRING ); - if ( xTextFormula.is() && xTextFormula->hasElements() ) - return true; - } - } + if (!xAddr) + return false; + CellRangeAddress aTotalRange = xAddr->getRangeAddress(); + sal_Int32 nLastRow = aTotalRange.EndRow; + Reference<XCellRangesQuery> xQuery( xSheet->getCellRangeByPosition( nDocColumn, nDocRow, nDocColumn, nLastRow ), UNO_QUERY ); + if (!xQuery) + return false; + + // are there text cells in the column? + Reference<XSheetCellRanges> xTextContent = xQuery->queryContentCells( CellFlags::STRING ); + if ( xTextContent.is() && xTextContent->hasElements() ) + return true; + + // are there formulas with text results in the column? + Reference<XSheetCellRanges> xTextFormula = xQuery->queryFormulaCells( FormulaResult::STRING ); + if ( xTextFormula.is() && xTextFormula->hasElements() ) + return true; return false; } @@ -254,7 +248,7 @@ static void lcl_GetColumnInfo( const Reference<XSpreadsheet>& xSheet, const Refe { sal_Int32 nKey = 0; - if ( xProp->getPropertyValue( "NumberFormat" ) >>= nKey ) + if ( xProp->getPropertyValue( u"NumberFormat"_ustr ) >>= nKey ) { const Reference<XPropertySet> xFormat = xFormats->getByKey( nKey ); if ( xFormat.is() ) @@ -538,7 +532,7 @@ void OCalcTable::construct() Reference<XPropertySet> xDocProp( xDoc, UNO_QUERY ); if ( xDocProp.is() ) { - Reference<XDatabaseRanges> xRanges(xDocProp->getPropertyValue("DatabaseRanges"),UNO_QUERY); + Reference<XDatabaseRanges> xRanges(xDocProp->getPropertyValue(u"DatabaseRanges"_ustr),UNO_QUERY); if ( xRanges.is() && xRanges->hasByName( m_Name ) ) { @@ -552,7 +546,7 @@ void OCalcTable::construct() bool bRangeHeader = true; Reference<XPropertySet> xFiltProp( xDBRange->getFilterDescriptor(), UNO_QUERY ); if ( xFiltProp.is() ) - xFiltProp->getPropertyValue("ContainsHeader") >>= bRangeHeader; + xFiltProp->getPropertyValue(u"ContainsHeader"_ustr) >>= bRangeHeader; Reference<XSheetCellRange> xSheetRange( xRefer->getReferredCells(), UNO_QUERY ); Reference<XCellRangeAddressable> xAddr( xSheetRange, UNO_QUERY ); @@ -586,7 +580,7 @@ void OCalcTable::construct() if (xProp.is()) { css::util::Date aDateStruct; - if ( xProp->getPropertyValue("NullDate") >>= aDateStruct ) + if ( xProp->getPropertyValue(u"NullDate"_ustr) >>= aDateStruct ) m_aNullDate = ::Date( aDateStruct.Day, aDateStruct.Month, aDateStruct.Year ); } } @@ -609,20 +603,6 @@ void SAL_CALL OCalcTable::disposing() } -Sequence< sal_Int8 > OCalcTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OCalcTable::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OCalcTable_BASE>{}); -} - bool OCalcTable::fetchRow( OValueRefRow& _rRow, const OSQLColumns & _rCols, bool bRetrieveData ) { diff --git a/connectivity/source/drivers/calc/CTables.cxx b/connectivity/source/drivers/calc/CTables.cxx index 08e5d63e3abd..87fb959fbda6 100644 --- a/connectivity/source/drivers/calc/CTables.cxx +++ b/connectivity/source/drivers/calc/CTables.cxx @@ -25,21 +25,16 @@ #include <file/FCatalog.hxx> #include <file/FConnection.hxx> -using namespace ::comphelper; using namespace connectivity; using namespace connectivity::calc; using namespace connectivity::file; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; using namespace ::com::sun::star::container; -sdbcx::ObjectType OCalcTables::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OCalcTables::createObject(const OUString& _rName) { rtl::Reference<OCalcTable> pTable = new OCalcTable(this, static_cast<OCalcConnection*>(static_cast<OFileCatalog&>(m_rParent).getConnection()), - _rName,"TABLE"); + _rName,u"TABLE"_ustr); pTable->construct(); return pTable; } diff --git a/connectivity/source/drivers/component/CColumns.cxx b/connectivity/source/drivers/component/CColumns.cxx index 9f802b6e4c57..9fc7f22882fe 100644 --- a/connectivity/source/drivers/component/CColumns.cxx +++ b/connectivity/source/drivers/component/CColumns.cxx @@ -23,20 +23,16 @@ using namespace connectivity::component; using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -sdbcx::ObjectType OComponentColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OComponentColumns::createObject(const OUString& _rName) { ::rtl::Reference<OSQLColumns> aCols = m_pTable->getTableColumns(); OSQLColumns::const_iterator aIter = find(aCols->begin(),aCols->end(),_rName,::comphelper::UStringMixEqual(isCaseSensitive())); - sdbcx::ObjectType xRet; + css::uno::Reference< css::beans::XPropertySet > xRet; if(aIter != aCols->end()) - xRet = sdbcx::ObjectType(*aIter,UNO_QUERY); + xRet = *aIter; return xRet; } diff --git a/connectivity/source/drivers/component/CDatabaseMetaData.cxx b/connectivity/source/drivers/component/CDatabaseMetaData.cxx index b8bbae3d7499..45a932657f67 100644 --- a/connectivity/source/drivers/component/CDatabaseMetaData.cxx +++ b/connectivity/source/drivers/component/CDatabaseMetaData.cxx @@ -46,74 +46,69 @@ OComponentDatabaseMetaData::~OComponentDatabaseMetaData() Reference< XResultSet > OComponentDatabaseMetaData::impl_getTypeInfo_throw( ) { - ::osl::MutexGuard aGuard( m_aMutex ); - rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo); - static ODatabaseMetaDataResultSet::ORows aRows; - if(aRows.empty()) + ODatabaseMetaDataResultSet::ORows aRows; + aRows.reserve(6); + ODatabaseMetaDataResultSet::ORow aRow { - aRows.reserve(6); - ODatabaseMetaDataResultSet::ORow aRow - { - ODatabaseMetaDataResultSet::getEmptyValue(), - new ORowSetValueDecorator(OUString("VARCHAR")), - new ORowSetValueDecorator(DataType::VARCHAR), - new ORowSetValueDecorator(sal_Int32(65535)), - ODatabaseMetaDataResultSet::getQuoteValue(), - ODatabaseMetaDataResultSet::getQuoteValue(), - ODatabaseMetaDataResultSet::getEmptyValue(), - ODatabaseMetaDataResultSet::get1Value(), // ORowSetValue((sal_Int32)ColumnValue::NULLABLE - ODatabaseMetaDataResultSet::get1Value(), - new ORowSetValueDecorator(sal_Int32(ColumnSearch::CHAR)), - ODatabaseMetaDataResultSet::get1Value(), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::getEmptyValue(), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::getEmptyValue(), - ODatabaseMetaDataResultSet::getEmptyValue(), - new ORowSetValueDecorator(sal_Int32(10)) - }; - - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("DECIMAL")); - aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); - aRow[3] = ODatabaseMetaDataResultSet::get0Value(); - aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); - aRow[15] = ODatabaseMetaDataResultSet::get0Value(); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("BOOL")); - aRow[2] = new ORowSetValueDecorator(DataType::BIT); - aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); - aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); - aRow[15] = new ORowSetValueDecorator(sal_Int32(15)); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("DATE")); - aRow[2] = new ORowSetValueDecorator(DataType::DATE); - aRow[3] = ODatabaseMetaDataResultSet::get0Value(); - aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); - aRow[15] = ODatabaseMetaDataResultSet::get0Value(); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("TIME")); - aRow[2] = new ORowSetValueDecorator(DataType::TIME); - aRow[3] = ODatabaseMetaDataResultSet::get0Value(); - aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); - aRow[15] = ODatabaseMetaDataResultSet::get0Value(); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("TIMESTAMP")); - aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); - aRow[3] = ODatabaseMetaDataResultSet::get0Value(); - aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); - aRow[15] = ODatabaseMetaDataResultSet::get0Value(); - aRows.push_back(aRow); - } + ODatabaseMetaDataResultSet::getEmptyValue(), + new ORowSetValueDecorator(u"VARCHAR"_ustr), + new ORowSetValueDecorator(DataType::VARCHAR), + new ORowSetValueDecorator(sal_Int32(65535)), + ODatabaseMetaDataResultSet::getQuoteValue(), + ODatabaseMetaDataResultSet::getQuoteValue(), + ODatabaseMetaDataResultSet::getEmptyValue(), + ODatabaseMetaDataResultSet::get1Value(), // ORowSetValue((sal_Int32)ColumnValue::NULLABLE + ODatabaseMetaDataResultSet::get1Value(), + new ORowSetValueDecorator(sal_Int32(ColumnSearch::CHAR)), + ODatabaseMetaDataResultSet::get1Value(), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::getEmptyValue(), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::getEmptyValue(), + ODatabaseMetaDataResultSet::getEmptyValue(), + new ORowSetValueDecorator(sal_Int32(10)) + }; + + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"DECIMAL"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); + aRow[3] = ODatabaseMetaDataResultSet::get0Value(); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRow[15] = ODatabaseMetaDataResultSet::get0Value(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"BOOL"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::BIT); + aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRow[15] = new ORowSetValueDecorator(sal_Int32(15)); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"DATE"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::DATE); + aRow[3] = ODatabaseMetaDataResultSet::get0Value(); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRow[15] = ODatabaseMetaDataResultSet::get0Value(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"TIME"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::TIME); + aRow[3] = ODatabaseMetaDataResultSet::get0Value(); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRow[15] = ODatabaseMetaDataResultSet::get0Value(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"TIMESTAMP"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); + aRow[3] = ODatabaseMetaDataResultSet::get0Value(); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRow[15] = ODatabaseMetaDataResultSet::get0Value(); + aRows.push_back(aRow); pResult->setRows(std::move(aRows)); return pResult; @@ -192,10 +187,10 @@ Reference< XResultSet > SAL_CALL OComponentDatabaseMetaData::getColumns( switch(aRow[11]->getValue().getInt32()) { case ColumnValue::NO_NULLS: - aRow[18] = new ORowSetValueDecorator(OUString("NO")); + aRow[18] = new ORowSetValueDecorator(u"NO"_ustr); break; case ColumnValue::NULLABLE: - aRow[18] = new ORowSetValueDecorator(OUString("YES")); + aRow[18] = new ORowSetValueDecorator(u"YES"_ustr); break; default: aRow[18] = new ORowSetValueDecorator(OUString()); diff --git a/connectivity/source/drivers/component/CPreparedStatement.cxx b/connectivity/source/drivers/component/CPreparedStatement.cxx index 7c5c8e07f891..dc7dd01304b9 100644 --- a/connectivity/source/drivers/component/CPreparedStatement.cxx +++ b/connectivity/source/drivers/component/CPreparedStatement.cxx @@ -22,13 +22,12 @@ using namespace connectivity::component; using namespace connectivity::file; -using namespace com::sun::star::uno; rtl::Reference<OResultSet> OComponentPreparedStatement::createResultSet() { return new connectivity::component::OComponentResultSet(this,m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(OComponentPreparedStatement,"com.sun.star.sdbc.driver.component.PreparedStatement","com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(OComponentPreparedStatement,u"com.sun.star.sdbc.driver.component.PreparedStatement"_ustr,u"com.sun.star.sdbc.PreparedStatement"_ustr); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/component/CResultSet.cxx b/connectivity/source/drivers/component/CResultSet.cxx index acf5d6a74df8..8a170bab20d4 100644 --- a/connectivity/source/drivers/component/CResultSet.cxx +++ b/connectivity/source/drivers/component/CResultSet.cxx @@ -45,12 +45,12 @@ OComponentResultSet::OComponentResultSet( OStatement_Base* pStmt,connectivity::O OUString SAL_CALL OComponentResultSet::getImplementationName( ) { - return "com.sun.star.sdbcx.component.ResultSet"; + return u"com.sun.star.sdbcx.component.ResultSet"_ustr; } Sequence< OUString > SAL_CALL OComponentResultSet::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.ResultSet", "com.sun.star.sdbcx.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr, u"com.sun.star.sdbcx.ResultSet"_ustr }; } sal_Bool SAL_CALL OComponentResultSet::supportsService( const OUString& _rServiceName ) @@ -77,7 +77,7 @@ Any SAL_CALL OComponentResultSet::getBookmark( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - return makeAny((*m_aRow)[0]->getValue().getInt32()); + return Any((*m_aRow)[0]->getValue().getInt32()); } sal_Bool SAL_CALL OComponentResultSet::moveToBookmark( const Any& bookmark ) @@ -130,8 +130,7 @@ Sequence< sal_Int32 > SAL_CALL OComponentResultSet::deleteRows( const Sequence< ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XDeleteRows::deleteRows", *this ); - return Sequence< sal_Int32 >(); + ::dbtools::throwFeatureNotImplementedSQLException( u"XDeleteRows::deleteRows"_ustr, *this ); } bool OComponentResultSet::fillIndexValues(const Reference< XColumnsSupplier> &/*_xIndex*/) diff --git a/connectivity/source/drivers/component/CStatement.cxx b/connectivity/source/drivers/component/CStatement.cxx index f3bd03e8b276..61903e01ad08 100644 --- a/connectivity/source/drivers/component/CStatement.cxx +++ b/connectivity/source/drivers/component/CStatement.cxx @@ -22,14 +22,13 @@ using namespace connectivity::component; using namespace connectivity::file; -using namespace com::sun::star::uno; rtl::Reference<OResultSet> OComponentStatement::createResultSet() { return new connectivity::component::OComponentResultSet(this, m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(OComponentStatement, "com.sun.star.sdbc.driver.component.Statement", - "com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(OComponentStatement, u"com.sun.star.sdbc.driver.component.Statement"_ustr, + u"com.sun.star.sdbc.Statement"_ustr); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/component/CTable.cxx b/connectivity/source/drivers/component/CTable.cxx index 83dbf8a68830..6fe82dc830bb 100644 --- a/connectivity/source/drivers/component/CTable.cxx +++ b/connectivity/source/drivers/component/CTable.cxx @@ -25,15 +25,12 @@ using namespace connectivity; using namespace connectivity::component; using namespace connectivity::file; using namespace ::cppu; -using namespace ::dbtools; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::sheet; -using namespace ::com::sun::star::util; OComponentTable::OComponentTable(sdbcx::OCollection* _pTables,file::OConnection* _pConnection, @@ -104,8 +101,7 @@ Any SAL_CALL OComponentTable::queryInterface( const Type & rType ) rType == cppu::UnoType<XDataDescriptorFactory>::get()) return Any(); - const Any aRet = ::cppu::queryInterface(rType,static_cast< css::lang::XUnoTunnel*> (this)); - return aRet.hasValue() ? aRet : OTable_TYPEDEF::queryInterface(rType); + return OTable_TYPEDEF::queryInterface(rType); } diff --git a/connectivity/source/drivers/dbase/DCatalog.cxx b/connectivity/source/drivers/dbase/DCatalog.cxx index a8aaf89c529a..6af3440b6071 100644 --- a/connectivity/source/drivers/dbase/DCatalog.cxx +++ b/connectivity/source/drivers/dbase/DCatalog.cxx @@ -24,7 +24,6 @@ #include <com/sun/star/sdbc/XResultSet.hpp> using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; @@ -40,7 +39,7 @@ void ODbaseCatalog::refreshTables() { ::std::vector<OUString> aVector; Sequence<OUString> aTypes; - Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), "%", "%", aTypes); + Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), u"%"_ustr, u"%"_ustr, aTypes); if (xResult.is()) { diff --git a/connectivity/source/drivers/dbase/DColumns.cxx b/connectivity/source/drivers/dbase/DColumns.cxx index b997ec8d9087..4025fcc5a800 100644 --- a/connectivity/source/drivers/dbase/DColumns.cxx +++ b/connectivity/source/drivers/dbase/DColumns.cxx @@ -25,21 +25,17 @@ using namespace connectivity::dbase; using namespace connectivity; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -sdbcx::ObjectType ODbaseColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > ODbaseColumns::createObject(const OUString& _rName) { ODbaseTable* pTable = static_cast<ODbaseTable*>(m_pTable); const ::rtl::Reference<OSQLColumns>& aCols = pTable->getTableColumns(); OSQLColumns::const_iterator aIter = find(aCols->begin(),aCols->end(),_rName,::comphelper::UStringMixEqual(isCaseSensitive())); - sdbcx::ObjectType xRet; + css::uno::Reference< css::beans::XPropertySet > xRet; if(aIter != aCols->end()) - xRet = sdbcx::ObjectType(*aIter,UNO_QUERY); + xRet = *aIter; return xRet; } @@ -56,7 +52,7 @@ Reference< XPropertySet > ODbaseColumns::createDescriptor() // XAppend -sdbcx::ObjectType ODbaseColumns::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > ODbaseColumns::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { if ( m_pTable->isNew() ) return cloneDescriptor( descriptor ); diff --git a/connectivity/source/drivers/dbase/DConnection.cxx b/connectivity/source/drivers/dbase/DConnection.cxx index c9c7a93fa9f2..ab97a3aeeaa0 100644 --- a/connectivity/source/drivers/dbase/DConnection.cxx +++ b/connectivity/source/drivers/dbase/DConnection.cxx @@ -33,10 +33,8 @@ typedef connectivity::file::OConnection OConnection_BASE; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; ODbaseConnection::ODbaseConnection(ODriver* _pDriver) : OConnection(_pDriver) { @@ -49,7 +47,7 @@ ODbaseConnection::~ODbaseConnection() // XServiceInfo -IMPLEMENT_SERVICE_INFO(ODbaseConnection, "com.sun.star.sdbc.drivers.dbase.Connection", "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(ODbaseConnection, u"com.sun.star.sdbc.drivers.dbase.Connection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) Reference< XDatabaseMetaData > SAL_CALL ODbaseConnection::getMetaData( ) @@ -71,11 +69,11 @@ Reference< XDatabaseMetaData > SAL_CALL ODbaseConnection::getMetaData( ) css::uno::Reference< XTablesSupplier > ODbaseConnection::createCatalog() { ::osl::MutexGuard aGuard( m_aMutex ); - Reference< XTablesSupplier > xTab = m_xCatalog; + rtl::Reference< connectivity::sdbcx::OCatalog > xTab = m_xCatalog; if(!xTab.is()) { xTab = new ODbaseCatalog(this); - m_xCatalog = xTab; + m_xCatalog = xTab.get(); } return xTab; } @@ -104,9 +102,7 @@ Reference< XPreparedStatement > SAL_CALL ODbaseConnection::prepareStatement( con Reference< XPreparedStatement > SAL_CALL ODbaseConnection::prepareCall( const OUString& /*sql*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::prepareCall", *this ); - return nullptr; + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::prepareCall"_ustr, *this ); } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/dbase/DDatabaseMetaData.cxx b/connectivity/source/drivers/dbase/DDatabaseMetaData.cxx index bdff15cafa82..7e17e1fc0d79 100644 --- a/connectivity/source/drivers/dbase/DDatabaseMetaData.cxx +++ b/connectivity/source/drivers/dbase/DDatabaseMetaData.cxx @@ -54,98 +54,93 @@ ODbaseDatabaseMetaData::~ODbaseDatabaseMetaData() Reference< XResultSet > ODbaseDatabaseMetaData::impl_getTypeInfo_throw( ) { - ::osl::MutexGuard aGuard( m_aMutex ); - rtl::Reference<::connectivity::ODatabaseMetaDataResultSet> pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo); - static ODatabaseMetaDataResultSet::ORows aRows; - if(aRows.empty()) + ODatabaseMetaDataResultSet::ORows aRows; + aRows.reserve(10); + ODatabaseMetaDataResultSet::ORow aRow { - aRows.reserve(10); - ODatabaseMetaDataResultSet::ORow aRow - { - ODatabaseMetaDataResultSet::getEmptyValue(), - new ORowSetValueDecorator(OUString("VARCHAR")), - new ORowSetValueDecorator(DataType::VARCHAR), - new ORowSetValueDecorator(sal_Int32(254)), - ODatabaseMetaDataResultSet::getQuoteValue(), - ODatabaseMetaDataResultSet::getQuoteValue(), - new ORowSetValueDecorator(OUString("length")), - new ORowSetValueDecorator(sal_Int32(ColumnValue::NULLABLE)), - ODatabaseMetaDataResultSet::get1Value(), - new ORowSetValueDecorator(sal_Int32(ColumnSearch::FULL)), - ODatabaseMetaDataResultSet::get1Value(), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::get0Value(), - new ORowSetValueDecorator(OUString("C")), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::get0Value(), - ODatabaseMetaDataResultSet::getEmptyValue(), - ODatabaseMetaDataResultSet::getEmptyValue(), - new ORowSetValueDecorator(sal_Int32(10)) - }; - - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("LONGVARCHAR")); - aRow[2] = new ORowSetValueDecorator(DataType::LONGVARCHAR); - aRow[3] = new ORowSetValueDecorator(sal_Int32(2147483647)); - aRow[6] = new ORowSetValueDecorator(); - aRow[13] = new ORowSetValueDecorator(OUString("M")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("DATE")); - aRow[2] = new ORowSetValueDecorator(DataType::DATE); - aRow[3] = new ORowSetValueDecorator(sal_Int32(10)); - aRow[13] = new ORowSetValueDecorator(OUString("D")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("BOOLEAN")); - aRow[2] = new ORowSetValueDecorator(DataType::BIT); - aRow[3] = ODatabaseMetaDataResultSet::get1Value(); - aRow[4] = ODatabaseMetaDataResultSet::getEmptyValue(); - aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); - aRow[6] = new ORowSetValueDecorator(OUString()); - aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); - aRow[13] = new ORowSetValueDecorator(OUString("L")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("DOUBLE")); - aRow[2] = new ORowSetValueDecorator(DataType::DOUBLE); - aRow[3] = new ORowSetValueDecorator(sal_Int32(8)); - aRow[13] = new ORowSetValueDecorator(OUString("B")); - aRows.push_back(aRow); - - aRow[11] = new ORowSetValueDecorator(true); - aRow[13] = new ORowSetValueDecorator(OUString("Y")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("TIMESTAMP")); - aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); - aRow[11] = new ORowSetValueDecorator(false); - aRow[13] = new ORowSetValueDecorator(OUString("T")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("INTEGER")); - aRow[2] = new ORowSetValueDecorator(DataType::INTEGER); - aRow[3] = new ORowSetValueDecorator(sal_Int32(10)); - aRow[13] = new ORowSetValueDecorator(OUString("I")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("DECIMAL")); - aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); - aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); - aRow[6] = new ORowSetValueDecorator(OUString("length,scale")); - aRow[13] = new ORowSetValueDecorator(OUString("F")); - aRows.push_back(aRow); - - aRow[1] = new ORowSetValueDecorator(OUString("NUMERIC")); - aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); - aRow[3] = new ORowSetValueDecorator(sal_Int32(16)); - aRow[13] = new ORowSetValueDecorator(OUString("N")); - aRow[15] = new ORowSetValueDecorator(sal_Int32(16)); - aRows.push_back(aRow); - } + ODatabaseMetaDataResultSet::getEmptyValue(), + new ORowSetValueDecorator(u"VARCHAR"_ustr), + new ORowSetValueDecorator(DataType::VARCHAR), + new ORowSetValueDecorator(sal_Int32(254)), + ODatabaseMetaDataResultSet::getQuoteValue(), + ODatabaseMetaDataResultSet::getQuoteValue(), + new ORowSetValueDecorator(u"length"_ustr), + new ORowSetValueDecorator(sal_Int32(ColumnValue::NULLABLE)), + ODatabaseMetaDataResultSet::get1Value(), + new ORowSetValueDecorator(sal_Int32(ColumnSearch::FULL)), + ODatabaseMetaDataResultSet::get1Value(), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::get0Value(), + new ORowSetValueDecorator(u"C"_ustr), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::get0Value(), + ODatabaseMetaDataResultSet::getEmptyValue(), + ODatabaseMetaDataResultSet::getEmptyValue(), + new ORowSetValueDecorator(sal_Int32(10)) + }; + + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"LONGVARCHAR"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::LONGVARCHAR); + aRow[3] = new ORowSetValueDecorator(sal_Int32(2147483647)); + aRow[6] = new ORowSetValueDecorator(); + aRow[13] = new ORowSetValueDecorator(u"M"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"DATE"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::DATE); + aRow[3] = new ORowSetValueDecorator(sal_Int32(10)); + aRow[13] = new ORowSetValueDecorator(u"D"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"BOOLEAN"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::BIT); + aRow[3] = ODatabaseMetaDataResultSet::get1Value(); + aRow[4] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); + aRow[6] = new ORowSetValueDecorator(OUString()); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRow[13] = new ORowSetValueDecorator(u"L"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"DOUBLE"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::DOUBLE); + aRow[3] = new ORowSetValueDecorator(sal_Int32(8)); + aRow[13] = new ORowSetValueDecorator(u"B"_ustr); + aRows.push_back(aRow); + + aRow[11] = new ORowSetValueDecorator(ORowSetValue(true)); + aRow[13] = new ORowSetValueDecorator(u"Y"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"TIMESTAMP"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); + aRow[11] = new ORowSetValueDecorator(ORowSetValue(false)); + aRow[13] = new ORowSetValueDecorator(u"T"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"INTEGER"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::INTEGER); + aRow[3] = new ORowSetValueDecorator(sal_Int32(10)); + aRow[13] = new ORowSetValueDecorator(u"I"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"DECIMAL"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); + aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); + aRow[6] = new ORowSetValueDecorator(u"length,scale"_ustr); + aRow[13] = new ORowSetValueDecorator(u"F"_ustr); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(u"NUMERIC"_ustr); + aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); + aRow[3] = new ORowSetValueDecorator(sal_Int32(16)); + aRow[13] = new ORowSetValueDecorator(u"N"_ustr); + aRow[15] = new ORowSetValueDecorator(sal_Int32(16)); + aRows.push_back(aRow); pResult->setRows(std::move(aRows)); return pResult; @@ -171,35 +166,28 @@ Reference< XResultSet > SAL_CALL ODbaseDatabaseMetaData::getColumns( try { aRow[10] = new ORowSetValueDecorator(sal_Int32(10)); - Sequence< OUString> aTabNames(xNames->getElementNames()); - const OUString* pTabBegin = aTabNames.getConstArray(); - const OUString* pTabEnd = pTabBegin + aTabNames.getLength(); - for(;pTabBegin != pTabEnd;++pTabBegin) + for (auto& tabName : xNames->getElementNames()) { - if(match(tableNamePattern,*pTabBegin,'\0')) + if (match(tableNamePattern, tabName, '\0')) { - Reference< XColumnsSupplier> xTable( - xNames->getByName(*pTabBegin), css::uno::UNO_QUERY); + Reference<XColumnsSupplier> xTable(xNames->getByName(tabName), css::uno::UNO_QUERY); OSL_ENSURE(xTable.is(),"Table not found! Normally an exception had to be thrown here!"); - aRow[3] = new ORowSetValueDecorator(*pTabBegin); + aRow[3] = new ORowSetValueDecorator(tabName); Reference< XNameAccess> xColumns = xTable->getColumns(); if(!xColumns.is()) throw SQLException(); - Sequence< OUString> aColNames(xColumns->getElementNames()); - - const OUString* pBegin = aColNames.getConstArray(); - const OUString* pEnd = pBegin + aColNames.getLength(); Reference< XPropertySet> xColumn; - for(sal_Int32 i=1;pBegin != pEnd;++pBegin,++i) + sal_Int32 i = 0; + for (auto& colName : xColumns->getElementNames()) { - if(match(columnNamePattern,*pBegin,'\0')) + ++i; + if (match(columnNamePattern, colName, '\0')) { - aRow[4] = new ORowSetValueDecorator(*pBegin); + aRow[4] = new ORowSetValueDecorator(colName); - xColumn.set( - xColumns->getByName(*pBegin), css::uno::UNO_QUERY); + xColumn.set(xColumns->getByName(colName), css::uno::UNO_QUERY); OSL_ENSURE(xColumn.is(),"Columns contains a column who isn't a fastpropertyset!"); aRow[5] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))); aRow[6] = new ORowSetValueDecorator(getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME)))); @@ -223,10 +211,10 @@ Reference< XResultSet > SAL_CALL ODbaseDatabaseMetaData::getColumns( switch(aRow[11]->getValue().getInt32()) { case ColumnValue::NO_NULLS: - aRow[18] = new ORowSetValueDecorator(OUString("NO")); + aRow[18] = new ORowSetValueDecorator(u"NO"_ustr); break; case ColumnValue::NULLABLE: - aRow[18] = new ORowSetValueDecorator(OUString("YES")); + aRow[18] = new ORowSetValueDecorator(u"YES"_ustr); break; default: aRow[18] = new ORowSetValueDecorator(OUString()); @@ -268,7 +256,7 @@ Reference< XResultSet > SAL_CALL ODbaseDatabaseMetaData::getIndexInfo( ODatabaseMetaDataResultSet::ORow aRow(14); aRow[5] = new ORowSetValueDecorator(OUString()); - aRow[10] = new ORowSetValueDecorator(OUString("A")); + aRow[10] = new ORowSetValueDecorator(u"A"_ustr); Reference< XIndexesSupplier> xTable( xNames->getByName(table), css::uno::UNO_QUERY); @@ -279,22 +267,18 @@ Reference< XResultSet > SAL_CALL ODbaseDatabaseMetaData::getIndexInfo( if(!xIndexes.is()) throw SQLException(); - Sequence< OUString> aIdxNames(xIndexes->getElementNames()); - - const OUString* pBegin = aIdxNames.getConstArray(); - const OUString* pEnd = pBegin + aIdxNames.getLength(); Reference< XPropertySet> xIndex; - for(;pBegin != pEnd;++pBegin) + for (auto& idxName : xIndexes->getElementNames()) { - xIndex.set(xIndexes->getByName(*pBegin), css::uno::UNO_QUERY); + xIndex.set(xIndexes->getByName(idxName), css::uno::UNO_QUERY); OSL_ENSURE(xIndex.is(),"Indexes contains a column who isn't a fastpropertyset!"); if(unique && !getBOOL(xIndex->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISUNIQUE)))) continue; - aRow[4] = new ORowSetValueDecorator(getBOOL(xIndex->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISUNIQUE)))); - aRow[6] = new ORowSetValueDecorator(*pBegin); + aRow[4] = new ORowSetValueDecorator(ORowSetValue(getBOOL(xIndex->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISUNIQUE))))); + aRow[6] = new ORowSetValueDecorator(idxName); - auto pIndex = comphelper::getFromUnoTunnel<ODbaseIndex>(xIndex); + auto pIndex = dynamic_cast<ODbaseIndex*>(xIndex.get()); if(pIndex) { aRow[11] = new ORowSetValueDecorator(static_cast<sal_Int32>(pIndex->getHeader().db_maxkeys)); @@ -303,14 +287,12 @@ Reference< XResultSet > SAL_CALL ODbaseDatabaseMetaData::getIndexInfo( Reference<XColumnsSupplier> xColumnsSup(xIndex,UNO_QUERY); Reference< XNameAccess> xColumns = xColumnsSup->getColumns(); - Sequence< OUString> aColNames(xColumns->getElementNames()); - const OUString* pColBegin = aColNames.getConstArray(); - const OUString* pColEnd = pColBegin + aColNames.getLength(); - for(sal_Int32 j=1;pColBegin != pColEnd;++pColBegin,++j) + sal_Int32 j = 0; + for (auto& colName : xColumns->getElementNames()) { - aRow[8] = new ORowSetValueDecorator(j); - aRow[9] = new ORowSetValueDecorator(*pColBegin); + aRow[8] = new ORowSetValueDecorator(++j); + aRow[9] = new ORowSetValueDecorator(colName); aRows.push_back(aRow); } } @@ -367,7 +349,7 @@ sal_Bool SAL_CALL ODbaseDatabaseMetaData::isReadOnly( ) bool bReadOnly = false; ::ucbhelper::Content aFile(m_pConnection->getContent(),Reference< XCommandEnvironment >(), comphelper::getProcessComponentContext()); - aFile.getPropertyValue("IsReadOnly") >>= bReadOnly; + aFile.getPropertyValue(u"IsReadOnly"_ustr) >>= bReadOnly; return bReadOnly; } diff --git a/connectivity/source/drivers/dbase/DDriver.cxx b/connectivity/source/drivers/dbase/DDriver.cxx index 8eae0013c940..36d44951f0f2 100644 --- a/connectivity/source/drivers/dbase/DDriver.cxx +++ b/connectivity/source/drivers/dbase/DDriver.cxx @@ -36,7 +36,7 @@ using namespace ::com::sun::star::lang; OUString SAL_CALL ODriver::getImplementationName( ) { - return "com.sun.star.comp.sdbc.dbase.ODriver"; + return u"com.sun.star.comp.sdbc.dbase.ODriver"_ustr; } @@ -51,7 +51,7 @@ connectivity_dbase_ODriver( } if (ret) ret->acquire(); - return static_cast<cppu::OWeakObject*>(ret.get()); + return getXWeak(ret.get()); } @@ -66,7 +66,7 @@ Reference< XConnection > SAL_CALL ODriver::connect( const OUString& url, const S rtl::Reference<ODbaseConnection> pCon = new ODbaseConnection(this); pCon->construct(url,info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon.get()); return pCon; } @@ -80,29 +80,29 @@ Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const OUString { if ( acceptsURL(url) ) { - Sequence< OUString > aBoolean { "0", "1" }; + Sequence< OUString > aBoolean { u"0"_ustr, u"1"_ustr }; return { { - "CharSet" - ,"CharSet of the database." + u"CharSet"_ustr + ,u"CharSet of the database."_ustr ,false ,OUString() ,Sequence< OUString >() }, { - "ShowDeleted" - ,"Display inactive records." + u"ShowDeleted"_ustr + ,u"Display inactive records."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "EnableSQL92Check" - ,"Use SQL92 naming constraints." + u"EnableSQL92Check"_ustr + ,u"Use SQL92 naming constraints."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean } }; @@ -111,7 +111,6 @@ Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const OUString SharedResources aResources; const OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); ::dbtools::throwGenericSQLException(sMessage ,*this); - return Sequence< DriverPropertyInfo >(); } diff --git a/connectivity/source/drivers/dbase/DIndex.cxx b/connectivity/source/drivers/dbase/DIndex.cxx index 245c49b58e2f..1c32440e6b89 100644 --- a/connectivity/source/drivers/dbase/DIndex.cxx +++ b/connectivity/source/drivers/dbase/DIndex.cxx @@ -41,15 +41,12 @@ using namespace connectivity; using namespace utl; using namespace ::cppu; using namespace connectivity::file; -using namespace connectivity::sdbcx; using namespace connectivity::dbase; using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; using namespace com::sun::star::uno; using namespace com::sun::star::beans; -using namespace com::sun::star::lang; -IMPLEMENT_SERVICE_INFO(ODbaseIndex,"com.sun.star.sdbcx.driver.dbase.Index","com.sun.star.sdbcx.Index"); +IMPLEMENT_SERVICE_INFO(ODbaseIndex,u"com.sun.star.sdbcx.driver.dbase.Index"_ustr,u"com.sun.star.sdbcx.Index"_ustr); ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(true/*_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()*/) @@ -99,20 +96,6 @@ void ODbaseIndex::refreshColumns() m_pColumns.reset(new ODbaseIndexColumns(this,m_aMutex,aVector)); } -Sequence< sal_Int8 > ODbaseIndex::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// XUnoTunnel - -sal_Int64 ODbaseIndex::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<ODbaseIndex_BASE>{}); -} - ONDXPagePtr const & ODbaseIndex::getRoot() { openIndexFile(); @@ -401,8 +384,7 @@ void ODbaseIndex::createINFEntry() bool bCase = isCaseSensitive(); while (aNewEntry.isEmpty()) { - aNewEntry = OString("NDX"); - aNewEntry += OString::number(++nSuffix); + aNewEntry = "NDX" + OString::number(++nSuffix); for (sal_uInt16 i = 0; i < aInfFile.GetKeyCount(); i++) { aKeyName = aInfFile.GetKeyName(i); @@ -565,15 +547,13 @@ void ODbaseIndex::CreateImpl() if(xSet->last()) { - Reference< XUnoTunnel> xTunnel(xSet, UNO_QUERY_THROW); - ODbaseResultSet* pDbaseRes = comphelper::getFromUnoTunnel<ODbaseResultSet>(xTunnel); + ODbaseResultSet* pDbaseRes = dynamic_cast<ODbaseResultSet*>(xSet.getTyped().get()); assert(pDbaseRes); //"No dbase resultset found? What's going on here! nRowsLeft = xSet->getRow(); xSet->beforeFirst(); - ORowSetValue atmpValue; - ONDXKey aKey(atmpValue, nType, 0); - ONDXKey aInsertKey(atmpValue, nType, 0); + ONDXKey aKey(ORowSetValue(), nType, 0); + ONDXKey aInsertKey(ORowSetValue(), nType, 0); // Create the index structure while (xSet->next()) { diff --git a/connectivity/source/drivers/dbase/DIndexColumns.cxx b/connectivity/source/drivers/dbase/DIndexColumns.cxx index 886c7273db31..dbf8f59a43c9 100644 --- a/connectivity/source/drivers/dbase/DIndexColumns.cxx +++ b/connectivity/source/drivers/dbase/DIndexColumns.cxx @@ -28,12 +28,10 @@ using namespace connectivity::dbase; using namespace connectivity; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -sdbcx::ObjectType ODbaseIndexColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > ODbaseIndexColumns::createObject(const OUString& _rName) { const ODbaseTable* pTable = m_pIndex->getTable(); @@ -45,9 +43,9 @@ sdbcx::ObjectType ODbaseIndexColumns::createObject(const OUString& _rName) xCol = *aIter; if(!xCol.is()) - return sdbcx::ObjectType(); + return css::uno::Reference< css::beans::XPropertySet >(); - sdbcx::ObjectType xRet = new sdbcx::OIndexColumn(true,_rName + css::uno::Reference< css::beans::XPropertySet > xRet = new sdbcx::OIndexColumn(true,_rName ,getString(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))) ,OUString() ,getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))) @@ -73,7 +71,7 @@ Reference< XPropertySet > ODbaseIndexColumns::createDescriptor() return new sdbcx::OIndexColumn(m_pIndex->getTable()->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers()); } -sdbcx::ObjectType ODbaseIndexColumns::appendObject( const OUString& /*_rForName*/, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > ODbaseIndexColumns::appendObject( const OUString& /*_rForName*/, const Reference< XPropertySet >& descriptor ) { return cloneDescriptor( descriptor ); } diff --git a/connectivity/source/drivers/dbase/DIndexIter.cxx b/connectivity/source/drivers/dbase/DIndexIter.cxx index 37e28a073f4c..35f5862b1bc2 100644 --- a/connectivity/source/drivers/dbase/DIndexIter.cxx +++ b/connectivity/source/drivers/dbase/DIndexIter.cxx @@ -109,7 +109,7 @@ ONDXKey* OIndexIterator::GetFirstKey(ONDXPage* pPage, const OOperand& rKey) pFoundKey = nullptr; m_aCurLeaf = pPage; - m_nCurNode = pFoundKey ? i : i - 1; + m_nCurNode = pFoundKey ? i : sal_uInt16(i - 1); } return pFoundKey; } @@ -262,7 +262,8 @@ ONDXKey* OIndexIterator::GetNextKey() sal_uInt16 nPos = pParentPage->Search(pPage); if (nPos != pParentPage->Count() - 1) { // page found - pPage = (*pParentPage)[nPos + 1].GetChild(m_xIndex.get(), pParentPage); + pPage = (*pParentPage)[o3tl::sanitizing_inc(nPos)].GetChild(m_xIndex.get(), + pParentPage); break; } } diff --git a/connectivity/source/drivers/dbase/DIndexes.cxx b/connectivity/source/drivers/dbase/DIndexes.cxx index 7f47085c6509..1ade0679216c 100644 --- a/connectivity/source/drivers/dbase/DIndexes.cxx +++ b/connectivity/source/drivers/dbase/DIndexes.cxx @@ -24,20 +24,14 @@ #include <unotools/ucbhelper.hxx> #include <strings.hrc> -using namespace ::comphelper; - using namespace utl; using namespace ::connectivity; using namespace ::dbtools; using namespace ::connectivity::dbase; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; -sdbcx::ObjectType ODbaseIndexes::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > ODbaseIndexes::createObject(const OUString& _rName) { OUString sFile = m_pTable->getConnection()->getURL() + OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DELIMITER) + @@ -51,23 +45,8 @@ sdbcx::ObjectType ODbaseIndexes::createObject(const OUString& _rName) ::dbtools::throwGenericSQLException( sError, *m_pTable ); } - sdbcx::ObjectType xRet; std::unique_ptr<SvStream> pFileStream = ::connectivity::file::OFileTable::createStream_simpleError(sFile, StreamMode::READ | StreamMode::NOCREATE | StreamMode::SHARE_DENYWRITE); - if(pFileStream) - { - pFileStream->SetEndian(SvStreamEndian::LITTLE); - pFileStream->SetBufferSize(DINDEX_PAGE_SIZE); - ODbaseIndex::NDXHeader aHeader; - - pFileStream->Seek(0); - ReadHeader(*pFileStream, aHeader); - pFileStream.reset(); - - rtl::Reference<ODbaseIndex> pIndex = new ODbaseIndex(m_pTable,aHeader,_rName); - xRet = pIndex; - pIndex->openIndexFile(); - } - else + if(!pFileStream) { const OUString sError( m_pTable->getConnection()->getResources().getResourceStringWithSubstitution( STR_COULD_NOT_LOAD_FILE, @@ -75,7 +54,18 @@ sdbcx::ObjectType ODbaseIndexes::createObject(const OUString& _rName) ) ); ::dbtools::throwGenericSQLException( sError, *m_pTable ); } - return xRet; + + pFileStream->SetEndian(SvStreamEndian::LITTLE); + pFileStream->SetBufferSize(DINDEX_PAGE_SIZE); + ODbaseIndex::NDXHeader aHeader; + + pFileStream->Seek(0); + ReadHeader(*pFileStream, aHeader); + pFileStream.reset(); + + rtl::Reference<ODbaseIndex> pIndex = new ODbaseIndex(m_pTable,aHeader,_rName); + pIndex->openIndexFile(); + return pIndex; } void ODbaseIndexes::impl_refresh( ) @@ -90,16 +80,11 @@ Reference< XPropertySet > ODbaseIndexes::createDescriptor() } // XAppend -sdbcx::ObjectType ODbaseIndexes::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > ODbaseIndexes::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { - Reference<XUnoTunnel> xTunnel(descriptor,UNO_QUERY); - if(xTunnel.is()) - { - ODbaseIndex* pIndex = comphelper::getFromUnoTunnel<ODbaseIndex>(xTunnel); - if(!pIndex) - throw SQLException(); + ODbaseIndex* pIndex = dynamic_cast<ODbaseIndex*>(descriptor.get()); + if(pIndex) pIndex->CreateImpl(); - } return createObject( _rForName ); } @@ -107,7 +92,7 @@ sdbcx::ObjectType ODbaseIndexes::appendObject( const OUString& _rForName, const // XDrop void ODbaseIndexes::dropObject(sal_Int32 _nPos, const OUString& /*_sElementName*/) { - auto pIndex = comphelper::getFromUnoTunnel<ODbaseIndex>(getObject(_nPos)); + rtl::Reference<ODbaseIndex> pIndex = dynamic_cast<ODbaseIndex*>(getObject(_nPos).get()); if ( pIndex ) pIndex->DropImpl(); } diff --git a/connectivity/source/drivers/dbase/DPreparedStatement.cxx b/connectivity/source/drivers/dbase/DPreparedStatement.cxx index 9a2b54409bea..3dc39e68857a 100644 --- a/connectivity/source/drivers/dbase/DPreparedStatement.cxx +++ b/connectivity/source/drivers/dbase/DPreparedStatement.cxx @@ -22,14 +22,14 @@ using namespace connectivity::dbase; using namespace connectivity::file; -using namespace com::sun::star::uno; rtl::Reference<OResultSet> ODbasePreparedStatement::createResultSet() { return new ODbaseResultSet(this, m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(ODbasePreparedStatement, "com.sun.star.sdbc.driver.dbase.PreparedStatement", - "com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(ODbasePreparedStatement, + u"com.sun.star.sdbc.driver.dbase.PreparedStatement"_ustr, + u"com.sun.star.sdbc.PreparedStatement"_ustr); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/dbase/DResultSet.cxx b/connectivity/source/drivers/dbase/DResultSet.cxx index 3533477bb0cf..99357a01fcc8 100644 --- a/connectivity/source/drivers/dbase/DResultSet.cxx +++ b/connectivity/source/drivers/dbase/DResultSet.cxx @@ -49,12 +49,12 @@ ODbaseResultSet::ODbaseResultSet( OStatement_Base* pStmt,connectivity::OSQLParse OUString SAL_CALL ODbaseResultSet::getImplementationName( ) { - return "com.sun.star.sdbcx.dbase.ResultSet"; + return u"com.sun.star.sdbcx.dbase.ResultSet"_ustr; } Sequence< OUString > SAL_CALL ODbaseResultSet::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.ResultSet", "com.sun.star.sdbcx.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr, u"com.sun.star.sdbcx.ResultSet"_ustr }; } sal_Bool SAL_CALL ODbaseResultSet::supportsService( const OUString& _rServiceName ) @@ -81,7 +81,7 @@ Any SAL_CALL ODbaseResultSet::getBookmark( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); OSL_ENSURE((m_bShowDeleted || !m_aRow->isDeleted()),"getBookmark called for deleted row"); - return makeAny((*m_aRow)[0]->getValue().getInt32()); + return Any((*m_aRow)[0]->getValue().getInt32()); } sal_Bool SAL_CALL ODbaseResultSet::moveToBookmark( const Any& bookmark ) @@ -149,13 +149,12 @@ Sequence< sal_Int32 > SAL_CALL ODbaseResultSet::deleteRows( const Sequence< An ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XDeleteRows::deleteRows", *this ); - return Sequence< sal_Int32 >(); + ::dbtools::throwFeatureNotImplementedSQLException( u"XDeleteRows::deleteRows"_ustr, *this ); } bool ODbaseResultSet::fillIndexValues(const Reference< XColumnsSupplier> &_xIndex) { - auto pIndex = comphelper::getFromUnoTunnel<dbase::ODbaseIndex>(_xIndex); + auto pIndex = dynamic_cast<dbase::ODbaseIndex*>(_xIndex.get()); if(pIndex) { std::unique_ptr<dbase::OIndexIterator> pIter = pIndex->createIterator(); diff --git a/connectivity/source/drivers/dbase/DStatement.cxx b/connectivity/source/drivers/dbase/DStatement.cxx index d2537232778e..c6245e852d31 100644 --- a/connectivity/source/drivers/dbase/DStatement.cxx +++ b/connectivity/source/drivers/dbase/DStatement.cxx @@ -22,7 +22,6 @@ using namespace connectivity::dbase; using namespace connectivity::file; -using namespace com::sun::star::uno; rtl::Reference<OResultSet> ODbaseStatement::createResultSet() @@ -30,6 +29,6 @@ rtl::Reference<OResultSet> ODbaseStatement::createResultSet() return new ODbaseResultSet(this,m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(ODbaseStatement,"com.sun.star.sdbc.driver.dbase.Statement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(ODbaseStatement,u"com.sun.star.sdbc.driver.dbase.Statement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index c5da1d6b2477..c7b6802209fd 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -28,7 +28,7 @@ #include <dbase/DConnection.hxx> #include <dbase/DColumns.hxx> #include <tools/config.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <dbase/DIndex.hxx> #include <dbase/DIndexes.hxx> #include <comphelper/processfactory.hxx> @@ -39,8 +39,9 @@ #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> #include <comphelper/property.hxx> #include <comphelper/servicehelper.hxx> +#include <o3tl/string_view.hxx> #include <comphelper/string.hxx> -#include <unotools/configmgr.hxx> +#include <comphelper/configuration.hxx> #include <unotools/tempfile.hxx> #include <unotools/ucbhelper.hxx> #include <comphelper/types.hxx> @@ -54,6 +55,7 @@ #include <rtl/strbuf.hxx> #include <sal/log.hxx> #include <tools/date.hxx> +#include <i18nutil/calendar.hxx> #include <algorithm> #include <cassert> @@ -132,13 +134,13 @@ void lcl_CalcJulDate(sal_Int32& _nJulianDate,sal_Int32& _nJulianTime, const css: if ( aDateTime.Year <= 0 ) { _nJulianDate = static_cast<sal_Int32>((365.25 * iy0) - 0.75) - + static_cast<sal_Int32>(30.6001 * (im0 + 1) ) + + static_cast<sal_Int32>(i18nutil::monthDaysWithoutJanFeb * (im0 + 1) ) + aDateTime.Day + 1720994; } // if ( rDateTime.Year <= 0 ) else { _nJulianDate = static_cast<sal_Int32>(365.25 * iy0) - + static_cast<sal_Int32>(30.6001 * (im0 + 1)) + + static_cast<sal_Int32>(i18nutil::monthDaysWithoutJanFeb * (im0 + 1)) + aDateTime.Day + 1720994; } double JD = _nJulianDate + 0.5; @@ -164,8 +166,8 @@ void lcl_CalDate(sal_Int32 _nJulianDate,sal_Int32 _nJulianTime,css::util::DateTi sal_Int64 kb = ka + 1524; sal_Int64 kc = static_cast<sal_Int64>((static_cast<double>(kb) - 122.1) / 365.25); sal_Int64 kd = static_cast<sal_Int64>(static_cast<double>(kc) * 365.25); - sal_Int64 ke = static_cast<sal_Int64>(static_cast<double>(kb - kd) / 30.6001); - _rDateTime.Day = static_cast<sal_uInt16>(kb - kd - static_cast<sal_Int64>( static_cast<double>(ke) * 30.6001 )); + sal_Int64 ke = static_cast<sal_Int64>(static_cast<double>(kb - kd) / i18nutil::monthDaysWithoutJanFeb); + _rDateTime.Day = static_cast<sal_uInt16>(kb - kd - static_cast<sal_Int64>( static_cast<double>(ke) * i18nutil::monthDaysWithoutJanFeb )); if ( ke > 13 ) _rDateTime.Month = static_cast<sal_uInt16>(ke - 13); else @@ -737,14 +739,12 @@ Sequence< Type > SAL_CALL ODbaseTable::getTypes( ) std::vector<Type> aOwnTypes; aOwnTypes.reserve(aTypes.getLength()); - const Type* pBegin = aTypes.getConstArray(); - const Type* pEnd = pBegin + aTypes.getLength(); - for(;pBegin != pEnd;++pBegin) + for (auto& type : aTypes) { - if(*pBegin != cppu::UnoType<XKeysSupplier>::get() && - *pBegin != cppu::UnoType<XDataDescriptorFactory>::get()) + if(type != cppu::UnoType<XKeysSupplier>::get() && + type != cppu::UnoType<XDataDescriptorFactory>::get()) { - aOwnTypes.push_back(*pBegin); + aOwnTypes.push_back(type); } } aOwnTypes.push_back(cppu::UnoType<css::lang::XUnoTunnel>::get()); @@ -759,31 +759,17 @@ Any SAL_CALL ODbaseTable::queryInterface( const Type & rType ) return Any(); Any aRet = OTable_TYPEDEF::queryInterface(rType); - return aRet.hasValue() ? aRet : ::cppu::queryInterface(rType,static_cast< css::lang::XUnoTunnel*> (this)); + return aRet; } -Sequence< sal_Int8 > ODbaseTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 ODbaseTable::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<ODbaseTable_BASE>{}); -} - bool ODbaseTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool bRetrieveData) { if (!m_pBuffer) return false; // Read the data - bool bIsCurRecordDeleted = static_cast<char>(m_pBuffer[0]) == '*'; + bool bIsCurRecordDeleted = m_pBuffer[0] == '*'; // only read the bookmark @@ -855,8 +841,8 @@ bool ODbaseTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool } else { - // Commit the string. Use intern() to ref-count it. - *(*_rRow)[i] = OUString::intern(pData, static_cast<sal_Int32>(nLastPos+1), m_eEncoding); + // Commit the string + *(*_rRow)[i] = OUString(pData, static_cast<sal_Int32>(nLastPos+1), m_eEncoding); } } // if (nType == DataType::CHAR || nType == DataType::VARCHAR) else if ( DataType::TIMESTAMP == nType ) @@ -940,20 +926,20 @@ bool ODbaseTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool continue; } - OUString aStr = OUString::intern(pData+nPos1, nPos2-nPos1+1, m_eEncoding); + OUString aStr(pData+nPos1, nPos2-nPos1+1, m_eEncoding); switch (nType) { case DataType::DATE: { - if (aStr.getLength() != nLen) + if (nLen < 8 || aStr.getLength() != nLen) { (*_rRow)[i]->setNull(); break; } - const sal_uInt16 nYear = static_cast<sal_uInt16>(aStr.copy( 0, 4 ).toInt32()); - const sal_uInt16 nMonth = static_cast<sal_uInt16>(aStr.copy( 4, 2 ).toInt32()); - const sal_uInt16 nDay = static_cast<sal_uInt16>(aStr.copy( 6, 2 ).toInt32()); + const sal_uInt16 nYear = static_cast<sal_uInt16>(o3tl::toInt32(aStr.subView( 0, 4 ))); + const sal_uInt16 nMonth = static_cast<sal_uInt16>(o3tl::toInt32(aStr.subView( 4, 2 ))); + const sal_uInt16 nDay = static_cast<sal_uInt16>(o3tl::toInt32(aStr.subView( 6, 2 ))); const css::util::Date aDate(nDay,nMonth,nYear); *(*_rRow)[i] = aDate; @@ -1004,9 +990,6 @@ bool ODbaseTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool void ODbaseTable::FileClose() { ::osl::MutexGuard aGuard(m_aMutex); - // if not everything has been written yet - if (m_pMemoStream && m_pMemoStream->IsWritable()) - m_pMemoStream->Flush(); m_pMemoStream.reset(); @@ -1017,7 +1000,7 @@ bool ODbaseTable::CreateImpl() { OSL_ENSURE(!m_pFileStream, "SequenceError"); - if ( m_pConnection->isCheckEnabled() && ::dbtools::convertName2SQLName(m_Name,OUString()) != m_Name ) + if ( m_pConnection->isCheckEnabled() && ::dbtools::convertName2SQLName(m_Name, u"") != m_Name ) { const OUString sError( getConnection()->getResources().getResourceStringWithSubstitution( STR_SQL_NAME_ERROR, @@ -1069,7 +1052,7 @@ bool ODbaseTable::CreateImpl() try { Content aContent(aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE),Reference<XCommandEnvironment>(), comphelper::getProcessComponentContext()); - aContent.executeCommand( "delete", css::uno::Any( true ) ); + aContent.executeCommand( u"delete"_ustr, css::uno::Any( true ) ); } catch(const Exception&) // an exception is thrown when no file exists { @@ -1097,7 +1080,7 @@ bool ODbaseTable::CreateImpl() try { Content aMemoContent(aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE),Reference<XCommandEnvironment>(), comphelper::getProcessComponentContext()); - aMemoContent.executeCommand( "delete", css::uno::Any( true ) ); + aMemoContent.executeCommand( u"delete"_ustr, css::uno::Any( true ) ); } catch(const Exception&) { @@ -1115,7 +1098,7 @@ bool ODbaseTable::CreateImpl() try { Content aMemoContent(aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE),Reference<XCommandEnvironment>(), comphelper::getProcessComponentContext()); - aMemoContent.executeCommand( "delete", css::uno::Any( true ) ); + aMemoContent.executeCommand( u"delete"_ustr, css::uno::Any( true ) ); } catch(const ContentCreationException&) { @@ -1398,7 +1381,7 @@ bool ODbaseTable::CreateFile(const INetURLObject& aFile, bool& bCreateMemo) bool ODbaseTable::HasMemoFields() const { - return m_aHeader.type > dBaseIV && !utl::ConfigManager::IsFuzzing(); + return m_aHeader.type > dBaseIV && !comphelper::IsFuzzing(); } // creates in principle dBase III file format @@ -1415,12 +1398,11 @@ bool ODbaseTable::CreateMemoFile(const INetURLObject& aFile) m_pMemoStream->Seek(0); (*m_pMemoStream).WriteUInt32( 1 ); // pointer to the first free block - m_pMemoStream->Flush(); m_pMemoStream.reset(); return true; } -bool ODbaseTable::Drop_Static(const OUString& _sUrl, bool _bHasMemoFields, OCollection* _pIndexes ) +bool ODbaseTable::Drop_Static(std::u16string_view _sUrl, bool _bHasMemoFields, OCollection* _pIndexes ) { INetURLObject aURL; aURL.SetURL(_sUrl); @@ -1457,7 +1439,7 @@ bool ODbaseTable::Drop_Static(const OUString& _sUrl, bool _bHasMemoFields, OColl try { ::ucbhelper::Content aDeleteContent( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), Reference< XCommandEnvironment >(), comphelper::getProcessComponentContext() ); - aDeleteContent.executeCommand( "delete", makeAny( true ) ); + aDeleteContent.executeCommand( u"delete"_ustr, Any( true ) ); } catch(const Exception&) { @@ -1599,9 +1581,7 @@ bool ODbaseTable::DeleteRow(const OSQLColumns& _rCols) { xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aColName; - Reference<XUnoTunnel> xTunnel(xIndex,UNO_QUERY); - OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!"); - ODbaseIndex* pIndex = comphelper::getFromUnoTunnel<ODbaseIndex>(xTunnel); + ODbaseIndex* pIndex = dynamic_cast<ODbaseIndex*>(xIndex.get()); assert(pIndex && "ODbaseTable::DeleteRow: No Index returned!"); OSQLColumns::const_iterator aIter = std::find_if(_rCols.begin(), _rCols.end(), @@ -1650,7 +1630,7 @@ Reference<XPropertySet> ODbaseTable::isUniqueByColumnName(sal_Int32 _nColumnPos) return Reference<XPropertySet>(); } -static double toDouble(const OString& rString) +static double toDouble(std::string_view rString) { return ::rtl::math::stringToDouble( rString, '.', ',' ); } @@ -1705,9 +1685,7 @@ bool ODbaseTable::UpdateBuffer(OValueRefVector& rRow, const OValueRefRow& pOrgRo continue; else { - Reference<XUnoTunnel> xTunnel(xIndex,UNO_QUERY); - OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!"); - ODbaseIndex* pIndex = comphelper::getFromUnoTunnel<ODbaseIndex>(xTunnel); + ODbaseIndex* pIndex = dynamic_cast<ODbaseIndex*>(xIndex.get()); assert(pIndex && "ODbaseTable::UpdateBuffer: No Index returned!"); if (pIndex->Find(0,*rRow[nPos])) @@ -1813,9 +1791,7 @@ bool ODbaseTable::UpdateBuffer(OValueRefVector& rRow, const OValueRefRow& pOrgRo } if (aIndexedCols[i].is()) { - Reference<XUnoTunnel> xTunnel(aIndexedCols[i],UNO_QUERY); - OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!"); - ODbaseIndex* pIndex = comphelper::getFromUnoTunnel<ODbaseIndex>(xTunnel); + ODbaseIndex* pIndex = dynamic_cast<ODbaseIndex*>(aIndexedCols[i].get()); assert(pIndex && "ODbaseTable::UpdateBuffer: No Index returned!"); // Update !! if (pOrgRow.is() && !thisColIsNull) @@ -2194,8 +2170,7 @@ void ODbaseTable::alterColumn(sal_Int32 index, OUString sTempName = createTempFile(); rtl::Reference<ODbaseTable> pNewTable = new ODbaseTable(m_pTables,static_cast<ODbaseConnection*>(m_pConnection)); - Reference<XPropertySet> xHoldTable = pNewTable; - pNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(sTempName)); + pNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),Any(sTempName)); Reference<XAppend> xAppend(pNewTable->getColumns(),UNO_QUERY); OSL_ENSURE(xAppend.is(),"ODbaseTable::alterColumn: No XAppend interface!"); @@ -2263,8 +2238,8 @@ void ODbaseTable::alterColumn(sal_Int32 index, ::dbtools::throwGenericSQLException( sError, *this ); } // release the temp file + ::comphelper::disposeComponent(pNewTable); pNewTable = nullptr; - ::comphelper::disposeComponent(xHoldTable); } else { @@ -2332,14 +2307,14 @@ namespace { Content aContent(aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE),Reference<XCommandEnvironment>(), comphelper::getProcessComponentContext()); - Sequence< PropertyValue > aProps{ { "Title", + Sequence< PropertyValue > aProps{ { u"Title"_ustr, -1, // n/a Any(sNewName), css::beans::PropertyState_DIRECT_VALUE } }; Sequence< Any > aValues; - aContent.executeCommand( "setPropertyValues",makeAny(aProps) ) >>= aValues; + aContent.executeCommand( u"setPropertyValues"_ustr,Any(aProps) ) >>= aValues; if(aValues.hasElements() && aValues[0].hasValue()) - throw Exception("setPropertyValues returned non-zero", nullptr); + throw Exception(u"setPropertyValues returned non-zero"_ustr, nullptr); } catch(const Exception&) { @@ -2367,7 +2342,7 @@ void ODbaseTable::addColumn(const Reference< XPropertySet >& _xNewColumn) OUString sTempName = createTempFile(); rtl::Reference xNewTable(new ODbaseTable(m_pTables,static_cast<ODbaseConnection*>(m_pConnection))); - xNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(sTempName)); + xNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),Any(sTempName)); { Reference<XAppend> xAppend(xNewTable->getColumns(),UNO_QUERY); bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); @@ -2425,7 +2400,7 @@ void ODbaseTable::dropColumn(sal_Int32 _nPos) OUString sTempName = createTempFile(); rtl::Reference xNewTable(new ODbaseTable(m_pTables,static_cast<ODbaseConnection*>(m_pConnection))); - xNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(sTempName)); + xNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),Any(sTempName)); { Reference<XAppend> xAppend(xNewTable->getColumns(),UNO_QUERY); bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); @@ -2479,16 +2454,14 @@ OUString ODbaseTable::createTempFile() if ( aIdent.lastIndexOf('/') != (aIdent.getLength()-1) ) aIdent += "/"; - OUString sTempName(aIdent); OUString sExt("." + m_pConnection->getExtension()); - OUString sName(m_Name); - TempFile aTempFile(sName, true, &sExt, &sTempName); - if(!aTempFile.IsValid()) + OUString aTempFileURL = utl::CreateTempURL(m_Name, true, sExt, &aIdent); + if(aTempFileURL.isEmpty()) getConnection()->throwGenericSQLException(STR_COULD_NOT_ALTER_TABLE, *this); INetURLObject aURL; aURL.SetSmartProtocol(INetProtocol::File); - aURL.SetURL(aTempFile.GetURL()); + aURL.SetURL(aTempFileURL); OUString sNewName(aURL.getName().copy(0, aURL.getName().getLength() - sExt.getLength())); @@ -2685,7 +2658,7 @@ bool ODbaseTable::ReadMemo(std::size_t nBlockNo, ORowSetValue& aVariable) } while (!bReady && !m_pMemoStream->eof()); - aVariable = OStringToOUString(aBStr.makeStringAndClear(), + aVariable = OStringToOUString(aBStr, m_eEncoding); } break; @@ -2709,7 +2682,14 @@ bool ODbaseTable::ReadMemo(std::size_t nBlockNo, ORowSetValue& aVariable) (*m_pMemoStream).ReadUInt32( nLength ); if (m_aMemoHeader.db_typ == MemodBaseIV) + { + if (nLength < 8) + { + SAL_WARN("connectivity.drivers", "Size too small"); + return false; + } nLength -= 8; + } if ( nLength ) { @@ -2719,7 +2699,7 @@ bool ODbaseTable::ReadMemo(std::size_t nBlockNo, ORowSetValue& aVariable) //pad it out with ' ' to expected length on short read sal_Int32 nRequested = sal::static_int_cast<sal_Int32>(nLength); comphelper::string::padToLength(aBuffer, nRequested, ' '); - aVariable = OStringToOUString(aBuffer.makeStringAndClear(), m_eEncoding); + aVariable = OStringToOUString(aBuffer, m_eEncoding); } // if ( bIsText ) else { diff --git a/connectivity/source/drivers/dbase/DTables.cxx b/connectivity/source/drivers/dbase/DTables.cxx index a3bc953d93b4..d43bfb31356a 100644 --- a/connectivity/source/drivers/dbase/DTables.cxx +++ b/connectivity/source/drivers/dbase/DTables.cxx @@ -32,7 +32,6 @@ #include <strings.hrc> #include <connectivity/dbexception.hxx> -using namespace ::comphelper; using namespace connectivity; using namespace connectivity::dbase; using namespace connectivity::file; @@ -40,13 +39,12 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; using namespace ::com::sun::star::container; -sdbcx::ObjectType ODbaseTables::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > ODbaseTables::createObject(const OUString& _rName) { rtl::Reference<ODbaseTable> pRet = new ODbaseTable(this, static_cast<ODbaseConnection*>(static_cast<OFileCatalog&>(m_rParent).getConnection()), - _rName,"TABLE"); + _rName,u"TABLE"_ustr); pRet->construct(); return pRet; @@ -63,12 +61,12 @@ Reference< XPropertySet > ODbaseTables::createDescriptor() } // XAppend -sdbcx::ObjectType ODbaseTables::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > ODbaseTables::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { - auto pTable = comphelper::getFromUnoTunnel<ODbaseTable>(descriptor); + auto pTable = dynamic_cast<ODbaseTable*>(descriptor.get()); if(pTable) { - pTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(_rForName)); + pTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),Any(_rForName)); try { if(!pTable->CreateImpl()) @@ -81,7 +79,7 @@ sdbcx::ObjectType ODbaseTables::appendObject( const OUString& _rForName, const R catch(Exception& ex) { css::uno::Any anyEx = cppu::getCaughtException(); - throw SQLException( ex.Message, nullptr, "", 0, anyEx ); + throw SQLException( ex.Message, nullptr, u""_ustr, 0, anyEx ); } } return createObject( _rForName ); @@ -90,7 +88,7 @@ sdbcx::ObjectType ODbaseTables::appendObject( const OUString& _rForName, const R // XDrop void ODbaseTables::dropObject(sal_Int32 _nPos, const OUString& _sElementName) { - Reference< XUnoTunnel> xTunnel; + Reference< XInterface > xTunnel; try { xTunnel.set(getObject(_nPos),UNO_QUERY); @@ -103,7 +101,7 @@ void ODbaseTables::dropObject(sal_Int32 _nPos, const OUString& _sElementName) if ( xTunnel.is() ) { - ODbaseTable* pTable = comphelper::getFromUnoTunnel<ODbaseTable>(xTunnel); + ODbaseTable* pTable = dynamic_cast<ODbaseTable*>(xTunnel.get()); if(pTable) pTable->DropImpl(); } diff --git a/connectivity/source/drivers/dbase/dindexnode.cxx b/connectivity/source/drivers/dbase/dindexnode.cxx index 422fef11ce20..0e4746a0b9a6 100644 --- a/connectivity/source/drivers/dbase/dindexnode.cxx +++ b/connectivity/source/drivers/dbase/dindexnode.cxx @@ -26,6 +26,7 @@ #include <algorithm> #include <memory> +#include <utility> using namespace connectivity; @@ -38,10 +39,10 @@ ONDXKey::ONDXKey() { } -ONDXKey::ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec) +ONDXKey::ONDXKey(ORowSetValue aVal, sal_Int32 eType, sal_uInt32 nRec) : ONDXKey_BASE(eType) , nRecord(nRec) - , xValue(rVal) + , xValue(std::move(aVal)) { } @@ -167,7 +168,7 @@ bool ONDXPage::Find(const ONDXKey& rKey) else if (i == nCount) { rIndex.m_aCurLeaf = this; - rIndex.m_nCurNode = i - 1; + rIndex.m_nCurNode = sal_uInt16(i - 1); bResult = false; } else @@ -206,8 +207,13 @@ bool ONDXPage::Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft) } else // position unknown { - sal_uInt16 nPos = NODE_NOTFOUND; - while (++nPos < nCount && rNode.GetKey() > ((*this)[nPos]).GetKey()) ; + sal_uInt16 nPos = 0; + while (nPos < nCount) + { + if (rNode.GetKey() <= ((*this)[nPos]).GetKey()) + break; + ++nPos; + } --nCount; // (otherwise we might get Assertions and GPFs - 60593) bResult = Insert(nPos, rNode); @@ -234,7 +240,7 @@ bool ONDXPage::Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft) ONDXPagePtr aNewRoot = rIndex.CreatePage(nNewPagePos + 1); aNewRoot->SetChild(this); - rIndex.m_aRoot = aNewRoot; + rIndex.m_aRoot = std::move(aNewRoot); rIndex.SetRootPos(nNewPagePos + 1); rIndex.SetPageCount(++nNewPageCount); } @@ -268,7 +274,7 @@ bool ONDXPage::Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft) ONDXPagePtr aTempParent = aParent; if (IsLeaf()) { - rIndex.m_aCurLeaf = aNewPage; + rIndex.m_aCurLeaf = std::move(aNewPage); rIndex.m_nCurNode = rIndex.m_aCurLeaf->Count() - 1; // free not needed pages, there are no references to those on the page @@ -410,8 +416,8 @@ void ONDXPage::Delete(sal_uInt16 nNodePos) else { // merge with right neighbour - Merge(nParentNodePos + 1,((*aParent)[nParentNodePos + 1].GetChild(&rIndex,aParent))); - nParentNodePos++; + nParentNodePos = o3tl::sanitizing_inc(nParentNodePos); + Merge(nParentNodePos,((*aParent)[nParentNodePos].GetChild(&rIndex,aParent))); } if (HasParent() && !(*aParent)[nParentNodePos].HasChild()) aParent->Delete(nParentNodePos); @@ -482,7 +488,7 @@ void ONDXPage::Merge(sal_uInt16 nParentNodePos, const ONDXPagePtr& xPage) nMaxNodes_2 = nMaxNodes / 2; // Determine if page is right or left neighbour - bool bRight = ((*xPage)[0].GetKey() > (*this)[0].GetKey()); // sal_True, whenn xPage the right side is + bool bRight = ((*xPage)[0].GetKey() > (*this)[0].GetKey()); // true when xPage is at the right side sal_uInt16 nNewCount = (*xPage).Count() + Count(); if (IsLeaf()) @@ -968,28 +974,28 @@ bool ONDXPage::IsFull() const return Count() == rIndex.getHeader().db_maxkeys; } - sal_uInt16 ONDXPage::Search(const ONDXKey& rSearch) { // binary search later - sal_uInt16 i = NODE_NOTFOUND; - while (++i < Count()) - if ((*this)[i].GetKey() == rSearch) - break; + for (sal_uInt16 i = 0, nSize = Count(); i < nSize; ++i) + { + if (((*this)[i]).GetKey() == rSearch) + return i; + } - return (i < Count()) ? i : NODE_NOTFOUND; + return NODE_NOTFOUND; } - sal_uInt16 ONDXPage::Search(const ONDXPage* pPage) { - sal_uInt16 i = NODE_NOTFOUND; - while (++i < Count()) + for (sal_uInt16 i = 0, nSize = Count(); i < nSize; ++i) + { if (((*this)[i]).GetChild() == pPage) - break; + return i; + } // if not found, then we assume, that the page itself points to the page - return (i < Count()) ? i : NODE_NOTFOUND; + return NODE_NOTFOUND; } // runs recursively diff --git a/connectivity/source/drivers/evoab2/EApi.cxx b/connectivity/source/drivers/evoab2/EApi.cxx index 6df2c45d4aef..9ec8e0d44e32 100644 --- a/connectivity/source/drivers/evoab2/EApi.cxx +++ b/connectivity/source/drivers/evoab2/EApi.cxx @@ -21,18 +21,10 @@ #define DECLARE_FN_POINTERS 1 #include "EApi.h" static const char *eBookLibNames[] = { + "libebook-1.2.so.21", // evolution-data-server 3.45.2+ "libebook-1.2.so.20", // evolution-data-server 3.33.2+ "libebook-1.2.so.19", // evolution-data-server 3.24+ - "libebook-1.2.so.16", - "libebook-1.2.so.15", - "libebook-1.2.so.14", // bumped again (evolution-3.6) - "libebook-1.2.so.13", // bumped again (evolution-3.4) - "libebook-1.2.so.12", // bumped again - "libebook-1.2.so.10", // bumped again - "libebook-1.2.so.9", // evolution-2.8 - "libebook-1.2.so.5", // evolution-2.4 and 2.6+ - "libebook-1.2.so.3", // evolution-2.2 - "libebook.so.8" // evolution-2.0 + "libebook-1.2.so.16" }; typedef void (*SymbolFunc) (); @@ -69,20 +61,6 @@ const ApiMap aCommonApiMap[] = { "e_book_query_field_exists", reinterpret_cast<SymbolFunc *>(&e_book_query_field_exists) } }; -//< 3.6 api -const ApiMap aOldApiMap[] = -{ - { "e_book_get_addressbooks", reinterpret_cast<SymbolFunc *>(&e_book_get_addressbooks) }, - { "e_book_get_uri", reinterpret_cast<SymbolFunc *>(&e_book_get_uri) }, - { "e_book_authenticate_user", reinterpret_cast<SymbolFunc *>(&e_book_authenticate_user) }, - { "e_source_group_peek_base_uri", reinterpret_cast<SymbolFunc *>(&e_source_group_peek_base_uri) }, - { "e_source_peek_name", reinterpret_cast<SymbolFunc *>(&e_source_peek_name) }, - { "e_source_get_property", reinterpret_cast<SymbolFunc *>(&e_source_get_property) }, - { "e_source_list_peek_groups", reinterpret_cast<SymbolFunc *>(&e_source_list_peek_groups) }, - { "e_source_group_peek_sources", reinterpret_cast<SymbolFunc *>(&e_source_group_peek_sources) } -}; - -//>= 3.6 api const ApiMap aNewApiMap[] = { { "e_source_registry_list_sources", reinterpret_cast<SymbolFunc *>(&e_source_registry_list_sources) }, @@ -99,12 +77,6 @@ const ApiMap aNewApiMap[] = { "e_client_util_free_object_slist", reinterpret_cast<SymbolFunc *>(&e_client_util_free_object_slist) } }; -//== indirect read access (3.6 only) -const ApiMap aClientApiMap36[] = -{ - { "e_book_client_new", reinterpret_cast<SymbolFunc *>(&e_book_client_new) } -}; - //>= direct read access API (>= 3.8) const ApiMap aClientApiMap38[] = { @@ -140,33 +112,14 @@ bool EApiInit() if (tryLink( aModule, eBookLibNames[ j ], aCommonApiMap)) { - if (eds_check_version( 3, 6, 0 ) != nullptr) + if (tryLink( aModule, eBookLibNames[ j ], aNewApiMap)) { - if (tryLink( aModule, eBookLibNames[ j ], aOldApiMap)) + if (tryLink( aModule, eBookLibNames[ j ], aClientApiMap38)) { aModule.release(); return true; } } - else if (tryLink( aModule, eBookLibNames[ j ], aNewApiMap)) - { - if (eds_check_version( 3, 7, 6 ) != nullptr) - { - if (tryLink( aModule, eBookLibNames[ j ], aClientApiMap36)) - { - aModule.release(); - return true; - } - } - else - { - if (tryLink( aModule, eBookLibNames[ j ], aClientApiMap38)) - { - aModule.release(); - return true; - } - } - } } } fprintf( stderr, "Can find no compliant libebook client libraries\n" ); diff --git a/connectivity/source/drivers/evoab2/EApi.h b/connectivity/source/drivers/evoab2/EApi.h index 4d17922aab30..a33bf9721de6 100644 --- a/connectivity/source/drivers/evoab2/EApi.h +++ b/connectivity/source/drivers/evoab2/EApi.h @@ -146,7 +146,7 @@ EAPI_EXTERN const gchar* (*eds_check_version) (guint required_major, guint requi EAPI_EXTERN const gchar* (*e_source_get_uid) (ESource *source); EAPI_EXTERN ESource* (*e_source_registry_ref_source) (ESourceRegistry *registry, const gchar *uid); EAPI_EXTERN EBookClient* (*e_book_client_new) (ESource *source, GError **error); -EAPI_EXTERN EBookClient* (*e_book_client_connect_direct_sync) (ESourceRegistry *registry, ESource *source, GCancellable *cancellable, GError **error); +EAPI_EXTERN EBookClient* (*e_book_client_connect_direct_sync) (ESourceRegistry *registry, ESource *source, guint32 wait_for_connected_seconds, GCancellable *cancellable, GError **error); EAPI_EXTERN gboolean (*e_client_open_sync) (EClient *client, gboolean only_if_exists, GCancellable *cancellable, GError **error); EAPI_EXTERN ESource* (*e_client_get_source) (EClient *client); EAPI_EXTERN gboolean (*e_book_client_get_contacts_sync) (EBookClient *client, const gchar *sexp, GSList **contacts, GCancellable *cancellable, GError **error); @@ -157,4 +157,6 @@ bool isSourceBackend(ESource *pSource, const char *backendname); G_END_DECLS +inline void object_unref(gpointer data, gpointer) { g_object_unref(data); } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/evoab2/NCatalog.cxx b/connectivity/source/drivers/evoab2/NCatalog.cxx index 6b409ce66d65..42c66f7f4542 100644 --- a/connectivity/source/drivers/evoab2/NCatalog.cxx +++ b/connectivity/source/drivers/evoab2/NCatalog.cxx @@ -26,11 +26,8 @@ using namespace connectivity::evoab; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OEvoabCatalog::OEvoabCatalog(OEvoabConnection* _pCon) : connectivity::sdbcx::OCatalog(_pCon) @@ -40,9 +37,9 @@ OEvoabCatalog::OEvoabCatalog(OEvoabConnection* _pCon) : void OEvoabCatalog::refreshTables() { ::std::vector< OUString> aVector; - Sequence< OUString > aTypes { "TABLE" }; + Sequence< OUString > aTypes { u"TABLE"_ustr }; Reference< XResultSet > xResult = m_xMetaData->getTables( - Any(), "%", "%", aTypes); + Any(), u"%"_ustr, u"%"_ustr, aTypes); if(xResult.is()) { diff --git a/connectivity/source/drivers/evoab2/NCatalog.hxx b/connectivity/source/drivers/evoab2/NCatalog.hxx index b2bd8084474c..2b794c81202e 100644 --- a/connectivity/source/drivers/evoab2/NCatalog.hxx +++ b/connectivity/source/drivers/evoab2/NCatalog.hxx @@ -23,21 +23,21 @@ namespace connectivity::evoab { - class OEvoabConnection; - class OEvoabCatalog : public connectivity::sdbcx::OCatalog - { - OEvoabConnection *m_pConnection; - public: - explicit OEvoabCatalog(OEvoabConnection *_pCon); - OEvoabConnection* getConnection() const { return m_pConnection; } - virtual void refreshTables() override; - virtual void refreshViews() override {} - virtual void refreshGroups() override {} - virtual void refreshUsers() override {} - // XTablesSupplier - virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTables( - ) override; - }; + class OEvoabConnection; + class OEvoabCatalog : public connectivity::sdbcx::OCatalog + { + OEvoabConnection *m_pConnection; + public: + explicit OEvoabCatalog(OEvoabConnection *_pCon); + OEvoabConnection* getConnection() const { return m_pConnection; } + virtual void refreshTables() override; + virtual void refreshViews() override {} + virtual void refreshGroups() override {} + virtual void refreshUsers() override {} +// XTablesSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTables( + ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/evoab2/NColumns.cxx b/connectivity/source/drivers/evoab2/NColumns.cxx index 5b2b64d5d58b..a07e12d764d7 100644 --- a/connectivity/source/drivers/evoab2/NColumns.cxx +++ b/connectivity/source/drivers/evoab2/NColumns.cxx @@ -25,16 +25,12 @@ using namespace connectivity::sdbcx; using namespace connectivity; -using namespace ::comphelper; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace connectivity::evoab; -sdbcx::ObjectType OEvoabColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OEvoabColumns::createObject(const OUString& _rName) { const Any aCatalog; const OUString sCatalogName; @@ -46,33 +42,32 @@ sdbcx::ObjectType OEvoabColumns::createObject(const OUString& _rName) sTableName, _rName); - sdbcx::ObjectType xRet; - if (xResult.is()) - { - Reference< XRow > xRow(xResult,UNO_QUERY); + if (!xResult.is()) + return nullptr; - while (xResult->next()) + rtl::Reference< OColumn > xRet; + Reference< XRow > xRow(xResult,UNO_QUERY); + while (xResult->next()) + { + if (xRow->getString(4) == _rName) { - if (xRow->getString(4) == _rName) - { - xRet = new OColumn( - _rName, - xRow->getString(6), - xRow->getString(13), - xRow->getString(12), - xRow->getInt(11), - xRow->getInt(7), - xRow->getInt(9), - xRow->getInt(5), - false, - false, - false, - true, - sCatalogName, - sSchemaName, - sTableName); - break; - } + xRet = new OColumn( + _rName, + xRow->getString(6), + xRow->getString(13), + xRow->getString(12), + xRow->getInt(11), + xRow->getInt(7), + xRow->getInt(9), + xRow->getInt(5), + false, + false, + false, + true, + sCatalogName, + sSchemaName, + sTableName); + break; } } diff --git a/connectivity/source/drivers/evoab2/NColumns.hxx b/connectivity/source/drivers/evoab2/NColumns.hxx index f768c51bb046..0f070e5ca8c8 100644 --- a/connectivity/source/drivers/evoab2/NColumns.hxx +++ b/connectivity/source/drivers/evoab2/NColumns.hxx @@ -24,21 +24,21 @@ namespace connectivity::evoab { - class OEvoabColumns final : public sdbcx::OCollection - { - OEvoabTable* m_pTable; + class OEvoabColumns final : public sdbcx::OCollection + { + OEvoabTable* m_pTable; - virtual sdbcx::ObjectType createObject(const OUString& _rName) override; - virtual void impl_refresh() override; + virtual css::uno::Reference< css::beans::XPropertySet > createObject(const OUString& _rName) override; + virtual void impl_refresh() override; - public: - OEvoabColumns( OEvoabTable* _pTable, - ::osl::Mutex& _rMutex, - const ::std::vector< OUString> &_rVector - ) : sdbcx::OCollection(*_pTable,true,_rMutex,_rVector), - m_pTable(_pTable) - { } - }; + public: + OEvoabColumns( OEvoabTable* _pTable, + ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector + ) : sdbcx::OCollection(*_pTable,true,_rMutex,_rVector), + m_pTable(_pTable) + { } + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/evoab2/NConnection.cxx b/connectivity/source/drivers/evoab2/NConnection.cxx index 02e8d476dd6e..4c4d46e63fd8 100644 --- a/connectivity/source/drivers/evoab2/NConnection.cxx +++ b/connectivity/source/drivers/evoab2/NConnection.cxx @@ -36,7 +36,6 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; OEvoabConnection::OEvoabConnection(OEvoabDriver const & _rDriver) : m_rDriver(_rDriver) @@ -57,7 +56,7 @@ OEvoabConnection::~OEvoabConnection() // XServiceInfo -IMPLEMENT_SERVICE_INFO(OEvoabConnection, "com.sun.star.sdbc.drivers.evoab.Connection", "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(OEvoabConnection, u"com.sun.star.sdbc.drivers.evoab.Connection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) void OEvoabConnection::construct(const OUString& url, const Sequence< PropertyValue >& info) @@ -148,7 +147,7 @@ Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareStatement( con Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareCall( const OUString& /*sql*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::prepareCall", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::prepareCall"_ustr, *this ); return nullptr; } sal_Bool SAL_CALL OEvoabConnection::isClosed( ) @@ -190,7 +189,7 @@ void OEvoabConnection::disposing() // -------------------------------- stubbed methods ------------------------------------------------ void SAL_CALL OEvoabConnection::setAutoCommit( sal_Bool /*autoCommit*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setAutoCommit", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setAutoCommit"_ustr, *this ); } sal_Bool SAL_CALL OEvoabConnection::getAutoCommit( ) { @@ -204,7 +203,7 @@ void SAL_CALL OEvoabConnection::rollback( ) } void SAL_CALL OEvoabConnection::setReadOnly( sal_Bool /*readOnly*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setReadOnly", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setReadOnly"_ustr, *this ); } sal_Bool SAL_CALL OEvoabConnection::isReadOnly( ) { @@ -212,7 +211,7 @@ sal_Bool SAL_CALL OEvoabConnection::isReadOnly( ) } void SAL_CALL OEvoabConnection::setCatalog( const OUString& /*catalog*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setCatalog", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setCatalog"_ustr, *this ); } OUString SAL_CALL OEvoabConnection::getCatalog( ) @@ -221,7 +220,7 @@ OUString SAL_CALL OEvoabConnection::getCatalog( ) } void SAL_CALL OEvoabConnection::setTransactionIsolation( sal_Int32 /*level*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setTransactionIsolation", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setTransactionIsolation"_ustr, *this ); } sal_Int32 SAL_CALL OEvoabConnection::getTransactionIsolation( ) @@ -231,12 +230,12 @@ sal_Int32 SAL_CALL OEvoabConnection::getTransactionIsolation( ) Reference< css::container::XNameAccess > SAL_CALL OEvoabConnection::getTypeMap( ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::getTypeMap", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::getTypeMap"_ustr, *this ); return nullptr; } void SAL_CALL OEvoabConnection::setTypeMap( const Reference< css::container::XNameAccess >& /*typeMap*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setTypeMap", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setTypeMap"_ustr, *this ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/evoab2/NConnection.hxx b/connectivity/source/drivers/evoab2/NConnection.hxx index 4d6604f0975c..77e3ea30b335 100644 --- a/connectivity/source/drivers/evoab2/NConnection.hxx +++ b/connectivity/source/drivers/evoab2/NConnection.hxx @@ -32,75 +32,74 @@ namespace connectivity::evoab { - namespace SDBCAddress { - typedef enum { - Unknown = 0, - EVO_LOCAL = 1, - EVO_LDAP = 2, - EVO_GWISE = 3 - } sdbc_address_type; - } + namespace SDBCAddress { + typedef enum { + Unknown = 0, + EVO_LOCAL = 1, + EVO_LDAP = 2, + EVO_GWISE = 3 + } sdbc_address_type; + } - typedef connectivity::OMetaConnection OConnection_BASE; // implements basics and text encoding + typedef connectivity::OMetaConnection OConnection_BASE; // implements basics and text encoding - class OEvoabConnection final :public OConnection_BASE - { - private: - const OEvoabDriver& m_rDriver; - SDBCAddress::sdbc_address_type m_eSDBCAddressType; - css::uno::Reference< css::sdbcx::XTablesSupplier > - m_xCatalog; - OString m_aPassword; - ::dbtools::WarningsContainer m_aWarnings; + class OEvoabConnection final :public OConnection_BASE + { + private: + const OEvoabDriver& m_rDriver; + SDBCAddress::sdbc_address_type m_eSDBCAddressType; + css::uno::Reference< css::sdbcx::XTablesSupplier > + m_xCatalog; + OString m_aPassword; + ::dbtools::WarningsContainer m_aWarnings; - virtual ~OEvoabConnection() override; + virtual ~OEvoabConnection() override; - public: - explicit OEvoabConnection( OEvoabDriver const & _rDriver ); - /// @throws css::sdbc::SQLException - void construct(const OUString& _rUrl,const css::uno::Sequence< css::beans::PropertyValue >& _rInfo ); + public: + explicit OEvoabConnection( OEvoabDriver const & _rDriver ); + /// @throws css::sdbc::SQLException + void construct(const OUString& _rUrl,const css::uno::Sequence< css::beans::PropertyValue >& _rInfo ); - OString const & getPassword() const { return m_aPassword; } - void setPassword( OString const & aStr ) { m_aPassword = aStr; } - // own methods - const OEvoabDriver& getDriver() const { return m_rDriver; } + void setPassword( OString const & aStr ) { m_aPassword = aStr; } + // own methods + const OEvoabDriver& getDriver() const { return m_rDriver; } - SDBCAddress::sdbc_address_type getSDBCAddressType() const { return m_eSDBCAddressType;} - void setSDBCAddressType(SDBCAddress::sdbc_address_type _eSDBCAddressType) {m_eSDBCAddressType = _eSDBCAddressType;} + SDBCAddress::sdbc_address_type getSDBCAddressType() const { return m_eSDBCAddressType;} + void setSDBCAddressType(SDBCAddress::sdbc_address_type _eSDBCAddressType) {m_eSDBCAddressType = _eSDBCAddressType;} - // OComponentHelper - virtual void SAL_CALL disposing() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; - // XServiceInfo - DECLARE_SERVICE_INFO(); + // XServiceInfo + DECLARE_SERVICE_INFO(); - // XConnection - css::uno::Reference< css::sdbcx::XTablesSupplier > createCatalog(); - virtual css::uno::Reference< css::sdbc::XStatement > SAL_CALL createStatement( ) override; - virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const OUString& sql ) override; - virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareCall( const OUString& sql ) override; - virtual OUString SAL_CALL nativeSQL( const OUString& sql ) override; - virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) override; - virtual sal_Bool SAL_CALL getAutoCommit( ) override; - virtual void SAL_CALL commit( ) override; - virtual void SAL_CALL rollback( ) override; - virtual sal_Bool SAL_CALL isClosed( ) override; - virtual css::uno::Reference< css::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) override; - virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) override; - virtual sal_Bool SAL_CALL isReadOnly( ) override; - virtual void SAL_CALL setCatalog( const OUString& catalog ) override; - virtual OUString SAL_CALL getCatalog( ) override; - virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) override; - virtual sal_Int32 SAL_CALL getTransactionIsolation( ) override; - virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTypeMap( ) override; - virtual void SAL_CALL setTypeMap( const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; + // XConnection + css::uno::Reference< css::sdbcx::XTablesSupplier > createCatalog(); + virtual css::uno::Reference< css::sdbc::XStatement > SAL_CALL createStatement( ) override; + virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const OUString& sql ) override; + virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareCall( const OUString& sql ) override; + virtual OUString SAL_CALL nativeSQL( const OUString& sql ) override; + virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) override; + virtual sal_Bool SAL_CALL getAutoCommit( ) override; + virtual void SAL_CALL commit( ) override; + virtual void SAL_CALL rollback( ) override; + virtual sal_Bool SAL_CALL isClosed( ) override; + virtual css::uno::Reference< css::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) override; + virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) override; + virtual sal_Bool SAL_CALL isReadOnly( ) override; + virtual void SAL_CALL setCatalog( const OUString& catalog ) override; + virtual OUString SAL_CALL getCatalog( ) override; + virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) override; + virtual sal_Int32 SAL_CALL getTransactionIsolation( ) override; + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTypeMap( ) override; + virtual void SAL_CALL setTypeMap( const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; - // XCloseable - virtual void SAL_CALL close( ) override; - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - }; + // XCloseable + virtual void SAL_CALL close( ) override; + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx b/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx index a671ceb233a8..060c4480bd87 100644 --- a/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx +++ b/connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx @@ -34,10 +34,7 @@ using namespace connectivity::evoab; using namespace connectivity; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; namespace { @@ -193,9 +190,9 @@ namespace connectivity::evoab switch( getFieldType( nCol ) ) { case DataType::BIT: - return "BIT"; + return u"BIT"_ustr; case DataType::VARCHAR: - return "VARCHAR"; + return u"VARCHAR"_ustr; default: break; } @@ -253,8 +250,14 @@ OEvoabDatabaseMetaData::~OEvoabDatabaseMetaData() } -ODatabaseMetaDataResultSet::ORows OEvoabDatabaseMetaData::getColumnRows( const OUString& columnNamePattern ) +Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getColumns( + const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*tableNamePattern*/, + const OUString& columnNamePattern ) { + // this returns an empty resultset where the column-names are already set + // in special the metadata of the resultset already returns the right columns + rtl::Reference<ODatabaseMetaDataResultSet> pResultSet = new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eColumns ); + ODatabaseMetaDataResultSet::ORows aRows; ODatabaseMetaDataResultSet::ORow aRow(19); @@ -287,14 +290,14 @@ ODatabaseMetaDataResultSet::ORows OEvoabDatabaseMetaData::getColumnRows( const O // CHAR_OCTET_LENGTH, refer to [5] aRow[16] = new ORowSetValueDecorator(s_nCHAR_OCTET_LENGTH); // IS_NULLABLE - aRow[18] = new ORowSetValueDecorator(OUString("YES")); + aRow[18] = new ORowSetValueDecorator(u"YES"_ustr); - aRow[3] = new ORowSetValueDecorator(OUString("TABLE")); + aRow[3] = new ORowSetValueDecorator(u"TABLE"_ustr); ::osl::MutexGuard aGuard( m_aMutex ); initFields(); - for (sal_Int32 i = 0; i < static_cast<sal_Int32>(nFields); i++) + for (guint i = 0; i < nFields; i++) { if( match( columnNamePattern, getFieldName( i ), '\0' ) ) { @@ -304,12 +307,14 @@ ODatabaseMetaDataResultSet::ORows OEvoabDatabaseMetaData::getColumnRows( const O // COLUMN_NAME aRow[4] = new ORowSetValueDecorator( getFieldName( i ) ); // ORDINAL_POSITION - aRow[17] = new ORowSetValueDecorator( i ); + aRow[17] = new ORowSetValueDecorator( sal_Int32(i) ); aRows.push_back( aRow ); } } - return aRows ; + pResultSet->setRows(std::move(aRows)); + + return pResultSet; } OUString OEvoabDatabaseMetaData::impl_getCatalogSeparator_throw( ) @@ -442,7 +447,7 @@ OUString SAL_CALL OEvoabDatabaseMetaData::getCatalogTerm( ) OUString OEvoabDatabaseMetaData::impl_getIdentifierQuoteString_throw( ) { // normally this is " - return "\""; + return u"\""_ustr; } OUString SAL_CALL OEvoabDatabaseMetaData::getExtraNameCharacters( ) @@ -798,12 +803,12 @@ OUString SAL_CALL OEvoabDatabaseMetaData::getDriverName( ) OUString SAL_CALL OEvoabDatabaseMetaData::getDriverVersion() { - return "1"; + return u"1"_ustr; } OUString SAL_CALL OEvoabDatabaseMetaData::getDatabaseProductVersion( ) { - return "0"; + return u"0"_ustr; } OUString SAL_CALL OEvoabDatabaseMetaData::getDatabaseProductName( ) @@ -988,8 +993,8 @@ Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getTableTypes( ) rtl::Reference<::connectivity::ODatabaseMetaDataResultSet> pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTableTypes); // here we fill the rows which should be visible when ask for data from the resultset returned here - auto nNbTypes = SAL_N_ELEMENTS(sTableTypes); - ODatabaseMetaDataResultSet::ORows aRows(nNbTypes); + auto nNbTypes = std::size(sTableTypes); + ODatabaseMetaDataResultSet::ORows aRows; for(std::size_t i=0;i < nNbTypes;++i) { // bound row @@ -1010,11 +1015,11 @@ Reference< XResultSet > OEvoabDatabaseMetaData::impl_getTypeInfo_throw( ) static ODatabaseMetaDataResultSet::ORows aRows = []() { - ODatabaseMetaDataResultSet::ORows tmp(2); + ODatabaseMetaDataResultSet::ORows tmp; ODatabaseMetaDataResultSet::ORow aRow { ODatabaseMetaDataResultSet::getEmptyValue() , - new ORowSetValueDecorator(OUString("VARCHAR")) , + new ORowSetValueDecorator(u"VARCHAR"_ustr) , new ORowSetValueDecorator(DataType::VARCHAR) , new ORowSetValueDecorator(sal_Int32(s_nCHAR_OCTET_LENGTH)) , ODatabaseMetaDataResultSet::getQuoteValue() , @@ -1036,7 +1041,7 @@ Reference< XResultSet > OEvoabDatabaseMetaData::impl_getTypeInfo_throw( ) tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("VARCHAR")); + aRow[1] = new ORowSetValueDecorator(u"VARCHAR"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::VARCHAR); aRow[3] = new ORowSetValueDecorator(sal_Int32(65535)); tmp.push_back(aRow); @@ -1046,18 +1051,6 @@ Reference< XResultSet > OEvoabDatabaseMetaData::impl_getTypeInfo_throw( ) return pResultSet; } -Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getColumns( - const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*tableNamePattern*/, - const OUString& columnNamePattern ) -{ - // this returns an empty resultset where the column-names are already set - // in special the metadata of the resultset already returns the right columns - rtl::Reference<ODatabaseMetaDataResultSet> pResultSet = new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eColumns ); - pResultSet->setRows( getColumnRows( columnNamePattern ) ); - return pResultSet; -} - - bool isSourceBackend(ESource *pSource, const char *backendname) { if (!pSource || !e_source_has_extension (pSource, E_SOURCE_EXTENSION_ADDRESS_BOOK)) @@ -1073,12 +1066,12 @@ Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getTables( { ::osl::MutexGuard aGuard( m_aMutex ); - rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTableTypes); + rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables); // check if any type is given // when no types are given then we have to return all tables e.g. TABLE - static const OUStringLiteral aTable(u"TABLE"); + static constexpr OUString aTable(u"TABLE"_ustr); bool bTableFound = true; sal_Int32 nLength = types.getLength(); @@ -1102,105 +1095,50 @@ Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getTables( ODatabaseMetaDataResultSet::ORows aRows; - if (eds_check_version(3, 6, 0) == nullptr) - { - GList *pSources = e_source_registry_list_sources(get_e_source_registry(), E_SOURCE_EXTENSION_ADDRESS_BOOK); + GList *pSources = e_source_registry_list_sources(get_e_source_registry(), E_SOURCE_EXTENSION_ADDRESS_BOOK); - for (GList* liter = pSources; liter; liter = liter->next) - { - ESource *pSource = E_SOURCE (liter->data); - bool can = false; - switch (m_pConnection->getSDBCAddressType()) - { - case SDBCAddress::EVO_GWISE: - can = isSourceBackend( pSource, "groupwise"); // not supported in evo/eds 3.6.x+, somehow - break; - case SDBCAddress::EVO_LOCAL: - can = isSourceBackend( pSource, "local"); - break; - case SDBCAddress::EVO_LDAP: - can = isSourceBackend( pSource, "ldap"); - break; - case SDBCAddress::Unknown: - can = true; - break; - } - if (!can) - continue; - - OUString aHumanName = OStringToOUString( e_source_get_display_name( pSource ), - RTL_TEXTENCODING_UTF8 ); - OUString aUID = OStringToOUString( e_source_get_uid( pSource ), - RTL_TEXTENCODING_UTF8 ); - ODatabaseMetaDataResultSet::ORow aRow{ - ORowSetValueDecoratorRef(), - ORowSetValueDecoratorRef(), - ORowSetValueDecoratorRef(), - new ORowSetValueDecorator(aHumanName), //tablename - new ORowSetValueDecorator(ORowSetValue(aTable)), - new ORowSetValueDecorator(aUID)}; //comment - //I'd prefer to swap the comment and the human name and - //just use e_source_registry_ref_source(get_e_source_registry(), aUID); - //in open book rather than search for the name again - aRows.push_back(aRow); - } - - g_list_foreach (pSources, reinterpret_cast<GFunc>(g_object_unref), nullptr); - g_list_free (pSources); - } - else + for (GList* liter = pSources; liter; liter = liter->next) { - ESourceList *pSourceList; - if( !e_book_get_addressbooks (&pSourceList, nullptr) ) - pSourceList = nullptr; - - GSList *g; - for( g = e_source_list_peek_groups( pSourceList ); g; g = g->next) + ESource *pSource = E_SOURCE (liter->data); + bool can = false; + switch (m_pConnection->getSDBCAddressType()) { - GSList *s; - const char *p = e_source_group_peek_base_uri(E_SOURCE_GROUP(g->data)); - - switch (m_pConnection->getSDBCAddressType()) { case SDBCAddress::EVO_GWISE: - if ( !strncmp( "groupwise://", p, 11 )) - break; - else - continue; + can = isSourceBackend( pSource, "groupwise"); // not supported in evo/eds 3.6.x+, somehow + break; case SDBCAddress::EVO_LOCAL: - if ( !strncmp( "file://", p, 6 ) || - !strncmp( "local://", p, 6 ) ) - break; - else - continue; + can = isSourceBackend( pSource, "local"); + break; case SDBCAddress::EVO_LDAP: - if ( !strncmp( "ldap://", p, 6 )) - break; - else - continue; + can = isSourceBackend( pSource, "ldap"); + break; case SDBCAddress::Unknown: + can = true; break; - } - for (s = e_source_group_peek_sources (E_SOURCE_GROUP (g->data)); s; s = s->next) - { - ESource *pSource = E_SOURCE (s->data); - - OUString aName = OStringToOUString( e_source_peek_name( pSource ), - RTL_TEXTENCODING_UTF8 ); - - aRows.push_back( - { - ORowSetValueDecoratorRef(), - ORowSetValueDecoratorRef(), - ORowSetValueDecoratorRef(), - new ORowSetValueDecorator(aName), - new ORowSetValueDecorator(ORowSetValue(aTable)), - ODatabaseMetaDataResultSet::getEmptyValue() - } - ); - } } + if (!can) + continue; + + OUString aHumanName = OStringToOUString( e_source_get_display_name( pSource ), + RTL_TEXTENCODING_UTF8 ); + OUString aUID = OStringToOUString( e_source_get_uid( pSource ), + RTL_TEXTENCODING_UTF8 ); + ODatabaseMetaDataResultSet::ORow aRow{ + ORowSetValueDecoratorRef(), + ORowSetValueDecoratorRef(), + ORowSetValueDecoratorRef(), + new ORowSetValueDecorator(aHumanName), //tablename + new ORowSetValueDecorator(ORowSetValue(aTable)), + new ORowSetValueDecorator(aUID)}; //comment + //I'd prefer to swap the comment and the human name and + //just use e_source_registry_ref_source(get_e_source_registry(), aUID); + //in open book rather than search for the name again + aRows.push_back(aRow); } + g_list_foreach (pSources, object_unref, nullptr); + g_list_free (pSources); + pResult->setRows(std::move(aRows)); return pResult; @@ -1208,7 +1146,7 @@ Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getTables( Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getUDTs( const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*typeNamePattern*/, const Sequence< sal_Int32 >& /*types*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XDatabaseMetaDaza::getUDTs", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XDatabaseMetaDaza::getUDTs"_ustr, *this ); return nullptr; } diff --git a/connectivity/source/drivers/evoab2/NDatabaseMetaData.hxx b/connectivity/source/drivers/evoab2/NDatabaseMetaData.hxx index b5f504425d95..333594bf3741 100644 --- a/connectivity/source/drivers/evoab2/NDatabaseMetaData.hxx +++ b/connectivity/source/drivers/evoab2/NDatabaseMetaData.hxx @@ -31,189 +31,187 @@ namespace connectivity::evoab { - //************ Class: OEvoabDatabaseMetaData - - typedef struct{ - gboolean bIsSplittedValue; - GParamSpec *pField; - }ColumnProperty; - - typedef enum { - DEFAULT_ADDR_LINE1=1,DEFAULT_ADDR_LINE2,DEFAULT_CITY,DEFAULT_STATE,DEFAULT_COUNTRY,DEFAULT_ZIP, - WORK_ADDR_LINE1,WORK_ADDR_LINE2,WORK_CITY,WORK_STATE,WORK_COUNTRY,WORK_ZIP, - HOME_ADDR_LINE1,HOME_ADDR_LINE2,HOME_CITY,HOME_STATE,HOME_COUNTRY,HOME_ZIP, - OTHER_ADDR_LINE1,OTHER_ADDR_LINE2,OTHER_CITY,OTHER_STATE,OTHER_COUNTRY,OTHER_ZIP - }ColumnNumber; - - typedef struct { - const gchar *pColumnName; - ColumnNumber value; - }SplitEvoColumns; - - const SplitEvoColumns* get_evo_addr(); - - const ColumnProperty *getField(guint n); - GType getGFieldType(guint nCol) ; - sal_Int32 getFieldType(guint nCol) ; - OUString getFieldTypeName(guint nCol) ; - OUString getFieldName(guint nCol) ; - guint findEvoabField(std::u16string_view aColName); - - void free_column_resources(); - - class OEvoabDatabaseMetaData : public ODatabaseMetaDataBase - { - OEvoabConnection* m_pConnection; - - ODatabaseMetaDataResultSet::ORows getColumnRows( const OUString& columnNamePattern ); - - protected: - virtual css::uno::Reference< css::sdbc::XResultSet > impl_getTypeInfo_throw() override; - // cached database information - virtual OUString impl_getIdentifierQuoteString_throw( ) override; - virtual bool impl_isCatalogAtStart_throw( ) override; - virtual OUString impl_getCatalogSeparator_throw( ) override; - virtual bool impl_supportsCatalogsInTableDefinitions_throw( ) override; - virtual bool impl_supportsSchemasInTableDefinitions_throw( ) override ; - virtual bool impl_supportsCatalogsInDataManipulation_throw( ) override; - virtual bool impl_supportsSchemasInDataManipulation_throw( ) override ; - virtual bool impl_supportsMixedCaseQuotedIdentifiers_throw( ) override ; - virtual bool impl_supportsAlterTableWithAddColumn_throw( ) override; - virtual bool impl_supportsAlterTableWithDropColumn_throw( ) override; - virtual sal_Int32 impl_getMaxStatements_throw( ) override; - virtual sal_Int32 impl_getMaxTablesInSelect_throw( ) override; - virtual bool impl_storesMixedCaseQuotedIdentifiers_throw( ) override; - - virtual ~OEvoabDatabaseMetaData() override; - public: - explicit OEvoabDatabaseMetaData(OEvoabConnection* _pCon); - - // as I mentioned before this interface is really BIG - // XDatabaseMetaData - virtual sal_Bool SAL_CALL allProceduresAreCallable( ) override; - virtual sal_Bool SAL_CALL allTablesAreSelectable( ) override; - virtual OUString SAL_CALL getURL( ) override; - virtual OUString SAL_CALL getUserName( ) override; - virtual sal_Bool SAL_CALL isReadOnly( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedLow( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) override; - virtual OUString SAL_CALL getDatabaseProductName( ) override; - virtual OUString SAL_CALL getDatabaseProductVersion( ) override; - virtual OUString SAL_CALL getDriverName( ) override; - virtual OUString SAL_CALL getDriverVersion( ) override; - virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) override; - virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) override; - virtual sal_Bool SAL_CALL usesLocalFiles( ) override; - virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) override; - virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) override; - - virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) override; - - virtual OUString SAL_CALL getSQLKeywords( ) override; - virtual OUString SAL_CALL getNumericFunctions( ) override; - virtual OUString SAL_CALL getStringFunctions( ) override; - virtual OUString SAL_CALL getSystemFunctions( ) override; - virtual OUString SAL_CALL getTimeDateFunctions( ) override; - virtual OUString SAL_CALL getSearchStringEscape( ) override; - virtual OUString SAL_CALL getExtraNameCharacters( ) override; - virtual sal_Bool SAL_CALL supportsColumnAliasing( ) override; - virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) override; - virtual sal_Bool SAL_CALL supportsTypeConversion( ) override; - virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) override; - virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) override; - virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) override; - virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) override; - virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) override; - virtual sal_Bool SAL_CALL supportsGroupBy( ) override; - virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) override; - virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) override; - virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) override; - virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) override; - virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) override; - virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) override; - virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) override; - virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) override; - virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) override; - virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) override; - virtual sal_Bool SAL_CALL supportsOuterJoins( ) override; - virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) override; - virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) override; - virtual OUString SAL_CALL getSchemaTerm( ) override; - virtual OUString SAL_CALL getProcedureTerm( ) override; - virtual OUString SAL_CALL getCatalogTerm( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsPositionedDelete( ) override; - virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) override; - virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) override; - virtual sal_Bool SAL_CALL supportsStoredProcedures( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) override; - virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) override; - virtual sal_Bool SAL_CALL supportsUnion( ) override; - virtual sal_Bool SAL_CALL supportsUnionAll( ) override; - virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) override; - virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) override; - virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) override; - virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) override; - virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) override; - virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) override; - virtual sal_Int32 SAL_CALL getMaxConnections( ) override; - virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxIndexLength( ) override; - virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxRowSize( ) override; - virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) override; - virtual sal_Int32 SAL_CALL getMaxStatementLength( ) override; - virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) override; - virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) override; - virtual sal_Bool SAL_CALL supportsTransactions( ) override; - virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) override; - virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) override; - virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) override; - virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) override; - virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const css::uno::Sequence< OUString >& types ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) override; - virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) override; - virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL supportsBatchUpdates( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& typeNamePattern, const css::uno::Sequence< sal_Int32 >& types ) override; - }; + //************ Class: OEvoabDatabaseMetaData + + typedef struct{ + gboolean bIsSplittedValue; + GParamSpec *pField; + }ColumnProperty; + + typedef enum { + DEFAULT_ADDR_LINE1=1,DEFAULT_ADDR_LINE2,DEFAULT_CITY,DEFAULT_STATE,DEFAULT_COUNTRY,DEFAULT_ZIP, + WORK_ADDR_LINE1,WORK_ADDR_LINE2,WORK_CITY,WORK_STATE,WORK_COUNTRY,WORK_ZIP, + HOME_ADDR_LINE1,HOME_ADDR_LINE2,HOME_CITY,HOME_STATE,HOME_COUNTRY,HOME_ZIP, + OTHER_ADDR_LINE1,OTHER_ADDR_LINE2,OTHER_CITY,OTHER_STATE,OTHER_COUNTRY,OTHER_ZIP + }ColumnNumber; + + typedef struct { + const gchar *pColumnName; + ColumnNumber value; + }SplitEvoColumns; + + const SplitEvoColumns* get_evo_addr(); + + const ColumnProperty *getField(guint n); + GType getGFieldType(guint nCol) ; + sal_Int32 getFieldType(guint nCol) ; + OUString getFieldTypeName(guint nCol) ; + OUString getFieldName(guint nCol) ; + guint findEvoabField(std::u16string_view aColName); + + void free_column_resources(); + + class OEvoabDatabaseMetaData : public ODatabaseMetaDataBase + { + OEvoabConnection* m_pConnection; + + protected: + virtual css::uno::Reference< css::sdbc::XResultSet > impl_getTypeInfo_throw() override; + // cached database information + virtual OUString impl_getIdentifierQuoteString_throw( ) override; + virtual bool impl_isCatalogAtStart_throw( ) override; + virtual OUString impl_getCatalogSeparator_throw( ) override; + virtual bool impl_supportsCatalogsInTableDefinitions_throw( ) override; + virtual bool impl_supportsSchemasInTableDefinitions_throw( ) override ; + virtual bool impl_supportsCatalogsInDataManipulation_throw( ) override; + virtual bool impl_supportsSchemasInDataManipulation_throw( ) override ; + virtual bool impl_supportsMixedCaseQuotedIdentifiers_throw( ) override ; + virtual bool impl_supportsAlterTableWithAddColumn_throw( ) override; + virtual bool impl_supportsAlterTableWithDropColumn_throw( ) override; + virtual sal_Int32 impl_getMaxStatements_throw( ) override; + virtual sal_Int32 impl_getMaxTablesInSelect_throw( ) override; + virtual bool impl_storesMixedCaseQuotedIdentifiers_throw( ) override; + + virtual ~OEvoabDatabaseMetaData() override; + public: + explicit OEvoabDatabaseMetaData(OEvoabConnection* _pCon); + + // as I mentioned before this interface is really BIG + // XDatabaseMetaData + virtual sal_Bool SAL_CALL allProceduresAreCallable( ) override; + virtual sal_Bool SAL_CALL allTablesAreSelectable( ) override; + virtual OUString SAL_CALL getURL( ) override; + virtual OUString SAL_CALL getUserName( ) override; + virtual sal_Bool SAL_CALL isReadOnly( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedLow( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) override; + virtual OUString SAL_CALL getDatabaseProductName( ) override; + virtual OUString SAL_CALL getDatabaseProductVersion( ) override; + virtual OUString SAL_CALL getDriverName( ) override; + virtual OUString SAL_CALL getDriverVersion( ) override; + virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) override; + virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) override; + virtual sal_Bool SAL_CALL usesLocalFiles( ) override; + virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) override; + virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) override; + + virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) override; + + virtual OUString SAL_CALL getSQLKeywords( ) override; + virtual OUString SAL_CALL getNumericFunctions( ) override; + virtual OUString SAL_CALL getStringFunctions( ) override; + virtual OUString SAL_CALL getSystemFunctions( ) override; + virtual OUString SAL_CALL getTimeDateFunctions( ) override; + virtual OUString SAL_CALL getSearchStringEscape( ) override; + virtual OUString SAL_CALL getExtraNameCharacters( ) override; + virtual sal_Bool SAL_CALL supportsColumnAliasing( ) override; + virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) override; + virtual sal_Bool SAL_CALL supportsTypeConversion( ) override; + virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) override; + virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) override; + virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) override; + virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) override; + virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) override; + virtual sal_Bool SAL_CALL supportsGroupBy( ) override; + virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) override; + virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) override; + virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) override; + virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) override; + virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) override; + virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) override; + virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) override; + virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) override; + virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) override; + virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) override; + virtual sal_Bool SAL_CALL supportsOuterJoins( ) override; + virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) override; + virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) override; + virtual OUString SAL_CALL getSchemaTerm( ) override; + virtual OUString SAL_CALL getProcedureTerm( ) override; + virtual OUString SAL_CALL getCatalogTerm( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsPositionedDelete( ) override; + virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) override; + virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) override; + virtual sal_Bool SAL_CALL supportsStoredProcedures( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) override; + virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) override; + virtual sal_Bool SAL_CALL supportsUnion( ) override; + virtual sal_Bool SAL_CALL supportsUnionAll( ) override; + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) override; + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) override; + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) override; + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) override; + virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) override; + virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) override; + virtual sal_Int32 SAL_CALL getMaxConnections( ) override; + virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxIndexLength( ) override; + virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxRowSize( ) override; + virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) override; + virtual sal_Int32 SAL_CALL getMaxStatementLength( ) override; + virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) override; + virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) override; + virtual sal_Bool SAL_CALL supportsTransactions( ) override; + virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) override; + virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) override; + virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) override; + virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) override; + virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const css::uno::Sequence< OUString >& types ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) override; + virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) override; + virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL supportsBatchUpdates( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& typeNamePattern, const css::uno::Sequence< sal_Int32 >& types ) override; + }; } diff --git a/connectivity/source/drivers/evoab2/NDriver.cxx b/connectivity/source/drivers/evoab2/NDriver.cxx index d1b7746f47c5..83934b6b3e1a 100644 --- a/connectivity/source/drivers/evoab2/NDriver.cxx +++ b/connectivity/source/drivers/evoab2/NDriver.cxx @@ -31,10 +31,8 @@ using namespace osl; using namespace connectivity::evoab; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::ucb; OEvoabDriver::OEvoabDriver(const Reference< XComponentContext >& _rxContext) : @@ -53,7 +51,7 @@ void OEvoabDriver::disposing() // when driver will be destroyed so all our connections have to be destroyed as well for (const auto& rxConnection : m_xConnections) { - Reference< XComponent > xComp(rxConnection.get(), UNO_QUERY); + rtl::Reference< OEvoabConnection > xComp(rxConnection); if (xComp.is()) { try @@ -67,7 +65,6 @@ void OEvoabDriver::disposing() } } m_xConnections.clear(); - connectivity::OWeakRefArray().swap(m_xConnections); // this really clears ODriver_BASE::disposing(); } @@ -91,7 +88,7 @@ Sequence< OUString > SAL_CALL OEvoabDriver::getSupportedServiceNames( ) { // which service is supported // for more information @see com.sun.star.sdbc.Driver - return { "com.sun.star.sdbc.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr }; } @@ -106,7 +103,7 @@ Reference< XConnection > SAL_CALL OEvoabDriver::connect( const OUString& url, co rtl::Reference<OEvoabConnection> pCon = new OEvoabConnection( *this ); pCon->construct(url,info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon); return pCon; } diff --git a/connectivity/source/drivers/evoab2/NDriver.hxx b/connectivity/source/drivers/evoab2/NDriver.hxx index 9d3b57fa7988..e144e61d2987 100644 --- a/connectivity/source/drivers/evoab2/NDriver.hxx +++ b/connectivity/source/drivers/evoab2/NDriver.hxx @@ -27,47 +27,50 @@ #include <com/sun/star/lang/XServiceInfo.hpp> #include <cppuhelper/compbase.hxx> #include <connectivity/CommonTools.hxx> +#include <unotools/weakref.hxx> -inline constexpr OUStringLiteral EVOAB_DRIVER_IMPL_NAME = u"com.sun.star.comp.sdbc.evoab.OEvoabDriver"; +inline constexpr OUString EVOAB_DRIVER_IMPL_NAME = u"com.sun.star.comp.sdbc.evoab.OEvoabDriver"_ustr; namespace connectivity::evoab - { - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XDriver, - css::lang::XServiceInfo > ODriver_BASE; +{ + class OEvoabConnection; + + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XDriver, + css::lang::XServiceInfo > ODriver_BASE; - class OEvoabDriver final : public ODriver_BASE - { - ::osl::Mutex m_aMutex; - connectivity::OWeakRefArray m_xConnections; - css::uno::Reference< css::uno::XComponentContext > m_xContext; + class OEvoabDriver final : public ODriver_BASE + { + ::osl::Mutex m_aMutex; + std::vector<unotools::WeakReference<OEvoabConnection>> m_xConnections; + css::uno::Reference< css::uno::XComponentContext > m_xContext; - public: - explicit OEvoabDriver(const css::uno::Reference< css::uno::XComponentContext >& ); - virtual ~OEvoabDriver() override; + public: + explicit OEvoabDriver(const css::uno::Reference< css::uno::XComponentContext >& ); + virtual ~OEvoabDriver() override; - // OComponentHelper - virtual void SAL_CALL disposing() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; - // XServiceInfo - virtual OUString SAL_CALL getImplementationName( ) override; - virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; - virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; - // XDriver - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL connect( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; - virtual sal_Bool SAL_CALL acceptsURL( const OUString& url ) override; - virtual css::uno::Sequence< css::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; - virtual sal_Int32 SAL_CALL getMajorVersion( ) override; - virtual sal_Int32 SAL_CALL getMinorVersion( ) override; + // XDriver + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL connect( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; + virtual sal_Bool SAL_CALL acceptsURL( const OUString& url ) override; + virtual css::uno::Sequence< css::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; + virtual sal_Int32 SAL_CALL getMajorVersion( ) override; + virtual sal_Int32 SAL_CALL getMinorVersion( ) override; - public: - const css::uno::Reference< css::uno::XComponentContext >& getComponentContext( ) const { return m_xContext; } + public: + const css::uno::Reference< css::uno::XComponentContext >& getComponentContext( ) const { return m_xContext; } - // static methods - static bool acceptsURL_Stat( std::u16string_view url ); - }; + // static methods + static bool acceptsURL_Stat( std::u16string_view url ); + }; } diff --git a/connectivity/source/drivers/evoab2/NPreparedStatement.cxx b/connectivity/source/drivers/evoab2/NPreparedStatement.cxx index 7b6172ac6cf9..f518122ebfcd 100644 --- a/connectivity/source/drivers/evoab2/NPreparedStatement.cxx +++ b/connectivity/source/drivers/evoab2/NPreparedStatement.cxx @@ -22,20 +22,19 @@ #include <connectivity/dbexception.hxx> #include <connectivity/dbtools.hxx> #include <rtl/ref.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <strings.hrc> using namespace connectivity::evoab; using namespace com::sun::star::uno; using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; using namespace com::sun::star::io; using namespace com::sun::star::util; -IMPLEMENT_SERVICE_INFO(OEvoabPreparedStatement,"com.sun.star.sdbcx.evoab.PreparedStatement","com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(OEvoabPreparedStatement,u"com.sun.star.sdbcx.evoab.PreparedStatement"_ustr,u"com.sun.star.sdbc.PreparedStatement"_ustr); OEvoabPreparedStatement::OEvoabPreparedStatement( OEvoabConnection* _pConnection ) @@ -134,14 +133,14 @@ sal_Int32 SAL_CALL OEvoabPreparedStatement::executeUpdate( ) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OCommonStatement_IBase::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XStatement::executeUpdate", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XStatement::executeUpdate"_ustr, *this ); return 0; } void SAL_CALL OEvoabPreparedStatement::setString( sal_Int32 /*parameterIndex*/, const OUString& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setString", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setString"_ustr, *this ); } @@ -165,97 +164,97 @@ Reference< XResultSet > SAL_CALL OEvoabPreparedStatement::executeQuery( ) void SAL_CALL OEvoabPreparedStatement::setBoolean( sal_Int32 /*parameterIndex*/, sal_Bool /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setBoolean", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setBoolean"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setByte( sal_Int32 /*parameterIndex*/, sal_Int8 /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setByte", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setByte"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setDate( sal_Int32 /*parameterIndex*/, const Date& /*aData*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setDate", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setDate"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setTime( sal_Int32 /*parameterIndex*/, const css::util::Time& /*aVal*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setTime", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setTime"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setTimestamp( sal_Int32 /*parameterIndex*/, const DateTime& /*aVal*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setTimestamp", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setTimestamp"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setDouble( sal_Int32 /*parameterIndex*/, double /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setDouble", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setDouble"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setFloat( sal_Int32 /*parameterIndex*/, float /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setFloat", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setFloat"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setInt( sal_Int32 /*parameterIndex*/, sal_Int32 /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setInt", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setInt"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setLong( sal_Int32 /*parameterIndex*/, sal_Int64 /*aVal*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setLong", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setLong"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setNull( sal_Int32 /*parameterIndex*/, sal_Int32 /*sqlType*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setNull", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setNull"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setClob( sal_Int32 /*parameterIndex*/, const Reference< XClob >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setClob", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setClob"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setBlob( sal_Int32 /*parameterIndex*/, const Reference< XBlob >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setBlob", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setBlob"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const Reference< XArray >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setArray", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setArray"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const Reference< XRef >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setRef", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setRef"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setObjectWithInfo( sal_Int32 /*parameterIndex*/, const Any& /*x*/, sal_Int32 /*sqlType*/, sal_Int32 /*scale*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setObjectWithInfo", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setObjectWithInfo"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setObjectNull( sal_Int32 /*parameterIndex*/, sal_Int32 /*sqlType*/, const OUString& /*typeName*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setObjectNull", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setObjectNull"_ustr, *this ); } @@ -274,25 +273,25 @@ void SAL_CALL OEvoabPreparedStatement::setObject( sal_Int32 parameterIndex, cons void SAL_CALL OEvoabPreparedStatement::setShort( sal_Int32 /*parameterIndex*/, sal_Int16 /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setShort", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setShort"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setBytes( sal_Int32 /*parameterIndex*/, const Sequence< sal_Int8 >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setBytes", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setBytes"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setCharacterStream( sal_Int32 /*parameterIndex*/, const Reference< XInputStream >& /*x*/, sal_Int32 /*length*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setCharacterStream", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setCharacterStream"_ustr, *this ); } void SAL_CALL OEvoabPreparedStatement::setBinaryStream( sal_Int32 /*parameterIndex*/, const Reference< XInputStream >& /*x*/, sal_Int32 /*length*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setBinaryStream", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setBinaryStream"_ustr, *this ); } diff --git a/connectivity/source/drivers/evoab2/NPreparedStatement.hxx b/connectivity/source/drivers/evoab2/NPreparedStatement.hxx index cd42d42d505b..22463c0ee2d4 100644 --- a/connectivity/source/drivers/evoab2/NPreparedStatement.hxx +++ b/connectivity/source/drivers/evoab2/NPreparedStatement.hxx @@ -33,75 +33,75 @@ namespace connectivity::evoab { - typedef ::cppu::ImplHelper5< css::sdbc::XPreparedStatement, - css::sdbc::XParameters, - css::sdbc::XResultSetMetaDataSupplier, - css::sdbc::XMultipleResults, - css::lang::XServiceInfo> OPreparedStatement_BASE; + typedef ::cppu::ImplHelper5< css::sdbc::XPreparedStatement, + css::sdbc::XParameters, + css::sdbc::XResultSetMetaDataSupplier, + css::sdbc::XMultipleResults, + css::lang::XServiceInfo> OPreparedStatement_BASE; - class OEvoabPreparedStatement final:public OCommonStatement - ,public OPreparedStatement_BASE - { - // our SQL statement - OUString m_sSqlStatement; - // the EBookQuery we're working with - QueryData m_aQueryData; - // our meta data - css::uno::Reference< css::sdbc::XResultSetMetaData > m_xMetaData; + class OEvoabPreparedStatement final:public OCommonStatement + ,public OPreparedStatement_BASE + { + // our SQL statement + OUString m_sSqlStatement; + // the EBookQuery we're working with + QueryData m_aQueryData; + // our meta data + rtl::Reference<OEvoabResultSetMetaData> m_xMetaData; - virtual ~OEvoabPreparedStatement() override; + virtual ~OEvoabPreparedStatement() override; - public: - explicit OEvoabPreparedStatement( OEvoabConnection* _pConnection ); + public: + explicit OEvoabPreparedStatement( OEvoabConnection* _pConnection ); - void construct( const OUString& _sql ); + void construct( const OUString& _sql ); - DECLARE_SERVICE_INFO(); - //XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + DECLARE_SERVICE_INFO(); + //XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - // XPreparedStatement - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( ) override; - virtual sal_Int32 SAL_CALL executeUpdate( ) override; - virtual sal_Bool SAL_CALL execute( ) override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; - // XParameters - virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) override; - virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const OUString& typeName ) override; - virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) override; - virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) override; - virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) override; - virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) override; - virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) override; - virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) override; - virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) override; - virtual void SAL_CALL setString( sal_Int32 parameterIndex, const OUString& x ) override; - virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const css::uno::Sequence< sal_Int8 >& x ) override; - virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const css::util::Date& x ) override; - virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const css::util::Time& x ) override; - virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const css::util::DateTime& x ) override; - virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const css::uno::Any& x ) override; - virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const css::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) override; - virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XRef >& x ) override; - virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XBlob >& x ) override; - virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XClob >& x ) override; - virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XArray >& x ) override; - virtual void SAL_CALL clearParameters( ) override; - // XCloseable - virtual void SAL_CALL close( ) override; - // XResultSetMetaDataSupplier - virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; - // XMultipleResults - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getResultSet( ) override; - virtual sal_Int32 SAL_CALL getUpdateCount( ) override; - virtual sal_Bool SAL_CALL getMoreResults( ) override; - }; + // XPreparedStatement + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( ) override; + virtual sal_Int32 SAL_CALL executeUpdate( ) override; + virtual sal_Bool SAL_CALL execute( ) override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; + // XParameters + virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) override; + virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const OUString& typeName ) override; + virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) override; + virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) override; + virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) override; + virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) override; + virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) override; + virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) override; + virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) override; + virtual void SAL_CALL setString( sal_Int32 parameterIndex, const OUString& x ) override; + virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const css::uno::Sequence< sal_Int8 >& x ) override; + virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const css::util::Date& x ) override; + virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const css::util::Time& x ) override; + virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const css::util::DateTime& x ) override; + virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const css::uno::Any& x ) override; + virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const css::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) override; + virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XRef >& x ) override; + virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XBlob >& x ) override; + virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XClob >& x ) override; + virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XArray >& x ) override; + virtual void SAL_CALL clearParameters( ) override; + // XCloseable + virtual void SAL_CALL close( ) override; + // XResultSetMetaDataSupplier + virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; + // XMultipleResults + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getResultSet( ) override; + virtual sal_Int32 SAL_CALL getUpdateCount( ) override; + virtual sal_Bool SAL_CALL getMoreResults( ) override; + }; } diff --git a/connectivity/source/drivers/evoab2/NResultSet.cxx b/connectivity/source/drivers/evoab2/NResultSet.cxx index c0b31cc100e4..95a25d664602 100644 --- a/connectivity/source/drivers/evoab2/NResultSet.cxx +++ b/connectivity/source/drivers/evoab2/NResultSet.cxx @@ -36,7 +36,7 @@ #include <connectivity/sqlerror.hxx> #include <rtl/string.hxx> #include <sal/log.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <unotools/syslocale.hxx> #include <unotools/intlwrapper.hxx> #include <unotools/collatorwrapper.hxx> @@ -51,7 +51,6 @@ using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; using namespace com::sun::star::io; namespace ErrorCondition = ::com::sun::star::sdb::ErrorCondition; @@ -59,12 +58,12 @@ namespace ErrorCondition = ::com::sun::star::sdb::ErrorCondition; OUString SAL_CALL OEvoabResultSet::getImplementationName( ) { - return "com.sun.star.sdbcx.evoab.ResultSet"; + return u"com.sun.star.sdbcx.evoab.ResultSet"_ustr; } Sequence< OUString > SAL_CALL OEvoabResultSet::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr }; } sal_Bool SAL_CALL OEvoabResultSet::supportsService( const OUString& _rServiceName ) @@ -88,7 +87,7 @@ static OUString valueToOUString( GValue& _rValue ) { const char *pStr = g_value_get_string( &_rValue ); - OString aStr( pStr ? pStr : "" ); + std::string_view aStr( pStr ? pStr : "" ); OUString sResult( OStringToOUString( aStr, RTL_TEXTENCODING_UTF8 ) ); g_value_unset( &_rValue ); return sResult; @@ -308,6 +307,10 @@ static int CompareContacts( gconstpointer _lhs, gconstpointer _rhs, gpointer _us for ( const auto& sortCol : rCompData.rSortOrder ) { sal_Int32 nField = sortCol.nField; + int nOrder = 1; + // if descending sort, reverse order + if (!sortCol.bAscending) + nOrder = -1; GType eFieldType = evoab::getGFieldType( nField ); bool success = getValue( lhs, nField, eFieldType, &aLhsValue, bLhsNull ) @@ -317,9 +320,9 @@ static int CompareContacts( gconstpointer _lhs, gconstpointer _rhs, gpointer _us return 0; if ( bLhsNull && !bRhsNull ) - return -1; + return -1 * nOrder; if ( !bLhsNull && bRhsNull ) - return 1; + return 1 * nOrder; if ( bLhsNull && bRhsNull ) continue; @@ -329,16 +332,16 @@ static int CompareContacts( gconstpointer _lhs, gconstpointer _rhs, gpointer _us sRhs = valueToOUString( aRhsValue ); sal_Int32 nCompResult = rCompData.aIntlWrapper.getCaseCollator()->compareString( sLhs, sRhs ); if ( nCompResult != 0 ) - return nCompResult; + return nCompResult * nOrder; continue; } bLhs = valueToBool( aLhsValue ); bRhs = valueToBool( aRhsValue ); if ( bLhs && !bRhs ) - return -1; + return -1 * nOrder; if ( !bLhs && bRhs ) - return 1; + return 1 * nOrder; continue; } @@ -398,7 +401,7 @@ public: break; } } - g_list_foreach (pSources, reinterpret_cast<GFunc>(g_object_unref), nullptr); + g_list_foreach (pSources, object_unref, nullptr); g_list_free (pSources); if (!id) return nullptr; @@ -431,7 +434,7 @@ public: m_pContacts = nullptr; } - virtual void executeQuery (EBook* pBook, EBookQuery* pQuery, OString &/*rPassword*/) override + virtual void executeQuery (EBook* pBook, EBookQuery* pQuery) override { freeContacts(); char *sexp = e_book_query_to_string( pQuery ); @@ -476,123 +479,7 @@ class OEvoabVersion38Helper : public OEvoabVersion36Helper protected: virtual EBookClient * createClient( ESource *pSource ) override { - return e_book_client_connect_direct_sync (get_e_source_registry (), pSource, nullptr, nullptr); - } -}; - -ESource * findSource( const char *id ) -{ - ESourceList *pSourceList = nullptr; - - g_return_val_if_fail (id != nullptr, nullptr); - - if (!e_book_get_addressbooks (&pSourceList, nullptr)) - pSourceList = nullptr; - - for ( GSList *g = e_source_list_peek_groups (pSourceList); g; g = g->next) - { - for (GSList *s = e_source_group_peek_sources (E_SOURCE_GROUP (g->data)); s; s = s->next) - { - ESource *pSource = E_SOURCE (s->data); - if (!strcmp (e_source_peek_name (pSource), id)) - return pSource; - } - } - return nullptr; -} - -bool isAuthRequired( EBook *pBook ) -{ - return e_source_get_property( e_book_get_source( pBook ), - "auth" ) != nullptr; -} - -class OEvoabVersion35Helper : public OEvoabVersionHelper -{ -private: - GList *m_pContacts; - -public: - OEvoabVersion35Helper() - : m_pContacts(nullptr) - { - } - - virtual ~OEvoabVersion35Helper() override - { - freeContacts(); - } - - virtual EBook* openBook(const char *abname) override - { - ESource *pSource = findSource (abname); - EBook *pBook = pSource ? e_book_new (pSource, nullptr) : nullptr; - if (pBook && !e_book_open (pBook, true, nullptr)) - { - g_object_unref (G_OBJECT (pBook)); - pBook = nullptr; - } - return pBook; - } - - virtual bool isLDAP( EBook *pBook ) override - { - return pBook && !strncmp( "ldap://", e_book_get_uri( pBook ), 6 ); - } - - virtual bool isLocal( EBook *pBook ) override - { - return pBook && ( !strncmp( "file://", e_book_get_uri( pBook ), 6 ) || - !strncmp( "local:", e_book_get_uri( pBook ), 6 ) ); - } - - virtual void freeContacts() override final - { - g_list_free(m_pContacts); - m_pContacts = nullptr; - } - - virtual void executeQuery (EBook* pBook, EBookQuery* pQuery, OString &rPassword) override - { - freeContacts(); - - ESource *pSource = e_book_get_source( pBook ); - bool bAuthSuccess = true; - - if( isAuthRequired( pBook ) ) - { - OString aUser( getUserName( pBook ) ); - const char *pAuth = e_source_get_property( pSource, "auth" ); - bAuthSuccess = e_book_authenticate_user( pBook, aUser.getStr(), rPassword.getStr(), pAuth, nullptr ); - } - - if (bAuthSuccess) - e_book_get_contacts( pBook, pQuery, &m_pContacts, nullptr ); - } - - virtual EContact *getContact(sal_Int32 nIndex) override - { - gpointer pData = g_list_nth_data (m_pContacts, nIndex); - return pData ? E_CONTACT (pData) : nullptr; - } - - virtual sal_Int32 getNumContacts() override - { - return g_list_length( m_pContacts ); - } - - virtual bool hasContacts() override - { - return m_pContacts != nullptr; - } - - virtual void sortContacts( const ComparisonData& _rCompData ) override - { - OSL_ENSURE( !_rCompData.rSortOrder.empty(), "sortContacts: no need to call this without any sort order!" ); - ENSURE_OR_THROW( _rCompData.aIntlWrapper.getCaseCollator(), "no collator for comparing strings" ); - - m_pContacts = g_list_sort_with_data( m_pContacts, &CompareContacts, - const_cast< gpointer >( static_cast< gconstpointer >( &_rCompData ) ) ); + return e_book_client_connect_direct_sync (get_e_source_registry (), pSource, 10, nullptr, nullptr); } }; @@ -611,12 +498,7 @@ OEvoabResultSet::OEvoabResultSet( OCommonStatement* pStmt, OEvoabConnection *pCo ,m_nIndex(-1) ,m_nLength(0) { - if (eds_check_version( 3, 7, 6 ) == nullptr) - m_pVersionHelper = std::make_unique<OEvoabVersion38Helper>(); - else if (eds_check_version( 3, 6, 0 ) == nullptr) - m_pVersionHelper = std::make_unique<OEvoabVersion36Helper>(); - else - m_pVersionHelper = std::make_unique<OEvoabVersion35Helper>(); + m_pVersionHelper = std::make_unique<OEvoabVersion38Helper>(); registerProperty( OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), @@ -687,9 +569,7 @@ void OEvoabResultSet::construct( const QueryData& _rData ) } if ( bExecuteQuery ) { - OString aPassword = m_pConnection->getPassword(); - m_pVersionHelper->executeQuery(pBook, _rData.getQuery(), aPassword); - m_pConnection->setPassword( aPassword ); + m_pVersionHelper->executeQuery(pBook, _rData.getQuery()); if ( m_pVersionHelper->hasContacts() && !_rData.aSortOrder.empty() ) { @@ -777,103 +657,103 @@ sal_Bool SAL_CALL OEvoabResultSet::getBoolean( sal_Int32 nColumnNum ) sal_Int64 SAL_CALL OEvoabResultSet::getLong( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getLong", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getLong"_ustr, *this ); return sal_Int64(); } Reference< XArray > SAL_CALL OEvoabResultSet::getArray( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getArray", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getArray"_ustr, *this ); return nullptr; } Reference< XClob > SAL_CALL OEvoabResultSet::getClob( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getClob", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getClob"_ustr, *this ); return nullptr; } Reference< XBlob > SAL_CALL OEvoabResultSet::getBlob( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBlob", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBlob"_ustr, *this ); return nullptr; } Reference< XRef > SAL_CALL OEvoabResultSet::getRef( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getRef", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getRef"_ustr, *this ); return nullptr; } Any SAL_CALL OEvoabResultSet::getObject( sal_Int32 /*nColumnNum*/, const Reference< css::container::XNameAccess >& /*typeMap*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getObject", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getObject"_ustr, *this ); return Any(); } sal_Int16 SAL_CALL OEvoabResultSet::getShort( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getShort", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getShort"_ustr, *this ); return 0; } css::util::Time SAL_CALL OEvoabResultSet::getTime( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getTime", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getTime"_ustr, *this ); return css::util::Time(); } util::DateTime SAL_CALL OEvoabResultSet::getTimestamp( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getTimestamp", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getTimestamp"_ustr, *this ); return css::util::DateTime(); } Reference< XInputStream > SAL_CALL OEvoabResultSet::getBinaryStream( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBinaryStream", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBinaryStream"_ustr, *this ); return nullptr; } Reference< XInputStream > SAL_CALL OEvoabResultSet::getCharacterStream( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getCharacterStream", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getCharacterStream"_ustr, *this ); return nullptr; } sal_Int8 SAL_CALL OEvoabResultSet::getByte( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getByte", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getByte"_ustr, *this ); return 0; } Sequence< sal_Int8 > SAL_CALL OEvoabResultSet::getBytes( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBytes", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBytes"_ustr, *this ); return Sequence< sal_Int8 >(); } css::util::Date SAL_CALL OEvoabResultSet::getDate( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getDate", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getDate"_ustr, *this ); return css::util::Date(); } double SAL_CALL OEvoabResultSet::getDouble( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getDouble", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getDouble"_ustr, *this ); return 0; } float SAL_CALL OEvoabResultSet::getFloat( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getFloat", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getFloat"_ustr, *this ); return 0; } sal_Int32 SAL_CALL OEvoabResultSet::getInt( sal_Int32 /*nColumnNum*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getInt", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getInt"_ustr, *this ); return 0; } // XRow Interface Ends @@ -1031,8 +911,7 @@ Reference< XInterface > SAL_CALL OEvoabResultSet::getStatement( ) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - css::uno::WeakReferenceHelper aStatement(static_cast<OWeakObject*>(m_pStatement)); - return aStatement.get(); + return cppu::getXWeak(m_pStatement); } diff --git a/connectivity/source/drivers/evoab2/NResultSet.hxx b/connectivity/source/drivers/evoab2/NResultSet.hxx index 74a5e40dda1f..659fa4ff4b20 100644 --- a/connectivity/source/drivers/evoab2/NResultSet.hxx +++ b/connectivity/source/drivers/evoab2/NResultSet.hxx @@ -43,139 +43,139 @@ namespace connectivity::evoab { - struct ComparisonData; - - class OEvoabVersionHelper - { - public: - virtual EBook* openBook(const char *abname) = 0; - virtual void executeQuery (EBook* pBook, EBookQuery* pQuery, OString &rPassword) = 0; - virtual void freeContacts() = 0; - virtual bool isLDAP( EBook *pBook ) = 0; - virtual bool isLocal( EBook *pBook ) = 0; - virtual EContact *getContact(sal_Int32 nIndex) = 0; - virtual sal_Int32 getNumContacts() = 0; - virtual bool hasContacts() = 0; - virtual void sortContacts( const ComparisonData& _rCompData ) = 0; - OString getUserName( EBook *pBook ); - virtual ~OEvoabVersionHelper() {} - }; - - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XResultSet - , css::sdbc::XRow - , css::sdbc::XResultSetMetaDataSupplier - , css::util::XCancellable - , css::sdbc::XWarningsSupplier - , css::sdbc::XCloseable - , css::sdbc::XColumnLocate - , css::lang::XServiceInfo - > OResultSet_BASE; - - - class OEvoabResultSet final : public cppu::BaseMutex - ,public OResultSet_BASE - ,public ::comphelper::OPropertyContainer - ,public ::comphelper::OPropertyArrayUsageHelper<OEvoabResultSet> + struct ComparisonData; + + class OEvoabVersionHelper + { + public: + virtual EBook* openBook(const char *abname) = 0; + virtual void executeQuery (EBook* pBook, EBookQuery* pQuery) = 0; + virtual void freeContacts() = 0; + virtual bool isLDAP( EBook *pBook ) = 0; + virtual bool isLocal( EBook *pBook ) = 0; + virtual EContact *getContact(sal_Int32 nIndex) = 0; + virtual sal_Int32 getNumContacts() = 0; + virtual bool hasContacts() = 0; + virtual void sortContacts( const ComparisonData& _rCompData ) = 0; + OString getUserName( EBook *pBook ); + virtual ~OEvoabVersionHelper() {} + }; + + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XResultSet + , css::sdbc::XRow + , css::sdbc::XResultSetMetaDataSupplier + , css::util::XCancellable + , css::sdbc::XWarningsSupplier + , css::sdbc::XCloseable + , css::sdbc::XColumnLocate + , css::lang::XServiceInfo + > OResultSet_BASE; + + + class OEvoabResultSet final : public cppu::BaseMutex + ,public OResultSet_BASE + ,public ::comphelper::OPropertyContainer + ,public ::comphelper::OPropertyArrayUsageHelper<OEvoabResultSet> + { + private: + std::unique_ptr<OEvoabVersionHelper> m_pVersionHelper; + + OCommonStatement* m_pStatement; + OEvoabConnection* m_pConnection; + rtl::Reference<OEvoabResultSetMetaData> m_xMetaData; + ::dbtools::WarningsContainer m_aWarnings; + + bool m_bWasNull; + // <properties> + sal_Int32 m_nFetchSize; + sal_Int32 m_nResultSetType; + sal_Int32 m_nFetchDirection; + sal_Int32 m_nResultSetConcurrency; + // </properties> + + // Data & iteration + sal_Int32 m_nIndex; + sal_Int32 m_nLength; + EContact *getCur() { - private: - std::unique_ptr<OEvoabVersionHelper> m_pVersionHelper; - - OCommonStatement* m_pStatement; - OEvoabConnection* m_pConnection; - rtl::Reference<OEvoabResultSetMetaData> m_xMetaData; - ::dbtools::WarningsContainer m_aWarnings; - - bool m_bWasNull; - // <properties> - sal_Int32 m_nFetchSize; - sal_Int32 m_nResultSetType; - sal_Int32 m_nFetchDirection; - sal_Int32 m_nResultSetConcurrency; - // </properties> - - // Data & iteration - sal_Int32 m_nIndex; - sal_Int32 m_nLength; - EContact *getCur() - { - return m_pVersionHelper->getContact(m_nIndex); - } - - // OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const override; - // OPropertySetHelper - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; - - // you can't delete objects of this type - virtual ~OEvoabResultSet() override; - public: - DECLARE_SERVICE_INFO(); - - OEvoabResultSet( OCommonStatement *pStmt, OEvoabConnection *pConnection ); - void construct( const QueryData& _rData ); - - // ::cppu::OComponentHelper - virtual void SAL_CALL disposing() override; - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - // XPropertySet - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; - // XResultSet - virtual sal_Bool SAL_CALL next( ) override; - virtual sal_Bool SAL_CALL isBeforeFirst( ) override; - virtual sal_Bool SAL_CALL isAfterLast( ) override; - virtual sal_Bool SAL_CALL isFirst( ) override; - virtual sal_Bool SAL_CALL isLast( ) override; - virtual void SAL_CALL beforeFirst( ) override; - virtual void SAL_CALL afterLast( ) override; - virtual sal_Bool SAL_CALL first( ) override; - virtual sal_Bool SAL_CALL last( ) override; - virtual sal_Int32 SAL_CALL getRow( ) override; - virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) override; - virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) override; - virtual sal_Bool SAL_CALL previous( ) override; - virtual void SAL_CALL refreshRow( ) override; - virtual sal_Bool SAL_CALL rowUpdated( ) override; - virtual sal_Bool SAL_CALL rowInserted( ) override; - virtual sal_Bool SAL_CALL rowDeleted( ) override; - virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getStatement( ) override; - // XRow - virtual sal_Bool SAL_CALL wasNull( ) override; - virtual OUString SAL_CALL getString( sal_Int32 columnIndex ) override; - virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) override; - virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) override; - virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) override; - virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) override; - virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) override; - virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) override; - virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) override; - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) override; - virtual css::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) override; - virtual css::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) override; - virtual css::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) override; - virtual css::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; - virtual css::uno::Reference< css::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) override; - // XCancellable - virtual void SAL_CALL cancel( ) override; - // XCloseable - virtual void SAL_CALL close( ) override; - // XResultSetMetaDataSupplier - virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - // XColumnLocate - virtual sal_Int32 SAL_CALL findColumn( const OUString& columnName ) override; - }; + return m_pVersionHelper->getContact(m_nIndex); + } + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const override; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + + // you can't delete objects of this type + virtual ~OEvoabResultSet() override; + public: + DECLARE_SERVICE_INFO(); + + OEvoabResultSet( OCommonStatement *pStmt, OEvoabConnection *pConnection ); + void construct( const QueryData& _rData ); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing() override; + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + // XResultSet + virtual sal_Bool SAL_CALL next( ) override; + virtual sal_Bool SAL_CALL isBeforeFirst( ) override; + virtual sal_Bool SAL_CALL isAfterLast( ) override; + virtual sal_Bool SAL_CALL isFirst( ) override; + virtual sal_Bool SAL_CALL isLast( ) override; + virtual void SAL_CALL beforeFirst( ) override; + virtual void SAL_CALL afterLast( ) override; + virtual sal_Bool SAL_CALL first( ) override; + virtual sal_Bool SAL_CALL last( ) override; + virtual sal_Int32 SAL_CALL getRow( ) override; + virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) override; + virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) override; + virtual sal_Bool SAL_CALL previous( ) override; + virtual void SAL_CALL refreshRow( ) override; + virtual sal_Bool SAL_CALL rowUpdated( ) override; + virtual sal_Bool SAL_CALL rowInserted( ) override; + virtual sal_Bool SAL_CALL rowDeleted( ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getStatement( ) override; + // XRow + virtual sal_Bool SAL_CALL wasNull( ) override; + virtual OUString SAL_CALL getString( sal_Int32 columnIndex ) override; + virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) override; + virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) override; + virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) override; + virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) override; + virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) override; + virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) override; + virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) override; + virtual css::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) override; + virtual css::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) override; + virtual css::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) override; + virtual css::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; + virtual css::uno::Reference< css::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) override; + // XCancellable + virtual void SAL_CALL cancel( ) override; + // XCloseable + virtual void SAL_CALL close( ) override; + // XResultSetMetaDataSupplier + virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + // XColumnLocate + virtual sal_Int32 SAL_CALL findColumn( const OUString& columnName ) override; + }; } diff --git a/connectivity/source/drivers/evoab2/NResultSetMetaData.cxx b/connectivity/source/drivers/evoab2/NResultSetMetaData.cxx index a980c2067041..a828b127fe68 100644 --- a/connectivity/source/drivers/evoab2/NResultSetMetaData.cxx +++ b/connectivity/source/drivers/evoab2/NResultSetMetaData.cxx @@ -21,14 +21,14 @@ #include "NDatabaseMetaData.hxx" #include <connectivity/dbexception.hxx> #include <strings.hrc> +#include <utility> using namespace connectivity::evoab; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; using namespace com::sun::star::sdbc; -OEvoabResultSetMetaData::OEvoabResultSetMetaData(const OUString& _aTableName) - : m_aTableName(_aTableName) +OEvoabResultSetMetaData::OEvoabResultSetMetaData(OUString _aTableName) + : m_aTableName(std::move(_aTableName)) { } @@ -101,15 +101,7 @@ OUString SAL_CALL OEvoabResultSetMetaData::getColumnTypeName( sal_Int32 nColumnN OUString SAL_CALL OEvoabResultSetMetaData::getColumnLabel( sal_Int32 nColumnNum ) { - sal_uInt32 nField = m_aEvoabFields[nColumnNum - 1]; - const ColumnProperty *pSpecs = getField(nField); - GParamSpec *pSpec = pSpecs->pField; - OUString aLabel; - - if( pSpec ) - aLabel = OStringToOUString( g_param_spec_get_nick( pSpec ), - RTL_TEXTENCODING_UTF8 ); - return aLabel; + return getColumnName(nColumnNum); } OUString SAL_CALL OEvoabResultSetMetaData::getColumnServiceName( sal_Int32 /*nColumnNum*/ ) diff --git a/connectivity/source/drivers/evoab2/NResultSetMetaData.hxx b/connectivity/source/drivers/evoab2/NResultSetMetaData.hxx index 66fffb984e4f..e79d347b1c4d 100644 --- a/connectivity/source/drivers/evoab2/NResultSetMetaData.hxx +++ b/connectivity/source/drivers/evoab2/NResultSetMetaData.hxx @@ -40,7 +40,7 @@ namespace connectivity::evoab protected: virtual ~OEvoabResultSetMetaData() override; public: - explicit OEvoabResultSetMetaData(const OUString& _aTableName); + explicit OEvoabResultSetMetaData(OUString _aTableName); /// @throws css::sdbc::SQLException void setEvoabFields(const ::rtl::Reference<connectivity::OSQLColumns> &xColumns); sal_uInt32 fieldAtColumn(sal_Int32 columnIndex) const diff --git a/connectivity/source/drivers/evoab2/NStatement.cxx b/connectivity/source/drivers/evoab2/NStatement.cxx index 542ee1de8d45..8fee66699b3d 100644 --- a/connectivity/source/drivers/evoab2/NStatement.cxx +++ b/connectivity/source/drivers/evoab2/NStatement.cxx @@ -38,7 +38,7 @@ #include <sqlbison.hxx> #include <strings.hrc> #include <connectivity/dbexception.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> namespace connectivity::evoab { @@ -49,7 +49,6 @@ using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; -using namespace com::sun::star::io; using namespace com::sun::star::util; namespace { @@ -161,7 +160,7 @@ OCommonStatement::~OCommonStatement() void OCommonStatement::disposeResultSet() { // free the cursor if alive - Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OEvoabResultSet > xComp(m_xResultSet); if (xComp.is()) xComp->dispose(); m_xResultSet.clear(); @@ -268,8 +267,11 @@ void OCommonStatement::orderByAnalysis( const OSQLParseNode* _pOrderByClause, So ENSURE_OR_THROW( ( pColumnRef != nullptr ) && ( pAscDesc != nullptr ) - && SQL_ISRULE( pAscDesc, opt_asc_desc ) - && ( pAscDesc->count() < 2 ), + && ( pAscDesc->isLeaf() ) + && ( SQL_ISRULE( pAscDesc, opt_asc_desc ) + || SQL_ISTOKEN(pAscDesc, ASC) + || SQL_ISTOKEN(pAscDesc, DESC) + ), "ordering_spec structure error" ); // column name -> column field @@ -278,11 +280,7 @@ void OCommonStatement::orderByAnalysis( const OSQLParseNode* _pOrderByClause, So const OUString sColumnName( impl_getColumnRefColumnName_throw( *pColumnRef ) ); guint nField = evoab::findEvoabField( sColumnName ); // ascending/descending? - bool bAscending = true; - if ( ( pAscDesc->count() == 1 ) - && SQL_ISTOKEN( pAscDesc->getChild( 0 ), DESC ) - ) - bAscending = false; + bool bAscending = !SQL_ISTOKEN(pAscDesc, DESC); _out_rSort.push_back( FieldSort( nField, bAscending ) ); } @@ -506,6 +504,7 @@ void OCommonStatement::parseSql( const OUString& sql, QueryData& _out_rQueryData pOrderByClause->showParseTree( sTreeDebug ); SAL_INFO( "connectivity.evoab2", "found order-by tree:\n" << sTreeDebug ); #endif + orderByAnalysis( pOrderByClause, _out_rQueryData.aSortOrder ); } @@ -549,7 +548,7 @@ Any SAL_CALL OCommonStatement::getWarnings( ) checkDisposed(OCommonStatement_IBase::rBHelper.bDisposed); - return makeAny(SQLWarning()); + return Any(SQLWarning()); } @@ -614,7 +613,7 @@ Reference< XResultSet > OCommonStatement::impl_executeQuery_throw( const QueryDa pResult->construct( _rQueryData ); // done - m_xResultSet = pResult; + m_xResultSet = pResult.get(); return pResult; } @@ -641,7 +640,7 @@ Reference< XPropertySetInfo > SAL_CALL OCommonStatement::getPropertySetInfo( ) // = OStatement -IMPLEMENT_SERVICE_INFO( OStatement, "com.sun.star.comp.sdbcx.evoab.OStatement", "com.sun.star.sdbc.Statement" ); +IMPLEMENT_SERVICE_INFO( OStatement, u"com.sun.star.comp.sdbcx.evoab.OStatement"_ustr, u"com.sun.star.sdbc.Statement"_ustr ); IMPLEMENT_FORWARD_XINTERFACE2( OStatement, OCommonStatement, OStatement_IBase ) @@ -673,7 +672,7 @@ sal_Int32 SAL_CALL OStatement::executeUpdate( const OUString& /*sql*/ ) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OCommonStatement_IBase::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XStatement::executeUpdate", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XStatement::executeUpdate"_ustr, *this ); return 0; } diff --git a/connectivity/source/drivers/evoab2/NStatement.hxx b/connectivity/source/drivers/evoab2/NStatement.hxx index a348c5335d56..302c6d8ac1ad 100644 --- a/connectivity/source/drivers/evoab2/NStatement.hxx +++ b/connectivity/source/drivers/evoab2/NStatement.hxx @@ -36,6 +36,7 @@ #include <com/sun/star/util/XCancellable.hpp> #include <cppuhelper/compbase.hxx> #include <comphelper/propertycontainer.hxx> +#include <unotools/weakref.hxx> #include "EApi.h" #include "NConnection.hxx" @@ -44,229 +45,231 @@ namespace connectivity::evoab { - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XWarningsSupplier - , css::sdbc::XCloseable - > OCommonStatement_IBase; - - struct FieldSort + class OEvoabResultSet; + + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XWarningsSupplier + , css::sdbc::XCloseable + > OCommonStatement_IBase; + + struct FieldSort + { + sal_Int32 nField; + bool bAscending; + + FieldSort( const sal_Int32 _nField, const bool _bAscending ) : nField( _nField ), bAscending( _bAscending ) { } + }; + typedef std::vector< FieldSort > SortDescriptor; + + enum QueryFilterType + { + eFilterAlwaysFalse, + eFilterNone, + eFilterOther + }; + + class EBookQueryWrapper + { + private: + EBookQuery* mpQuery; + public: + EBookQueryWrapper() + : mpQuery(nullptr) { - sal_Int32 nField; - bool bAscending; - - FieldSort( const sal_Int32 _nField, const bool _bAscending ) : nField( _nField ), bAscending( _bAscending ) { } - }; - typedef std::vector< FieldSort > SortDescriptor; - - enum QueryFilterType + } + EBookQueryWrapper(const EBookQueryWrapper& rhs) + : mpQuery(rhs.mpQuery) { - eFilterAlwaysFalse, - eFilterNone, - eFilterOther - }; - - class EBookQueryWrapper + if (mpQuery) + e_book_query_ref(mpQuery); + } + EBookQueryWrapper(EBookQueryWrapper&& rhs) noexcept + : mpQuery(rhs.mpQuery) + { + rhs.mpQuery = nullptr; + } + void reset(EBookQuery* pQuery) + { + if (mpQuery) + e_book_query_unref(mpQuery); + mpQuery = pQuery; + if (mpQuery) + e_book_query_ref(mpQuery); + } + EBookQueryWrapper& operator=(const EBookQueryWrapper& rhs) { - private: - EBookQuery* mpQuery; - public: - EBookQueryWrapper() - : mpQuery(nullptr) - { - } - EBookQueryWrapper(const EBookQueryWrapper& rhs) - : mpQuery(rhs.mpQuery) - { - if (mpQuery) - e_book_query_ref(mpQuery); - } - EBookQueryWrapper(EBookQueryWrapper&& rhs) noexcept - : mpQuery(rhs.mpQuery) - { - rhs.mpQuery = nullptr; - } - void reset(EBookQuery* pQuery) - { - if (mpQuery) - e_book_query_unref(mpQuery); - mpQuery = pQuery; - if (mpQuery) - e_book_query_ref(mpQuery); - } - EBookQueryWrapper& operator=(const EBookQueryWrapper& rhs) - { - if (this != &rhs) - reset(rhs.mpQuery); - return *this; - } - EBookQueryWrapper& operator=(EBookQueryWrapper&& rhs) - { - if (mpQuery) - e_book_query_unref(mpQuery); - mpQuery = rhs.mpQuery; - rhs.mpQuery = nullptr; - return *this; - } - ~EBookQueryWrapper() - { - if (mpQuery) - e_book_query_unref(mpQuery); - } - EBookQuery* getQuery() const - { - return mpQuery; - } - }; - - struct QueryData + if (this != &rhs) + reset(rhs.mpQuery); + return *this; + } + EBookQueryWrapper& operator=(EBookQueryWrapper&& rhs) { - private: - EBookQueryWrapper aQuery; - - public: - OUString sTable; - QueryFilterType eFilterType; - rtl::Reference<connectivity::OSQLColumns> xSelectColumns; - SortDescriptor aSortOrder; - - QueryData() - : sTable() - , eFilterType( eFilterOther ) - , xSelectColumns() - , aSortOrder() - { - } - - EBookQuery* getQuery() const { return aQuery.getQuery(); } - void setQuery(EBookQuery* pQuery) { aQuery.reset(pQuery); } - }; - - //************ Class: OCommonStatement - // is a base class for the normal statement and for the prepared statement - - class OCommonStatement :public cppu::BaseMutex - ,public OCommonStatement_IBase - ,public ::comphelper::OPropertyContainer - ,public ::comphelper::OPropertyArrayUsageHelper< OCommonStatement > + if (mpQuery) + e_book_query_unref(mpQuery); + mpQuery = rhs.mpQuery; + rhs.mpQuery = nullptr; + return *this; + } + ~EBookQueryWrapper() { - private: - css::uno::WeakReference< css::sdbc::XResultSet> m_xResultSet; // The last ResultSet created - rtl::Reference<OEvoabConnection> m_xConnection; - connectivity::OSQLParser m_aParser; - connectivity::OSQLParseTreeIterator m_aSQLIterator; - connectivity::OSQLParseNode *m_pParseTree; - - // <properties> - OUString m_aCursorName; - sal_Int32 m_nMaxFieldSize; - sal_Int32 m_nMaxRows; - sal_Int32 m_nQueryTimeOut; - sal_Int32 m_nFetchSize; - sal_Int32 m_nResultSetType; - sal_Int32 m_nFetchDirection; - sal_Int32 m_nResultSetConcurrency; - bool m_bEscapeProcessing; - // </properties> - - protected: - - void disposeResultSet(); - - // OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; - // OPropertySetHelper - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; - - virtual ~OCommonStatement() override; - - protected: - void parseSql( const OUString& sql, QueryData& _out_rQueryData ); - EBookQuery *whereAnalysis( const OSQLParseNode* parseTree ); - void orderByAnalysis( const OSQLParseNode* _pOrderByClause, SortDescriptor& _out_rSort ); - OUString getTableName() const; - - public: - - // other methods - OEvoabConnection* getOwnConnection() const { return m_xConnection.get(); } - - using OCommonStatement_IBase::operator css::uno::Reference< css::uno::XInterface >; - - protected: - explicit OCommonStatement( OEvoabConnection* _pConnection ); - - // OComponentHelper - virtual void SAL_CALL disposing() override; - // XInterface - virtual void SAL_CALL release() noexcept override; - virtual void SAL_CALL acquire() noexcept override; - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - - // XPropertySet - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; - - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - - // XCloseable - virtual void SAL_CALL close( ) override; - - protected: - /** will return the EBookQuery representing the statement WHERE condition, or throw - - Also, all statement dependent members (such as the parser/iterator) will be inited afterwards. - */ - QueryData - impl_getEBookQuery_throw( const OUString& _rSql ); - - css::uno::Reference< css::sdbc::XResultSet > - impl_executeQuery_throw( const OUString& _rSql ); - - css::uno::Reference< css::sdbc::XResultSet > - impl_executeQuery_throw( const QueryData& _rData ); - - css::uno::Reference< css::sdbc::XConnection > - impl_getConnection() { return css::uno::Reference< css::sdbc::XConnection >( m_xConnection ); } - - OUString - impl_getColumnRefColumnName_throw( const ::connectivity::OSQLParseNode& _rColumnRef ); - }; - - typedef ::cppu::ImplHelper2 < css::lang::XServiceInfo - , css::sdbc::XStatement - > OStatement_IBase; - class OStatement :public OCommonStatement - ,public OStatement_IBase + if (mpQuery) + e_book_query_unref(mpQuery); + } + EBookQuery* getQuery() const { - protected: - virtual ~OStatement() override {} - - public: - explicit OStatement( OEvoabConnection* _pConnection) - :OCommonStatement( _pConnection) - { - } - - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - - // XTypeProvider - DECLARE_XTYPEPROVIDER() - - // XServiceInfo - DECLARE_SERVICE_INFO(); - - // XStatement - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( const OUString& sql ) override ; - virtual sal_Int32 SAL_CALL executeUpdate( const OUString& sql ) override ; - virtual sal_Bool SAL_CALL execute( const OUString& sql ) override ; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override ; - }; + return mpQuery; + } + }; + + struct QueryData + { + private: + EBookQueryWrapper aQuery; + + public: + OUString sTable; + QueryFilterType eFilterType; + rtl::Reference<connectivity::OSQLColumns> xSelectColumns; + SortDescriptor aSortOrder; + + QueryData() + : sTable() + , eFilterType( eFilterOther ) + , xSelectColumns() + , aSortOrder() + { + } + + EBookQuery* getQuery() const { return aQuery.getQuery(); } + void setQuery(EBookQuery* pQuery) { aQuery.reset(pQuery); } + }; + + //************ Class: OCommonStatement + // is a base class for the normal statement and for the prepared statement + + class OCommonStatement :public cppu::BaseMutex + ,public OCommonStatement_IBase + ,public ::comphelper::OPropertyContainer + ,public ::comphelper::OPropertyArrayUsageHelper< OCommonStatement > + { + private: + unotools::WeakReference< OEvoabResultSet> m_xResultSet; // The last ResultSet created + rtl::Reference<OEvoabConnection> m_xConnection; + connectivity::OSQLParser m_aParser; + connectivity::OSQLParseTreeIterator m_aSQLIterator; + connectivity::OSQLParseNode *m_pParseTree; + + // <properties> + OUString m_aCursorName; + sal_Int32 m_nMaxFieldSize; + sal_Int32 m_nMaxRows; + sal_Int32 m_nQueryTimeOut; + sal_Int32 m_nFetchSize; + sal_Int32 m_nResultSetType; + sal_Int32 m_nFetchDirection; + sal_Int32 m_nResultSetConcurrency; + bool m_bEscapeProcessing; + // </properties> + + protected: + + void disposeResultSet(); + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + + virtual ~OCommonStatement() override; + + protected: + void parseSql( const OUString& sql, QueryData& _out_rQueryData ); + EBookQuery *whereAnalysis( const OSQLParseNode* parseTree ); + void orderByAnalysis( const OSQLParseNode* _pOrderByClause, SortDescriptor& _out_rSort ); + OUString getTableName() const; + + public: + + // other methods + OEvoabConnection* getOwnConnection() const { return m_xConnection.get(); } + + using OCommonStatement_IBase::operator css::uno::Reference< css::uno::XInterface >; + + protected: + explicit OCommonStatement( OEvoabConnection* _pConnection ); + + // OComponentHelper + virtual void SAL_CALL disposing() override; + // XInterface + virtual void SAL_CALL release() noexcept override; + virtual void SAL_CALL acquire() noexcept override; + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + + // XCloseable + virtual void SAL_CALL close( ) override; + + protected: + /** will return the EBookQuery representing the statement WHERE condition, or throw + + Also, all statement dependent members (such as the parser/iterator) will be inited afterwards. + */ + QueryData + impl_getEBookQuery_throw( const OUString& _rSql ); + + css::uno::Reference< css::sdbc::XResultSet > + impl_executeQuery_throw( const OUString& _rSql ); + + css::uno::Reference< css::sdbc::XResultSet > + impl_executeQuery_throw( const QueryData& _rData ); + + css::uno::Reference< css::sdbc::XConnection > + impl_getConnection() { return css::uno::Reference< css::sdbc::XConnection >( m_xConnection ); } + + OUString + impl_getColumnRefColumnName_throw( const ::connectivity::OSQLParseNode& _rColumnRef ); + }; + + typedef ::cppu::ImplHelper2 < css::lang::XServiceInfo + , css::sdbc::XStatement + > OStatement_IBase; + class OStatement :public OCommonStatement + ,public OStatement_IBase + { + protected: + virtual ~OStatement() override {} + + public: + explicit OStatement( OEvoabConnection* _pConnection) + :OCommonStatement( _pConnection) + { + } + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XTypeProvider + DECLARE_XTYPEPROVIDER() + + // XServiceInfo + DECLARE_SERVICE_INFO(); + + // XStatement + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( const OUString& sql ) override ; + virtual sal_Int32 SAL_CALL executeUpdate( const OUString& sql ) override ; + virtual sal_Bool SAL_CALL execute( const OUString& sql ) override ; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override ; + }; } diff --git a/connectivity/source/drivers/evoab2/NTable.cxx b/connectivity/source/drivers/evoab2/NTable.cxx index 208c52747768..94a20480f8d2 100644 --- a/connectivity/source/drivers/evoab2/NTable.cxx +++ b/connectivity/source/drivers/evoab2/NTable.cxx @@ -24,13 +24,8 @@ #include <com/sun/star/sdbc/XRow.hpp> using namespace connectivity; -using namespace ::comphelper; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace connectivity::evoab; OEvoabTable::OEvoabTable( sdbcx::OCollection* _pTables, @@ -58,7 +53,7 @@ void OEvoabTable::refreshColumns() if (!isNew()) { Reference< XResultSet > xResult = m_pConnection->getMetaData()->getColumns( - Any(), m_SchemaName, m_Name, "%"); + Any(), m_SchemaName, m_Name, u"%"_ustr); if (xResult.is()) { diff --git a/connectivity/source/drivers/evoab2/NTable.hxx b/connectivity/source/drivers/evoab2/NTable.hxx index 0aa30815b9b5..d28f55404799 100644 --- a/connectivity/source/drivers/evoab2/NTable.hxx +++ b/connectivity/source/drivers/evoab2/NTable.hxx @@ -24,29 +24,29 @@ namespace connectivity::evoab { - typedef connectivity::sdbcx::OTable OEvoabTable_TYPEDEF; + typedef connectivity::sdbcx::OTable OEvoabTable_TYPEDEF; - class OEvoabTable : public OEvoabTable_TYPEDEF - { - OEvoabConnection* m_pConnection; + class OEvoabTable : public OEvoabTable_TYPEDEF + { + OEvoabConnection* m_pConnection; - public: - OEvoabTable( sdbcx::OCollection* _pTables, - OEvoabConnection* _pConnection, - const OUString& Name, - const OUString& Type, - const OUString& Description, - const OUString& SchemaName, - const OUString& CatalogName - ); + public: + OEvoabTable( sdbcx::OCollection* _pTables, + OEvoabConnection* _pConnection, + const OUString& Name, + const OUString& Type, + const OUString& Description, + const OUString& SchemaName, + const OUString& CatalogName + ); - OEvoabConnection* getConnection() { return m_pConnection;} + OEvoabConnection* getConnection() { return m_pConnection;} - virtual void refreshColumns() override; + virtual void refreshColumns() override; - OUString const & getTableName() const { return m_Name; } - OUString const & getSchema() const { return m_SchemaName; } - }; + OUString const & getTableName() const { return m_Name; } + OUString const & getSchema() const { return m_SchemaName; } + }; } diff --git a/connectivity/source/drivers/evoab2/NTables.cxx b/connectivity/source/drivers/evoab2/NTables.cxx index 69b54ba70759..f124f6dbf92a 100644 --- a/connectivity/source/drivers/evoab2/NTables.cxx +++ b/connectivity/source/drivers/evoab2/NTables.cxx @@ -29,34 +29,29 @@ using namespace ::cppu; using namespace connectivity::evoab; using namespace connectivity::sdbcx; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; -using namespace dbtools; -ObjectType OEvoabTables::createObject(const OUString& aName) +css::uno::Reference< css::beans::XPropertySet > OEvoabTables::createObject(const OUString& aName) { - Sequence< OUString > aTypes { "TABLE" }; + Sequence< OUString > aTypes { u"TABLE"_ustr }; - Reference< XResultSet > xResult = m_xMetaData->getTables(Any(),"%",aName,aTypes); + Reference< XResultSet > xResult = m_xMetaData->getTables(Any(),u"%"_ustr,aName,aTypes); - ObjectType xRet; - if(xResult.is()) + rtl::Reference< OEvoabTable > xRet; + if(!xResult.is()) + return nullptr; + + Reference< XRow > xRow(xResult,UNO_QUERY); + if(xResult->next()) // there can be only one table with this name { - Reference< XRow > xRow(xResult,UNO_QUERY); - if(xResult->next()) // there can be only one table with this name - { - xRet = new OEvoabTable( - this, - static_cast<OEvoabCatalog&>(m_rParent).getConnection(), - aName, - xRow->getString(4), - xRow->getString(5), - "", - ""); - } + xRet = new OEvoabTable( + this, + static_cast<OEvoabCatalog&>(m_rParent).getConnection(), + aName, + xRow->getString(4), + xRow->getString(5), + u""_ustr, + u""_ustr); } ::comphelper::disposeComponent(xResult); diff --git a/connectivity/source/drivers/evoab2/NTables.hxx b/connectivity/source/drivers/evoab2/NTables.hxx index 7e200ff6aee2..3e81e4d0497a 100644 --- a/connectivity/source/drivers/evoab2/NTables.hxx +++ b/connectivity/source/drivers/evoab2/NTables.hxx @@ -20,24 +20,25 @@ #include <connectivity/sdbcx/VCollection.hxx> #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include <utility> namespace connectivity::evoab { - class OEvoabTables : public sdbcx::OCollection - { - css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData; - protected: - virtual sdbcx::ObjectType createObject(const OUString& _rName) override; - virtual void impl_refresh() override; - public: - OEvoabTables(const css::uno::Reference< css::sdbc::XDatabaseMetaData >& _rMetaData, - ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, - const ::std::vector< OUString> &_rVector) : - sdbcx::OCollection(_rParent,true,_rMutex,_rVector), - m_xMetaData(_rMetaData) - {} - virtual void disposing() override; - }; + class OEvoabTables : public sdbcx::OCollection + { + css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData; + protected: + virtual css::uno::Reference< css::beans::XPropertySet > createObject(const OUString& _rName) override; + virtual void impl_refresh() override; + public: + OEvoabTables(css::uno::Reference< css::sdbc::XDatabaseMetaData > _xMetaData, + ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector) : + sdbcx::OCollection(_rParent,true,_rMutex,_rVector), + m_xMetaData(std::move(_xMetaData)) + {} + virtual void disposing() override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/file/FCatalog.cxx b/connectivity/source/drivers/file/FCatalog.cxx index eedda26efba2..2a33bded28fe 100644 --- a/connectivity/source/drivers/file/FCatalog.cxx +++ b/connectivity/source/drivers/file/FCatalog.cxx @@ -24,10 +24,8 @@ #include <com/sun/star/sdbc/XResultSet.hpp> using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; using namespace connectivity::file; @@ -56,7 +54,7 @@ void OFileCatalog::refreshTables() ::std::vector< OUString> aVector; Sequence< OUString > aTypes; Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), - "%", "%", aTypes); + u"%"_ustr, u"%"_ustr, aTypes); fillNames(xResult,aVector); if(m_pTables) diff --git a/connectivity/source/drivers/file/FColumns.cxx b/connectivity/source/drivers/file/FColumns.cxx index 1b90385bf9c0..dbe95ed16d55 100644 --- a/connectivity/source/drivers/file/FColumns.cxx +++ b/connectivity/source/drivers/file/FColumns.cxx @@ -25,14 +25,10 @@ using namespace connectivity::file; using namespace connectivity; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; -sdbcx::ObjectType OColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OColumns::createObject(const OUString& _rName) { const OUString sCatalogName; const OUString sSchemaName(m_pTable->getSchema()); @@ -40,31 +36,31 @@ sdbcx::ObjectType OColumns::createObject(const OUString& _rName) Reference< XResultSet > xResult = m_pTable->getConnection()->getMetaData()->getColumns(Any(), sSchemaName, sTableName, _rName); - sdbcx::ObjectType xRet; - if(xResult.is()) + if(!xResult.is()) + return nullptr; + + rtl::Reference< sdbcx::OColumn > xRet; + Reference< XRow > xRow(xResult,UNO_QUERY); + while(xResult->next()) { - Reference< XRow > xRow(xResult,UNO_QUERY); - while(xResult->next()) + if(xRow->getString(4) == _rName) { - if(xRow->getString(4) == _rName) - { - xRet = new sdbcx::OColumn(_rName, - xRow->getString(6), - xRow->getString(13), - xRow->getString(12), - xRow->getInt(11), - xRow->getInt(7), - xRow->getInt(9), - xRow->getInt(5), - false, - false, - false, - m_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(), - sCatalogName, - sSchemaName, - sTableName); - break; - } + xRet = new sdbcx::OColumn(_rName, + xRow->getString(6), + xRow->getString(13), + xRow->getString(12), + xRow->getInt(11), + xRow->getInt(7), + xRow->getInt(9), + xRow->getInt(5), + false, + false, + false, + m_pTable->getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(), + sCatalogName, + sSchemaName, + sTableName); + break; } } diff --git a/connectivity/source/drivers/file/FConnection.cxx b/connectivity/source/drivers/file/FConnection.cxx index 283bee8fee45..fe43ed6477ed 100644 --- a/connectivity/source/drivers/file/FConnection.cxx +++ b/connectivity/source/drivers/file/FConnection.cxx @@ -32,7 +32,7 @@ #include <com/sun/star/ucb/XContentIdentifier.hpp> #include <tools/urlobj.hxx> #include <file/FCatalog.hxx> -#include <unotools/configmgr.hxx> +#include <comphelper/configuration.hxx> #include <unotools/pathoptions.hxx> #include <ucbhelper/content.hxx> #include <connectivity/dbcharset.hxx> @@ -132,7 +132,7 @@ void OConnection::construct(const OUString& url,const Sequence< PropertyValue >& OUString aFileName = aDSN; INetURLObject aURL; aURL.SetSmartProtocol(INetProtocol::File); - if (!utl::ConfigManager::IsFuzzing()) + if (!comphelper::IsFuzzing()) { SvtPathOptions aPathOptions; aFileName = aPathOptions.SubstituteVariable(aFileName); @@ -166,7 +166,7 @@ void OConnection::construct(const OUString& url,const Sequence< PropertyValue >& } // set fields to fetch - Sequence< OUString > aProps { "Title" }; + Sequence< OUString > aProps { u"Title"_ustr }; try { @@ -179,7 +179,7 @@ void OConnection::construct(const OUString& url,const Sequence< PropertyValue >& { Reference<XContent> xParent(Reference<XChild>(aFile.get(),UNO_QUERY_THROW)->getParent(),UNO_QUERY_THROW); Reference<XContentIdentifier> xIdent = xParent->getIdentifier(); - m_xContent = xParent; + m_xContent = std::move(xParent); ::ucbhelper::Content aParent(xIdent->getContentIdentifier(), Reference< XCommandEnvironment >(), comphelper::getProcessComponentContext()); m_xDir = aParent.createDynamicCursor(aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ); @@ -210,7 +210,7 @@ void OConnection::construct(const OUString& url,const Sequence< PropertyValue >& } // XServiceInfo -IMPLEMENT_SERVICE_INFO(OConnection, "com.sun.star.sdbc.drivers.file.Connection", "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(OConnection, u"com.sun.star.sdbc.drivers.file.Connection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) Reference< XStatement > SAL_CALL OConnection::createStatement( ) @@ -238,8 +238,7 @@ Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( const OU Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall( const OUString& /*sql*/ ) { - throwFeatureNotImplementedSQLException( "XConnection::prepareCall", *this ); - return nullptr; + throwFeatureNotImplementedSQLException( u"XConnection::prepareCall"_ustr, *this ); } OUString SAL_CALL OConnection::nativeSQL( const OUString& sql ) @@ -314,7 +313,7 @@ sal_Bool SAL_CALL OConnection::isReadOnly( ) void SAL_CALL OConnection::setCatalog( const OUString& /*catalog*/ ) { - throwFeatureNotImplementedSQLException( "XConnection::setCatalog", *this ); + throwFeatureNotImplementedSQLException( u"XConnection::setCatalog"_ustr, *this ); } OUString SAL_CALL OConnection::getCatalog( ) @@ -324,7 +323,7 @@ OUString SAL_CALL OConnection::getCatalog( ) void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 /*level*/ ) { - throwFeatureNotImplementedSQLException( "XConnection::setTransactionIsolation", *this ); + throwFeatureNotImplementedSQLException( u"XConnection::setTransactionIsolation"_ustr, *this ); } sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) @@ -369,17 +368,17 @@ void OConnection::disposing() m_xDir.clear(); m_xContent.clear(); - m_xCatalog = WeakReference< XTablesSupplier>(); + m_xCatalog.clear(); } Reference< XTablesSupplier > OConnection::createCatalog() { ::osl::MutexGuard aGuard( m_aMutex ); - Reference< XTablesSupplier > xTab = m_xCatalog; + rtl::Reference< connectivity::sdbcx::OCatalog > xTab = m_xCatalog.get(); if(!xTab.is()) { xTab = new OFileCatalog(this); - m_xCatalog = xTab; + m_xCatalog = xTab.get(); } return xTab; } @@ -387,7 +386,7 @@ Reference< XTablesSupplier > OConnection::createCatalog() Reference< XDynamicResultSet > OConnection::getDir() const { Reference<XDynamicResultSet> xContent; - Sequence< OUString > aProps { "Title" }; + Sequence< OUString > aProps { u"Title"_ustr }; try { Reference<XContentIdentifier> xIdent = getContent()->getIdentifier(); @@ -405,7 +404,7 @@ sal_Int64 SAL_CALL OConnection::getSomething( const Sequence< sal_Int8 >& rId ) return comphelper::getSomethingImpl(rId, this); } -Sequence< sal_Int8 > OConnection::getUnoTunnelId() +const Sequence< sal_Int8 > & OConnection::getUnoTunnelId() { static const comphelper::UnoIdInit implId; return implId.getSeq(); @@ -413,17 +412,13 @@ Sequence< sal_Int8 > OConnection::getUnoTunnelId() void OConnection::throwUrlNotValid(const OUString & _rsUrl,const OUString & _rsMessage) { - SQLException aError; - aError.Message = getResources().getResourceStringWithSubstitution( - STR_NO_VALID_FILE_URL, - "$URL$", _rsUrl - ); - - aError.SQLState = "S1000"; - aError.ErrorCode = 0; - aError.Context = static_cast< XConnection* >(this); + XConnection* context = this; + css::uno::Any next; if (!_rsMessage.isEmpty()) - aError.NextException <<= SQLException(_rsMessage, aError.Context, OUString(), 0, Any()); + next <<= SQLException(_rsMessage, context, OUString(), 0, Any()); + SQLException aError( + getResources().getResourceStringWithSubstitution(STR_NO_VALID_FILE_URL, "$URL$", _rsUrl), + context, u"S1000"_ustr, 0, next); throw aError; } diff --git a/connectivity/source/drivers/file/FDatabaseMetaData.cxx b/connectivity/source/drivers/file/FDatabaseMetaData.cxx index f6480744e665..efc8f8149f08 100644 --- a/connectivity/source/drivers/file/FDatabaseMetaData.cxx +++ b/connectivity/source/drivers/file/FDatabaseMetaData.cxx @@ -30,14 +30,13 @@ #include <file/FTable.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/servicehelper.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <ucbhelper/content.hxx> using namespace com::sun::star::ucb; using namespace connectivity::file; using namespace connectivity; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::sdbcx; @@ -73,6 +72,7 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns( namespace { +#if !ENABLE_FUZZERS sal_Int16 isCaseSensitiveParentFolder( const OUString& _rFolderOrDoc, std::u16string_view _rDocName ) { sal_Int16 nIsCS = 1; @@ -84,7 +84,7 @@ namespace { ::ucbhelper::Content aFolderOrDoc( _rFolderOrDoc, Reference< XCommandEnvironment >(), comphelper::getProcessComponentContext() ); if ( aFolderOrDoc.isDocument() ) - aContent1 = aFolderOrDoc; + aContent1 = std::move(aFolderOrDoc); else { aContentURL = INetURLObject( _rFolderOrDoc, INetURLObject::EncodeMechanism::WasEncoded ); @@ -151,6 +151,7 @@ namespace return nIsCS; } +#endif } @@ -165,7 +166,7 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables( // check if any type is given // when no types are given then we have to return all tables e.g. TABLE - static constexpr OUStringLiteral aTable = u"TABLE"; + static constexpr OUString aTable = u"TABLE"_ustr; bool bTableFound = true; sal_Int32 nLength = types.getLength(); @@ -297,7 +298,7 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables( } if(bNewRow) { - aRow.push_back(new ORowSetValueDecorator(OUString(aTable))); + aRow.push_back(new ORowSetValueDecorator(aTable)); aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); aRows.push_back(aRow); @@ -392,14 +393,14 @@ Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges( aRow[2] = new ORowSetValueDecorator(*pBegin); aRow[6] = ODatabaseMetaDataResultSet::getSelectValue(); - aRow[7] = new ORowSetValueDecorator(OUString("NO")); + aRow[7] = new ORowSetValueDecorator(u"NO"_ustr); aRows.push_back(aRow); Reference< XPropertySet> xTable( xNames->getByName(*pBegin), css::uno::UNO_QUERY); if(xTable.is()) { - auto pTable = comphelper::getFromUnoTunnel<OFileTable>(xTable); + auto pTable = dynamic_cast<OFileTable*>(xTable.get()); if(pTable && !pTable->isReadOnly()) { aRow[6] = ODatabaseMetaDataResultSet::getInsertValue(); @@ -491,7 +492,7 @@ OUString SAL_CALL ODatabaseMetaData::getCatalogTerm( ) OUString ODatabaseMetaData::impl_getIdentifierQuoteString_throw( ) { - return "\""; + return u"\""_ustr; } OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters( ) @@ -616,14 +617,9 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsOuterJoins( ) Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTableTypes( ) { - ::osl::MutexGuard aGuard( m_aMutex ); - rtl::Reference<ODatabaseMetaDataResultSet> pResult = new ODatabaseMetaDataResultSet( ODatabaseMetaDataResultSet::eTableTypes ); - static ODatabaseMetaDataResultSet::ORows aRows; - if(aRows.empty()) - { - aRows.push_back( { ODatabaseMetaDataResultSet::getEmptyValue(), new ORowSetValueDecorator(OUString("TABLE")) } ); - } + ODatabaseMetaDataResultSet::ORows aRows; + aRows.push_back( { ODatabaseMetaDataResultSet::getEmptyValue(), new ORowSetValueDecorator(u"TABLE"_ustr) } ); pResult->setRows(std::move(aRows)); return pResult; } @@ -840,7 +836,7 @@ sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92IntermediateSQL( ) OUString SAL_CALL ODatabaseMetaData::getURL( ) { - return "sdbc:file:"; + return u"sdbc:file:"_ustr; } OUString SAL_CALL ODatabaseMetaData::getUserName( ) @@ -905,12 +901,12 @@ OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape( ) OUString SAL_CALL ODatabaseMetaData::getStringFunctions( ) { - return "UCASE,LCASE,ASCII,LENGTH,OCTET_LENGTH,CHAR_LENGTH,CHARACTER_LENGTH,CHAR,CONCAT,LOCATE,SUBSTRING,LTRIM,RTRIM,SPACE,REPLACE,REPEAT,INSERT,LEFT,RIGHT"; + return u"UCASE,LCASE,ASCII,LENGTH,OCTET_LENGTH,CHAR_LENGTH,CHARACTER_LENGTH,CHAR,CONCAT,LOCATE,SUBSTRING,LTRIM,RTRIM,SPACE,REPLACE,REPEAT,INSERT,LEFT,RIGHT"_ustr; } OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions( ) { - return "DAYOFWEEK,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,CURDATE,CURTIME,NOW"; + return u"DAYOFWEEK,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,CURDATE,CURTIME,NOW"_ustr; } OUString SAL_CALL ODatabaseMetaData::getSystemFunctions( ) @@ -920,7 +916,7 @@ OUString SAL_CALL ODatabaseMetaData::getSystemFunctions( ) OUString SAL_CALL ODatabaseMetaData::getNumericFunctions( ) { - return "ABS,SIGN,MOD,FLOOR,CEILING,ROUND,EXP,LN,LOG,LOG10,POWER,SQRT,PI,COS,SIN,TAN,ACOS,ASIN,ATAN,ATAN2,DEGREES,RADIANS"; + return u"ABS,SIGN,MOD,FLOOR,CEILING,ROUND,EXP,LN,LOG,LOG10,POWER,SQRT,PI,COS,SIN,TAN,ACOS,ASIN,ATAN,ATAN2,DEGREES,RADIANS"_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar( ) diff --git a/connectivity/source/drivers/file/FDriver.cxx b/connectivity/source/drivers/file/FDriver.cxx index 4b6d45fe7420..e5788a257ddb 100644 --- a/connectivity/source/drivers/file/FDriver.cxx +++ b/connectivity/source/drivers/file/FDriver.cxx @@ -26,6 +26,7 @@ #include <connectivity/dbexception.hxx> #include <strings.hrc> #include <resource/sharedresources.hxx> +#include <utility> using namespace connectivity::file; @@ -36,9 +37,9 @@ using namespace com::sun::star::sdbc; using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; -OFileDriver::OFileDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext) +OFileDriver::OFileDriver(css::uno::Reference< css::uno::XComponentContext > _xContext) : ODriver_BASE(m_aMutex) - ,m_xContext(_rxContext) + ,m_xContext(std::move(_xContext)) { } @@ -49,7 +50,7 @@ void OFileDriver::disposing() for (auto const& connection : m_xConnections) { - Reference< XComponent > xComp(connection.get(), UNO_QUERY); + rtl::Reference< OConnection > xComp(connection); if (xComp.is()) xComp->dispose(); } @@ -62,7 +63,7 @@ void OFileDriver::disposing() OUString SAL_CALL OFileDriver::getImplementationName( ) { - return "com.sun.star.sdbc.driver.file.Driver"; + return u"com.sun.star.sdbc.driver.file.Driver"_ustr; } sal_Bool SAL_CALL OFileDriver::supportsService( const OUString& _rServiceName ) @@ -73,7 +74,7 @@ sal_Bool SAL_CALL OFileDriver::supportsService( const OUString& _rServiceName ) Sequence< OUString > SAL_CALL OFileDriver::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.Driver", "com.sun.star.sdbcx.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr, u"com.sun.star.sdbcx.Driver"_ustr }; } @@ -84,7 +85,7 @@ Reference< XConnection > SAL_CALL OFileDriver::connect( const OUString& url, con rtl::Reference<OConnection> pCon = new OConnection(this); pCon->construct(url,info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon); return pCon; } @@ -99,48 +100,48 @@ Sequence< DriverPropertyInfo > SAL_CALL OFileDriver::getPropertyInfo( const OUSt if ( acceptsURL(url) ) { - Sequence< OUString > aBoolean { "0", "1" }; + Sequence< OUString > aBoolean { u"0"_ustr, u"1"_ustr }; return { { - "CharSet" - ,"CharSet of the database." + u"CharSet"_ustr + ,u"CharSet of the database."_ustr ,false ,{} ,{} }, { - "Extension" - ,"Extension of the file format." + u"Extension"_ustr + ,u"Extension of the file format."_ustr ,false - ,".*" + ,u".*"_ustr ,{} }, { - "ShowDeleted" - ,"Display inactive records." + u"ShowDeleted"_ustr + ,u"Display inactive records."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "EnableSQL92Check" - ,"Use SQL92 naming constraints." + u"EnableSQL92Check"_ustr + ,u"Use SQL92 naming constraints."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "UseRelativePath" - ,"Handle the connection url as relative path." + u"UseRelativePath"_ustr + ,u"Handle the connection url as relative path."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "URL" - ,"The URL of the database document which is used to create an absolute path." + u"URL"_ustr + ,u"The URL of the database document which is used to create an absolute path."_ustr ,false ,{} ,{} @@ -152,7 +153,6 @@ Sequence< DriverPropertyInfo > SAL_CALL OFileDriver::getPropertyInfo( const OUSt const OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); ::dbtools::throwGenericSQLException(sMessage ,*this); } // if ( ! acceptsURL(url) ) - return Sequence< DriverPropertyInfo >(); } sal_Int32 SAL_CALL OFileDriver::getMajorVersion( ) @@ -176,7 +176,7 @@ Reference< XTablesSupplier > SAL_CALL OFileDriver::getDataDefinitionByConnection { for (auto const& elem : m_xConnections) { - if (static_cast<OConnection*>( Reference< XConnection >::query(elem.get()).get() ) == pSearchConnection) + if (elem.get().get() == pSearchConnection) return pSearchConnection->createCatalog(); } } diff --git a/connectivity/source/drivers/file/FNoException.cxx b/connectivity/source/drivers/file/FNoException.cxx index 920bb38859f1..c2cd9d9579d6 100644 --- a/connectivity/source/drivers/file/FNoException.cxx +++ b/connectivity/source/drivers/file/FNoException.cxx @@ -65,7 +65,7 @@ void OSQLAnalyzer::bindParameterRow(OValueRefRow const & _pRow) void OPreparedStatement::scanParameter(OSQLParseNode* pParseNode,std::vector< OSQLParseNode*>& _rParaNodes) { - DBG_ASSERT(pParseNode != nullptr,"OResultSet: internal error: invalid ParseNode"); + assert(pParseNode && "OResultSet: internal error: invalid ParseNode"); // found parameter Name-Rule? if (SQL_ISRULE(pParseNode,parameter)) diff --git a/connectivity/source/drivers/file/FNumericFunctions.cxx b/connectivity/source/drivers/file/FNumericFunctions.cxx index 7de058dee06c..7c7fdc75425f 100644 --- a/connectivity/source/drivers/file/FNumericFunctions.cxx +++ b/connectivity/source/drivers/file/FNumericFunctions.cxx @@ -19,14 +19,13 @@ #include <cmath> +#include <basegfx/numeric/ftools.hxx> #include <file/FNumericFunctions.hxx> #include <rtl/math.hxx> using namespace connectivity; using namespace connectivity::file; -const double fPi = 3.14159265358979323846; - ORowSetValue OOp_Abs::operate(const ORowSetValue& lhs) const { if ( lhs.isNull() ) @@ -162,7 +161,7 @@ ORowSetValue OOp_Sqrt::operate(const ORowSetValue& lhs) const ORowSetValue OOp_Pi::operate(const std::vector<ORowSetValue>& /*lhs*/) const { - return fPi; + return M_PI; } ORowSetValue OOp_Cos::operate(const ORowSetValue& lhs) const @@ -227,7 +226,7 @@ ORowSetValue OOp_Degrees::operate(const ORowSetValue& lhs) const return lhs; double nLhs = lhs.getDouble(); - return nLhs*180*(1.0/fPi); + return basegfx::rad2deg(nLhs); } ORowSetValue OOp_Radians::operate(const ORowSetValue& lhs) const @@ -236,7 +235,7 @@ ORowSetValue OOp_Radians::operate(const ORowSetValue& lhs) const return lhs; double nLhs = lhs.getDouble(); - return nLhs*fPi*(1.0/180.0); + return basegfx::deg2rad(nLhs); } diff --git a/connectivity/source/drivers/file/FPreparedStatement.cxx b/connectivity/source/drivers/file/FPreparedStatement.cxx index 79c69b3ee62e..5a3f09adb920 100644 --- a/connectivity/source/drivers/file/FPreparedStatement.cxx +++ b/connectivity/source/drivers/file/FPreparedStatement.cxx @@ -18,6 +18,7 @@ */ +#include <o3tl/safeint.hxx> #include <osl/diagnose.h> #include <file/FPreparedStatement.hxx> #include <com/sun/star/sdbc/DataType.hpp> @@ -45,7 +46,7 @@ using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; using namespace com::sun::star; -IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbc.driver.file.PreparedStatement","com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(OPreparedStatement,u"com.sun.star.sdbc.driver.file.PreparedStatement"_ustr,u"com.sun.star.sdbc.PreparedStatement"_ustr); OPreparedStatement::OPreparedStatement( OConnection* _pConnection) : OStatement_BASE2( _pConnection ) @@ -100,7 +101,7 @@ rtl::Reference<OResultSet> OPreparedStatement::makeResultSet() closeResultSet(); rtl::Reference<OResultSet> xResultSet(createResultSet()); - m_xResultSet = xResultSet; + m_xResultSet = xResultSet.get(); initializeResultSet(xResultSet.get()); initResultSet(xResultSet.get()); return xResultSet; @@ -127,6 +128,11 @@ css::uno::Sequence< css::uno::Type > SAL_CALL OPreparedStatement::getTypes( ) Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData( ) { + return getMetaDataImpl(); +} + +const rtl::Reference< OResultSetMetaData > & OPreparedStatement::getMetaDataImpl( ) +{ ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); @@ -250,7 +256,7 @@ void SAL_CALL OPreparedStatement::setInt( sal_Int32 parameterIndex, sal_Int32 x void SAL_CALL OPreparedStatement::setLong( sal_Int32 /*parameterIndex*/, sal_Int64 /*aVal*/ ) { - throwFeatureNotImplementedSQLException( "XParameters::setLong", *this ); + throwFeatureNotImplementedSQLException( u"XParameters::setLong"_ustr, *this ); } @@ -268,25 +274,25 @@ void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 / void SAL_CALL OPreparedStatement::setClob( sal_Int32 /*parameterIndex*/, const Reference< XClob >& /*x*/ ) { - throwFeatureNotImplementedSQLException( "XParameters::setClob", *this ); + throwFeatureNotImplementedSQLException( u"XParameters::setClob"_ustr, *this ); } void SAL_CALL OPreparedStatement::setBlob( sal_Int32 /*parameterIndex*/, const Reference< XBlob >& /*x*/ ) { - throwFeatureNotImplementedSQLException( "XParameters::setBlob", *this ); + throwFeatureNotImplementedSQLException( u"XParameters::setBlob"_ustr, *this ); } void SAL_CALL OPreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const Reference< XArray >& /*x*/ ) { - throwFeatureNotImplementedSQLException( "XParameters::setArray", *this ); + throwFeatureNotImplementedSQLException( u"XParameters::setArray"_ustr, *this ); } void SAL_CALL OPreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const Reference< XRef >& /*x*/ ) { - throwFeatureNotImplementedSQLException( "XParameters::setRef", *this ); + throwFeatureNotImplementedSQLException( u"XParameters::setRef"_ustr, *this ); } @@ -376,7 +382,7 @@ void OPreparedStatement::initResultSet(OResultSet *pResultSet) m_pConnection->throwGenericSQLException(STR_INVALID_PARA_COUNT,*this); pResultSet->OpenImpl(); - pResultSet->setMetaData(getMetaData()); + pResultSet->setMetaData(getMetaDataImpl()); } void SAL_CALL OPreparedStatement::acquire() noexcept @@ -392,7 +398,7 @@ void SAL_CALL OPreparedStatement::release() noexcept void OPreparedStatement::checkAndResizeParameters(sal_Int32 parameterIndex) { ::connectivity::checkDisposed(OStatement_BASE::rBHelper.bDisposed); - if ( m_aAssignValues.is() && (parameterIndex < 1 || parameterIndex >= static_cast<sal_Int32>(m_aParameterIndexes.size())) ) + if ( m_aAssignValues.is() && (parameterIndex < 1 || o3tl::make_unsigned(parameterIndex) >= m_aParameterIndexes.size()) ) throwInvalidIndexException(*this); else if ( static_cast<sal_Int32>(m_aParameterRow->size()) <= parameterIndex ) { diff --git a/connectivity/source/drivers/file/FResultSet.cxx b/connectivity/source/drivers/file/FResultSet.cxx index fdf3a4e47d84..56ca7ed0063a 100644 --- a/connectivity/source/drivers/file/FResultSet.cxx +++ b/connectivity/source/drivers/file/FResultSet.cxx @@ -29,6 +29,7 @@ #include <cppuhelper/typeprovider.hxx> #include <connectivity/dbtools.hxx> #include <cppuhelper/propshlp.hxx> +#include <o3tl/safeint.hxx> #include <sal/log.hxx> #include <iterator> #include <com/sun/star/sdbc/ResultSetType.hpp> @@ -41,7 +42,7 @@ #include <comphelper/types.hxx> #include <resource/sharedresources.hxx> #include <strings.hrc> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> using namespace ::comphelper; using namespace connectivity; @@ -65,7 +66,7 @@ namespace } } -IMPLEMENT_SERVICE_INFO(OResultSet,"com.sun.star.sdbcx.drivers.file.ResultSet","com.sun.star.sdbc.ResultSet"); +IMPLEMENT_SERVICE_INFO(OResultSet,u"com.sun.star.sdbcx.drivers.file.ResultSet"_ustr,u"com.sun.star.sdbc.ResultSet"_ustr); OResultSet::OResultSet(OStatement_Base* pStmt,OSQLParseTreeIterator& _aSQLIterator) : OResultSet_BASE(m_aMutex) ,::comphelper::OPropertyContainer(OResultSet_BASE::rBHelper) @@ -181,8 +182,6 @@ sal_Int32 SAL_CALL OResultSet::findColumn( const OUString& columnName ) } ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); - return 0; // Never reached } const ORowSetValue& OResultSet::getValue(sal_Int32 columnIndex) @@ -652,7 +651,7 @@ void SAL_CALL OResultSet::updateInt( sal_Int32 columnIndex, sal_Int32 x ) void SAL_CALL OResultSet::updateLong( sal_Int32 /*columnIndex*/, sal_Int64 /*x*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XRowUpdate::updateLong", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XRowUpdate::updateLong"_ustr, *this ); } void SAL_CALL OResultSet::updateFloat( sal_Int32 columnIndex, float x ) @@ -921,7 +920,7 @@ bool OResultSet::Move(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOff // The FileCursor is outside of the valid range, if: // a.) m_nRowPos < 1 // b.) a KeySet exists and m_nRowPos > m_pFileSet->size() - if (m_nRowPos < 0 || (m_pFileSet->isFrozen() && eCursorPosition != IResultSetHelper::BOOKMARK && m_nRowPos >= static_cast<sal_Int32>(m_pFileSet->size()) )) // && m_pFileSet->IsFrozen() + if (m_nRowPos < 0 || (m_pFileSet->isFrozen() && eCursorPosition != IResultSetHelper::BOOKMARK && o3tl::make_unsigned(m_nRowPos) >= m_pFileSet->size() )) // && m_pFileSet->IsFrozen() { goto Error; } @@ -994,8 +993,6 @@ bool OResultSet::Move(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOff --m_nRowPos; break; case IResultSetHelper::FIRST: - m_nRowPos = 0; - break; case IResultSetHelper::LAST: m_nRowPos = 0; break; @@ -1329,8 +1326,7 @@ void OResultSet::OpenImpl() #endif } - m_pFileSet->erase(std::remove(m_pFileSet->begin(),m_pFileSet->end(),0) - ,m_pFileSet->end()); + std::erase(*m_pFileSet, 0); } } } @@ -1380,19 +1376,6 @@ void OResultSet::OpenImpl() m_nFilePos = 0; } -Sequence< sal_Int8 > OResultSet::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OResultSet::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this); -} - void OResultSet::setBoundedColumns(const OValueRefRow& _rRow, const OValueRefRow& _rSelectRow, const ::rtl::Reference<connectivity::OSQLColumns>& _rxColumns, @@ -1527,8 +1510,7 @@ Reference< css::beans::XPropertySetInfo > SAL_CALL OResultSet::getPropertySetInf void OResultSet::doTableSpecials(const OSQLTable& _xTable) { - Reference<css::lang::XUnoTunnel> xTunnel(_xTable, UNO_QUERY_THROW); - m_pTable = comphelper::getFromUnoTunnel<OFileTable>(xTunnel); + m_pTable = dynamic_cast<OFileTable*>(_xTable.get()); assert(m_pTable.is()); } @@ -1581,8 +1563,7 @@ bool OResultSet::isRowDeleted() const void SAL_CALL OResultSet::disposing( const EventObject& Source ) { - Reference<XPropertySet> xProp = m_pTable; - if(m_pTable.is() && Source.Source == xProp) + if(m_pTable.is() && Source.Source == Reference<XPropertySet>(m_pTable)) { m_pTable.clear(); } diff --git a/connectivity/source/drivers/file/FResultSetMetaData.cxx b/connectivity/source/drivers/file/FResultSetMetaData.cxx index f68a06532bb7..44898d88242b 100644 --- a/connectivity/source/drivers/file/FResultSetMetaData.cxx +++ b/connectivity/source/drivers/file/FResultSetMetaData.cxx @@ -22,6 +22,8 @@ #include <comphelper/extract.hxx> #include <connectivity/dbexception.hxx> #include <comphelper/types.hxx> +#include <o3tl/safeint.hxx> +#include <utility> using namespace ::comphelper; @@ -33,12 +35,11 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; -OResultSetMetaData::OResultSetMetaData(const ::rtl::Reference<connectivity::OSQLColumns>& _rxColumns,const OUString& _aTableName,OFileTable* _pTable) - :m_aTableName(_aTableName) - ,m_xColumns(_rxColumns) +OResultSetMetaData::OResultSetMetaData(::rtl::Reference<connectivity::OSQLColumns> _xColumns, OUString _aTableName, OFileTable* _pTable) + :m_aTableName(std::move(_aTableName)) + ,m_xColumns(std::move(_xColumns)) ,m_pTable(_pTable) { } @@ -51,7 +52,7 @@ OResultSetMetaData::~OResultSetMetaData() void OResultSetMetaData::checkColumnIndex(sal_Int32 column) { - if(column <= 0 || column > static_cast<sal_Int32>(m_xColumns->size())) + if(column <= 0 || o3tl::make_unsigned(column) > m_xColumns->size()) throwInvalidIndexException(*this); } diff --git a/connectivity/source/drivers/file/FStatement.cxx b/connectivity/source/drivers/file/FStatement.cxx index e0ea8bc59aef..ee260fdb33e5 100644 --- a/connectivity/source/drivers/file/FStatement.cxx +++ b/connectivity/source/drivers/file/FStatement.cxx @@ -38,6 +38,7 @@ #include <connectivity/dbexception.hxx> #include <strings.hrc> #include <algorithm> +#include <cstddef> namespace connectivity::file { @@ -92,7 +93,7 @@ void OStatement_Base::disposeResultSet() { SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OStatement_Base::disposeResultSet" ); // free the cursor if alive - Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OResultSet > xComp(m_xResultSet.get()); assert(xComp.is() || !m_xResultSet.get().is()); if (xComp.is()) xComp->dispose(); @@ -174,7 +175,7 @@ void OStatement_Base::closeResultSet() ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - Reference< XCloseable > xCloseable(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OResultSet > xCloseable(m_xResultSet.get()); assert(xCloseable.is() || !m_xResultSet.get().is()); if (xCloseable.is()) { @@ -193,7 +194,7 @@ Any SAL_CALL OStatement_Base::getWarnings( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - return makeAny(m_aLastWarning); + return Any(m_aLastWarning); } void SAL_CALL OStatement_Base::clearWarnings( ) @@ -222,7 +223,7 @@ rtl::Reference<OResultSet> OStatement::createResultSet() return new OResultSet(this,m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbc.driver.file.Statement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(OStatement,u"com.sun.star.sdbc.driver.file.Statement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); void SAL_CALL OStatement::acquire() noexcept { @@ -251,15 +252,13 @@ Reference< XResultSet > SAL_CALL OStatement::executeQuery( const OUString& sql ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); construct(sql); - Reference< XResultSet > xRS; rtl::Reference<OResultSet> pResult = createResultSet(); - xRS = pResult; initializeResultSet(pResult.get()); - m_xResultSet = xRS; + m_xResultSet = pResult.get(); pResult->OpenImpl(); - return xRS; + return pResult; } Reference< XConnection > SAL_CALL OStatement::getConnection( ) @@ -407,7 +406,7 @@ void OStatement_Base::construct(const OUString& sql) } // at this moment we support only one table per select statement - m_pTable = comphelper::getFromUnoTunnel<OFileTable>(rTabs.begin()->second); + m_pTable = dynamic_cast<OFileTable*>(rTabs.begin()->second.get()); OSL_ENSURE(m_pTable.is(),"No table!"); if ( m_pTable.is() ) m_xColNames = m_pTable->getColumns(); @@ -440,7 +439,7 @@ void OStatement_Base::createColumnMapping() // initialize the column index map (mapping select columns to table columns) ::rtl::Reference<connectivity::OSQLColumns> xColumns = m_aSQLIterator.getSelectColumns(); m_aColMapping.resize(xColumns->size() + 1); - for (sal_Int32 i=0; i<static_cast<sal_Int32>(m_aColMapping.size()); ++i) + for (std::size_t i=0; i<m_aColMapping.size(); ++i) m_aColMapping[i] = i; Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY); @@ -498,7 +497,7 @@ void OStatement_Base::GetAssignValues() OSL_ENSURE(SQL_ISRULE(pOptColumnCommalist,opt_column_commalist),"OResultSet: Error in Parse Tree"); if (pOptColumnCommalist->count() == 0) { - const Sequence< OUString>& aNames = m_xColNames->getElementNames(); + const Sequence< OUString> aNames = m_xColNames->getElementNames(); aColumnNameList.insert(aColumnNameList.end(), aNames.begin(), aNames.end()); } else @@ -575,7 +574,7 @@ void OStatement_Base::GetAssignValues() OSL_ENSURE(m_pParseTree->count() >= 4,"OResultSet: Error in Parse Tree"); OSQLParseNode * pAssignmentCommalist = m_pParseTree->getChild(3); - OSL_ENSURE(pAssignmentCommalist != nullptr,"OResultSet: pAssignmentCommalist == NULL"); + assert(pAssignmentCommalist && "OResultSet: pAssignmentCommalist == NULL"); OSL_ENSURE(SQL_ISRULE(pAssignmentCommalist,assignment_commalist),"OResultSet: Error in Parse Tree"); OSL_ENSURE(pAssignmentCommalist->count() > 0,"OResultSet: pAssignmentCommalist->count() <= 0"); @@ -584,15 +583,15 @@ void OStatement_Base::GetAssignValues() for (size_t i = 0; i < pAssignmentCommalist->count(); i++) { OSQLParseNode * pAssignment = pAssignmentCommalist->getChild(i); - OSL_ENSURE(pAssignment != nullptr,"OResultSet: pAssignment == NULL"); + assert(pAssignment && "OResultSet: pAssignment == NULL"); OSL_ENSURE(SQL_ISRULE(pAssignment,assignment),"OResultSet: Error in Parse Tree"); OSL_ENSURE(pAssignment->count() == 3,"OResultSet: pAssignment->count() != 3"); OSQLParseNode * pCol = pAssignment->getChild(0); - OSL_ENSURE(pCol != nullptr,"OResultSet: pCol == NULL"); + assert(pCol && "OResultSet: pCol == NULL"); OSQLParseNode * pComp = pAssignment->getChild(1); - OSL_ENSURE(pComp != nullptr,"OResultSet: pComp == NULL"); + assert(pComp && "OResultSet: pComp == NULL"); OSL_ENSURE(pComp->getNodeType() == SQLNodeType::Equal,"OResultSet: pComp->getNodeType() != SQLNodeType::Comparison"); if (pComp->getTokenValue().toChar() != '=') { @@ -611,9 +610,9 @@ void OStatement_Base::GetAssignValues() void OStatement_Base::ParseAssignValues(const std::vector< OUString>& aColumnNameList,OSQLParseNode* pRow_Value_Constructor_Elem, sal_Int32 nIndex) { OSL_ENSURE(o3tl::make_unsigned(nIndex) <= aColumnNameList.size(),"SdbFileCursor::ParseAssignValues: nIndex > aColumnNameList.GetTokenCount()"); - OUString aColumnName(aColumnNameList[nIndex]); + const OUString& aColumnName(aColumnNameList[nIndex]); OSL_ENSURE(aColumnName.getLength() > 0,"OResultSet: Column-Name not found"); - OSL_ENSURE(pRow_Value_Constructor_Elem != nullptr,"OResultSet: pRow_Value_Constructor_Elem must not be NULL!"); + assert(pRow_Value_Constructor_Elem != nullptr && "OResultSet: pRow_Value_Constructor_Elem must not be NULL!"); if (pRow_Value_Constructor_Elem->getNodeType() == SQLNodeType::String || pRow_Value_Constructor_Elem->getNodeType() == SQLNodeType::IntNum || @@ -660,14 +659,6 @@ void OStatement_Base::SetAssignValue(const OUString& aColumnName, { switch (::comphelper::getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))) { - // put criteria depending on the Type as String or double in the variable - case DataType::CHAR: - case DataType::VARCHAR: - case DataType::LONGVARCHAR: - *(*m_aAssignValues)[nId] = ORowSetValue(aValue); - //Characterset is already converted, since the entire statement was converted - break; - case DataType::BIT: if (aValue.equalsIgnoreAsciiCase("TRUE") || aValue[0] == '1') *(*m_aAssignValues)[nId] = true; @@ -676,6 +667,10 @@ void OStatement_Base::SetAssignValue(const OUString& aColumnName, else throwFunctionSequenceException(*this); break; + case DataType::CHAR: + case DataType::VARCHAR: + case DataType::LONGVARCHAR: + //Characterset is already converted, since the entire statement was converted case DataType::TINYINT: case DataType::SMALLINT: case DataType::INTEGER: diff --git a/connectivity/source/drivers/file/FStringFunctions.cxx b/connectivity/source/drivers/file/FStringFunctions.cxx index 619c1a128dbf..d02c7cce1737 100644 --- a/connectivity/source/drivers/file/FStringFunctions.cxx +++ b/connectivity/source/drivers/file/FStringFunctions.cxx @@ -18,6 +18,8 @@ */ #include <file/FStringFunctions.hxx> + +#include <comphelper/string.hxx> #include <rtl/ustrbuf.hxx> using namespace connectivity; @@ -61,7 +63,7 @@ ORowSetValue OOp_Char::operate(const std::vector<ORowSetValue>& lhs) const if (lhs.empty()) return ORowSetValue(); - OUStringBuffer sRet; + OUStringBuffer sRet(static_cast<sal_Int32>(lhs.size())); std::vector<ORowSetValue>::const_reverse_iterator aIter = lhs.rbegin(); std::vector<ORowSetValue>::const_reverse_iterator aEnd = lhs.rend(); for (; aIter != aEnd; ++aIter) @@ -151,13 +153,9 @@ ORowSetValue OOp_Space::operate(const ORowSetValue& lhs) const if (lhs.isNull()) return lhs; - const char c = ' '; - OUStringBuffer sRet; - sal_Int32 nCount = lhs.getInt32(); - for (sal_Int32 i = 0; i < nCount; ++i) - { - sRet.appendAscii(&c, 1); - } + sal_Int32 nCount = std::max(lhs.getInt32(), sal_Int32(0)); + OUStringBuffer sRet(nCount); + comphelper::string::padToLength(sRet, nCount, ' '); return sRet.makeStringAndClear(); } @@ -169,14 +167,7 @@ ORowSetValue OOp_Replace::operate(const std::vector<ORowSetValue>& lhs) const OUString sStr = lhs[2].getString(); OUString sFrom = lhs[1].getString(); OUString sTo = lhs[0].getString(); - sal_Int32 nIndexOf = sStr.indexOf(sFrom); - while (nIndexOf != -1) - { - sStr = sStr.replaceAt(nIndexOf, sFrom.getLength(), sTo); - nIndexOf = sStr.indexOf(sFrom, nIndexOf + sTo.getLength()); - } - - return sStr; + return sStr.replaceAll(sFrom, sTo); } ORowSetValue OOp_Repeat::operate(const ORowSetValue& lhs, const ORowSetValue& rhs) const @@ -184,11 +175,12 @@ ORowSetValue OOp_Repeat::operate(const ORowSetValue& lhs, const ORowSetValue& rh if (lhs.isNull() || rhs.isNull()) return lhs; - OUStringBuffer sRet; - sal_Int32 nCount = rhs.getInt32(); + const OUString s = lhs.getString(); + const sal_Int32 nCount = std::max(rhs.getInt32(), sal_Int32(0)); + OUStringBuffer sRet(s.getLength() * nCount); for (sal_Int32 i = 0; i < nCount; ++i) { - sRet.append(lhs.getString()); + sRet.append(s); } return sRet.makeStringAndClear(); } diff --git a/connectivity/source/drivers/file/FTable.cxx b/connectivity/source/drivers/file/FTable.cxx index 50475449ef73..120af8a61a11 100644 --- a/connectivity/source/drivers/file/FTable.cxx +++ b/connectivity/source/drivers/file/FTable.cxx @@ -74,7 +74,7 @@ void OFileTable::refreshColumns() { ::std::vector< OUString> aVector; Reference< XResultSet > xResult = m_pConnection->getMetaData()->getColumns(Any(), - m_SchemaName,m_Name, "%"); + m_SchemaName,m_Name, u"%"_ustr); if(xResult.is()) { @@ -118,27 +118,10 @@ void SAL_CALL OFileTable::disposing() FileClose(); } -Sequence< sal_Int8 > OFileTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit s_Id; - return s_Id.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OFileTable::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OTable_TYPEDEF>{}); -} - void OFileTable::FileClose() { ::osl::MutexGuard aGuard(m_aMutex); - if (m_pFileStream && m_pFileStream->IsWritable()) - m_pFileStream->Flush(); - m_pFileStream.reset(); m_pBuffer.reset(); } diff --git a/connectivity/source/drivers/file/FTables.cxx b/connectivity/source/drivers/file/FTables.cxx index c063f4a890e6..25321b1721af 100644 --- a/connectivity/source/drivers/file/FTables.cxx +++ b/connectivity/source/drivers/file/FTables.cxx @@ -23,14 +23,12 @@ using namespace connectivity; using namespace connectivity::file; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -sdbcx::ObjectType OTables::createObject(const OUString& /*_rName*/) +css::uno::Reference< css::beans::XPropertySet > OTables::createObject(const OUString& /*_rName*/) { - return sdbcx::ObjectType(); + return nullptr; } void OTables::impl_refresh( ) diff --git a/connectivity/source/drivers/file/fanalyzer.cxx b/connectivity/source/drivers/file/fanalyzer.cxx index a0d1305f6f89..0a749cc3b22d 100644 --- a/connectivity/source/drivers/file/fanalyzer.cxx +++ b/connectivity/source/drivers/file/fanalyzer.cxx @@ -28,7 +28,6 @@ using namespace ::connectivity; using namespace ::connectivity::file; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; OSQLAnalyzer::OSQLAnalyzer(OConnection* _pConnection) diff --git a/connectivity/source/drivers/file/fcode.cxx b/connectivity/source/drivers/file/fcode.cxx index 14fb8f41d6f8..ec56032c8491 100644 --- a/connectivity/source/drivers/file/fcode.cxx +++ b/connectivity/source/drivers/file/fcode.cxx @@ -20,11 +20,10 @@ #include <file/fcode.hxx> #include <osl/diagnose.h> #include <sal/log.hxx> -#include <connectivity/sqlparse.hxx> +#include <connectivity/sqlnode.hxx> #include <sqlbison.hxx> #include <com/sun/star/sdb/SQLFilterOperator.hpp> -using namespace ::comphelper; using namespace connectivity; using namespace connectivity::file; using namespace ::com::sun::star::sdbc; diff --git a/connectivity/source/drivers/file/fcomp.cxx b/connectivity/source/drivers/file/fcomp.cxx index e725b1870865..86ed7d4cf8c5 100644 --- a/connectivity/source/drivers/file/fcomp.cxx +++ b/connectivity/source/drivers/file/fcomp.cxx @@ -22,9 +22,6 @@ #include <connectivity/sqlparse.hxx> #include <file/fanalyzer.hxx> #include <com/sun/star/sdbc/XColumnLocate.hpp> -#include <com/sun/star/util/DateTime.hpp> -#include <com/sun/star/util/Date.hpp> -#include <com/sun/star/util/Time.hpp> #include <connectivity/dbexception.hxx> #include <connectivity/dbconversion.hxx> #include <com/sun/star/sdb/SQLFilterOperator.hpp> @@ -32,7 +29,7 @@ #include <file/FDateFunctions.hxx> #include <file/FNumericFunctions.hxx> #include <file/FConnection.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <sqlbison.hxx> #include <strings.hrc> @@ -78,7 +75,7 @@ void OPredicateCompiler::start(OSQLParseNode const * pSQLParseNode) DBG_ASSERT(pSQLParseNode->count() >= 4,"OFILECursor: Error in Parse Tree"); OSQLParseNode * pTableExp = pSQLParseNode->getChild(3); - DBG_ASSERT(pTableExp != nullptr,"Error in Parse Tree"); + assert(pTableExp && "Error in Parse Tree"); DBG_ASSERT(SQL_ISRULE(pTableExp,table_exp)," Error in Parse Tree"); DBG_ASSERT(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"Error in Parse Tree"); @@ -333,12 +330,12 @@ void OPredicateCompiler::execute_BETWEEN(OSQLParseNode const * pPredicateNode) OOperand* pColumnOp = execute(pColumn); OOperand* pOb1 = execute(p1stValue); - OBoolOperator* pOperator = new OOp_COMPARE(bNot ? SQLFilterOperator::LESS_EQUAL : SQLFilterOperator::GREATER); + OBoolOperator* pOperator = new OOp_COMPARE(bNot ? SQLFilterOperator::LESS : SQLFilterOperator::GREATER_EQUAL); m_aCodeList.emplace_back(pOperator); execute(pColumn); OOperand* pOb2 = execute(p2ndtValue); - pOperator = new OOp_COMPARE(bNot ? SQLFilterOperator::GREATER_EQUAL : SQLFilterOperator::LESS); + pOperator = new OOp_COMPARE(bNot ? SQLFilterOperator::GREATER : SQLFilterOperator::LESS_EQUAL); m_aCodeList.emplace_back(pOperator); if ( pColumnOp && pOb1 && pOb2 ) @@ -353,6 +350,8 @@ void OPredicateCompiler::execute_BETWEEN(OSQLParseNode const * pPredicateNode) break; case DataType::DECIMAL: case DataType::NUMERIC: + case DataType::DOUBLE: + case DataType::REAL: pOb1->setValue(pOb1->getValue().getDouble()); pOb2->setValue(pOb2->getValue().getDouble()); break; @@ -360,11 +359,6 @@ void OPredicateCompiler::execute_BETWEEN(OSQLParseNode const * pPredicateNode) pOb1->setValue(pOb1->getValue().getFloat()); pOb2->setValue(pOb2->getValue().getFloat()); break; - case DataType::DOUBLE: - case DataType::REAL: - pOb1->setValue(pOb1->getValue().getDouble()); - pOb2->setValue(pOb2->getValue().getDouble()); - break; case DataType::DATE: pOb1->setValue(pOb1->getValue().getDate()); pOb2->setValue(pOb2->getValue().getDate()); @@ -549,7 +543,7 @@ bool OPredicateInterpreter::evaluate(OCodeList& rCodeList) m_aStack.pop(); DBG_ASSERT(m_aStack.empty(), "Stack error"); - DBG_ASSERT(pOperand, "Stack error"); + assert(pOperand && "Stack error"); const bool bResult = pOperand->isValid(); if (typeid(OOperandResult) == typeid(*pOperand)) @@ -575,7 +569,7 @@ void OPredicateInterpreter::evaluateSelection(OCodeList& rCodeList, ORowSetValue m_aStack.pop(); DBG_ASSERT(m_aStack.empty(), "Stack error"); - DBG_ASSERT(pOperand, "Stack error"); + assert(pOperand && "Stack error"); (*_rVal) = pOperand->getValue(); if (typeid(OOperandResult) == typeid(*pOperand)) diff --git a/connectivity/source/drivers/firebird/Blob.cxx b/connectivity/source/drivers/firebird/Blob.cxx index 33ab36b8d33e..774246fa18d4 100644 --- a/connectivity/source/drivers/firebird/Blob.cxx +++ b/connectivity/source/drivers/firebird/Blob.cxx @@ -19,7 +19,7 @@ #include <connectivity/CommonTools.hxx> #include <connectivity/dbexception.hxx> #include <cppuhelper/exc_hlp.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> using namespace ::connectivity::firebird; @@ -205,7 +205,7 @@ uno::Sequence< sal_Int8 > SAL_CALL Blob::getBytes(sal_Int64 nPosition, ensureBlobIsOpened(); if (nPosition > m_nBlobLength || nPosition < 1) - throw lang::IllegalArgumentException("nPosition out of range", *this, 0); + throw lang::IllegalArgumentException(u"nPosition out of range"_ustr, *this, 0); // We only have to read as many bytes as are available, i.e. nPosition+nBytes // can legally be greater than the total length, hence we don't bother to check. @@ -234,15 +234,13 @@ uno::Reference< XInputStream > SAL_CALL Blob::getBinaryStream() sal_Int64 SAL_CALL Blob::position(const uno::Sequence< sal_Int8 >& /*rPattern*/, sal_Int64 /*nStart*/) { - ::dbtools::throwFeatureNotImplementedSQLException("Blob::position", *this); - return 0; + ::dbtools::throwFeatureNotImplementedSQLException(u"Blob::position"_ustr, *this); } sal_Int64 SAL_CALL Blob::positionOfBlob(const uno::Reference< XBlob >& /*rPattern*/, sal_Int64 /*aStart*/) { - ::dbtools::throwFeatureNotImplementedSQLException("Blob::positionOfBlob", *this); - return 0; + ::dbtools::throwFeatureNotImplementedSQLException(u"Blob::positionOfBlob"_ustr, *this); } // ---- XInputStream ---------------------------------------------------------- diff --git a/connectivity/source/drivers/firebird/Blob.hxx b/connectivity/source/drivers/firebird/Blob.hxx index 990108934bf2..80a23459288e 100644 --- a/connectivity/source/drivers/firebird/Blob.hxx +++ b/connectivity/source/drivers/firebird/Blob.hxx @@ -19,81 +19,81 @@ #include <vector> namespace connectivity::firebird +{ + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XBlob, + css::io::XInputStream > + Blob_BASE; + + class Blob : + public Blob_BASE { - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XBlob, - css::io::XInputStream > - Blob_BASE; - - class Blob : - public Blob_BASE - { - protected: - ::osl::Mutex m_aMutex; - - isc_db_handle* m_pDatabaseHandle; - isc_tr_handle* m_pTransactionHandle; - // We store our own copy of the blob id as typically the statement - // manages its own blob id, and blobs are independent of a statement - // in firebird. - ISC_QUAD m_blobID; - isc_blob_handle m_blobHandle; - - bool m_bBlobOpened; - sal_Int64 m_nBlobLength; - sal_uInt16 m_nMaxSegmentSize; - sal_Int64 m_nBlobPosition; - - ISC_STATUS_ARRAY m_statusVector; - - /// @throws css::sdbc::SQLException - void ensureBlobIsOpened(); - /** - * Closes the blob and cleans up resources -- can be used to reset - * the blob if we e.g. want to read from the beginning again. - * - * @throws css::sdbc::SQLException - */ - void closeBlob(); - sal_uInt16 getMaximumSegmentSize(); - - public: - Blob(isc_db_handle* pDatabaseHandle, - isc_tr_handle* pTransactionHandle, - ISC_QUAD const & aBlobID); - - bool readOneSegment(std::vector<char>& rDataOut); - - // ---- XBlob ---------------------------------------------------- - virtual sal_Int64 SAL_CALL - length() override; - virtual css::uno::Sequence< sal_Int8 > SAL_CALL - getBytes(sal_Int64 aPosition, sal_Int32 aLength) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL - getBinaryStream() override; - virtual sal_Int64 SAL_CALL - position(const css::uno::Sequence< sal_Int8 >& rPattern, - sal_Int64 aStart) override; - virtual sal_Int64 SAL_CALL - positionOfBlob(const css::uno::Reference< css::sdbc::XBlob >& rPattern, - sal_Int64 aStart) override; - - // ---- XInputStream ---------------------------------------------- - virtual sal_Int32 SAL_CALL - readBytes(css::uno::Sequence< sal_Int8 >& rDataOut, - sal_Int32 nBytes) override; - virtual sal_Int32 SAL_CALL - readSomeBytes(css::uno::Sequence< sal_Int8 >& rDataOut, - sal_Int32 nMaximumBytes) override; - virtual void SAL_CALL - skipBytes(sal_Int32 nBytes) override; - virtual sal_Int32 SAL_CALL - available() override; - virtual void SAL_CALL - closeInput() override; - - // ---- OComponentHelper ------------------------------------------ - virtual void SAL_CALL disposing() override; - }; + protected: + ::osl::Mutex m_aMutex; + + isc_db_handle* m_pDatabaseHandle; + isc_tr_handle* m_pTransactionHandle; + // We store our own copy of the blob id as typically the statement + // manages its own blob id, and blobs are independent of a statement + // in firebird. + ISC_QUAD m_blobID; + isc_blob_handle m_blobHandle; + + bool m_bBlobOpened; + sal_Int64 m_nBlobLength; + sal_uInt16 m_nMaxSegmentSize; + sal_Int64 m_nBlobPosition; + + ISC_STATUS_ARRAY m_statusVector; + + /// @throws css::sdbc::SQLException + void ensureBlobIsOpened(); + /** + * Closes the blob and cleans up resources -- can be used to reset + * the blob if we e.g. want to read from the beginning again. + * + * @throws css::sdbc::SQLException + */ + void closeBlob(); + sal_uInt16 getMaximumSegmentSize(); + + public: + Blob(isc_db_handle* pDatabaseHandle, + isc_tr_handle* pTransactionHandle, + ISC_QUAD const & aBlobID); + + bool readOneSegment(std::vector<char>& rDataOut); + + // ---- XBlob ---------------------------------------------------- + virtual sal_Int64 SAL_CALL + length() override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL + getBytes(sal_Int64 aPosition, sal_Int32 aLength) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL + getBinaryStream() override; + virtual sal_Int64 SAL_CALL + position(const css::uno::Sequence< sal_Int8 >& rPattern, + sal_Int64 aStart) override; + virtual sal_Int64 SAL_CALL + positionOfBlob(const css::uno::Reference< css::sdbc::XBlob >& rPattern, + sal_Int64 aStart) override; + + // ---- XInputStream ---------------------------------------------- + virtual sal_Int32 SAL_CALL + readBytes(css::uno::Sequence< sal_Int8 >& rDataOut, + sal_Int32 nBytes) override; + virtual sal_Int32 SAL_CALL + readSomeBytes(css::uno::Sequence< sal_Int8 >& rDataOut, + sal_Int32 nMaximumBytes) override; + virtual void SAL_CALL + skipBytes(sal_Int32 nBytes) override; + virtual sal_Int32 SAL_CALL + available() override; + virtual void SAL_CALL + closeInput() override; + + // ---- OComponentHelper ------------------------------------------ + virtual void SAL_CALL disposing() override; + }; } diff --git a/connectivity/source/drivers/firebird/Catalog.cxx b/connectivity/source/drivers/firebird/Catalog.cxx index c743b42cc75f..aba0784662a7 100644 --- a/connectivity/source/drivers/firebird/Catalog.cxx +++ b/connectivity/source/drivers/firebird/Catalog.cxx @@ -10,6 +10,7 @@ #include "Catalog.hxx" #include "Tables.hxx" #include "Users.hxx" +#include "Views.hxx" #include <com/sun/star/sdbc/XRow.hpp> @@ -27,11 +28,11 @@ Catalog::Catalog(const uno::Reference< XConnection >& rConnection): //----- OCatalog ------------------------------------------------------------- void Catalog::refreshTables() { - Sequence< OUString > aTypes {"TABLE", "VIEW"}; + Sequence< OUString > aTypes {u"TABLE"_ustr, u"VIEW"_ustr}; uno::Reference< XResultSet > xTables = m_xMetaData->getTables(Any(), - "%", - "%", + u"%"_ustr, + u"%"_ustr, aTypes); if (!xTables.is()) @@ -53,8 +54,20 @@ void Catalog::refreshTables() void Catalog::refreshViews() { - // TODO: implement me. - // Sets m_pViews (OCatalog) + css::uno::Reference<css::sdbc::XResultSet> xViews + = m_xMetaData->getTables(css::uno::Any(), u"%"_ustr, u"%"_ustr, { u"VIEW"_ustr }); + + if (!xViews.is()) + return; + + ::std::vector<OUString> aViewNames; + + fillNames(xViews, aViewNames); + + if (!m_pViews) + m_pViews.reset(new Views(m_xConnection, *this, m_aMutex, aViewNames)); + else + m_pViews->reFill(aViewNames); } //----- IRefreshableGroups --------------------------------------------------- @@ -67,7 +80,7 @@ void Catalog::refreshGroups() void Catalog::refreshUsers() { Reference<XStatement> xStmt= m_xMetaData->getConnection()->createStatement(); - uno::Reference< XResultSet > xUsers = xStmt->executeQuery("SELECT DISTINCT RDB$USER FROM RDB$USER_PRIVILEGES"); + uno::Reference< XResultSet > xUsers = xStmt->executeQuery(u"SELECT DISTINCT RDB$USER FROM RDB$USER_PRIVILEGES"_ustr); if (!xUsers.is()) return; diff --git a/connectivity/source/drivers/firebird/Catalog.hxx b/connectivity/source/drivers/firebird/Catalog.hxx index 4a562e22a26e..7ae15960546b 100644 --- a/connectivity/source/drivers/firebird/Catalog.hxx +++ b/connectivity/source/drivers/firebird/Catalog.hxx @@ -12,25 +12,28 @@ #include <sdbcx/VCatalog.hxx> namespace connectivity::firebird +{ + class Catalog: public ::connectivity::sdbcx::OCatalog { - class Catalog: public ::connectivity::sdbcx::OCatalog - { - css::uno::Reference< css::sdbc::XConnection > - m_xConnection; + css::uno::Reference< css::sdbc::XConnection > + m_xConnection; - public: - explicit Catalog(const css::uno::Reference< css::sdbc::XConnection >& rConnection); + public: + explicit Catalog(const css::uno::Reference< css::sdbc::XConnection >& rConnection); - // OCatalog - virtual void refreshTables() override; - virtual void refreshViews() override; + // OCatalog + virtual void refreshTables() override; + virtual void refreshViews() override; - // IRefreshableGroups - virtual void refreshGroups() override; + // IRefreshableGroups + virtual void refreshGroups() override; - // IRefreshableUsers - virtual void refreshUsers() override; - }; + // IRefreshableUsers + virtual void refreshUsers() override; + + sdbcx::OCollection* getPrivateTables() const { return m_pTables.get(); } + sdbcx::OCollection* getPrivateViews() const { return m_pViews.get(); } + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/Clob.cxx b/connectivity/source/drivers/firebird/Clob.cxx index 707020b39bbf..95d14c11d08d 100644 --- a/connectivity/source/drivers/firebird/Clob.cxx +++ b/connectivity/source/drivers/firebird/Clob.cxx @@ -9,8 +9,6 @@ #include <sal/config.h> -#include <string_view> - #include "Clob.hxx" #include "Blob.hxx" @@ -72,11 +70,11 @@ OUString SAL_CALL Clob::getSubString(sal_Int64 nPosition, sal_Int32 nLength) { if (nPosition < 1) // XClob is indexed from 1 - throw lang::IllegalArgumentException("nPosition < 1", *this, 0); + throw lang::IllegalArgumentException(u"nPosition < 1"_ustr, *this, 0); --nPosition; // make 0-based if (nLength < 0) - throw lang::IllegalArgumentException("nLength < 0", *this, 0); + throw lang::IllegalArgumentException(u"nLength < 0"_ustr, *this, 0); MutexGuard aGuard(m_aMutex); checkDisposed(Clob_BASE::rBHelper.bDisposed); @@ -96,7 +94,7 @@ OUString SAL_CALL Clob::getSubString(sal_Int64 nPosition, if (sSegment.getLength() < nPosition) { if (bLastRead) - throw lang::IllegalArgumentException("nPosition out of range", *this, 0); + throw lang::IllegalArgumentException(u"nPosition out of range"_ustr, *this, 0); nPosition -= sSegment.getLength(); continue; } @@ -112,7 +110,7 @@ OUString SAL_CALL Clob::getSubString(sal_Int64 nPosition, assert(sSegmentBuffer.getLength() < nLength); if (bLastRead) - throw lang::IllegalArgumentException("out of range", *this, 0); + throw lang::IllegalArgumentException(u"out of range"_ustr, *this, 0); nPosition = 0; // No offset after first append } @@ -129,15 +127,13 @@ uno::Reference< XInputStream > SAL_CALL Clob::getCharacterStream() sal_Int64 SAL_CALL Clob::position(const OUString& /*rPattern*/, sal_Int32 /*nStart*/) { - ::dbtools::throwFeatureNotImplementedSQLException("Clob::position", *this); - return 0; + ::dbtools::throwFeatureNotImplementedSQLException(u"Clob::position"_ustr, *this); } sal_Int64 SAL_CALL Clob::positionOfClob(const Reference <XClob >& /*rPattern*/, sal_Int64 /*aStart*/) { - ::dbtools::throwFeatureNotImplementedSQLException("Clob::positionOfClob", *this); - return 0; + ::dbtools::throwFeatureNotImplementedSQLException(u"Clob::positionOfClob"_ustr, *this); } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Clob.hxx b/connectivity/source/drivers/firebird/Clob.hxx index 7fc5459d5d29..385836627e68 100644 --- a/connectivity/source/drivers/firebird/Clob.hxx +++ b/connectivity/source/drivers/firebird/Clob.hxx @@ -18,46 +18,46 @@ #include <rtl/ref.hxx> namespace connectivity::firebird - { - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XClob > - Clob_BASE; +{ + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XClob > + Clob_BASE; - class Clob : - public Clob_BASE - { - protected: - ::osl::Mutex m_aMutex; + class Clob : + public Clob_BASE + { + protected: + ::osl::Mutex m_aMutex; - /* - * In Firebird Clob (textual Blob) is a subtype of blob, - * hence we store the data in a Blob, and the Clob class is - * a wrapper around that. - */ - rtl::Reference<connectivity::firebird::Blob> m_aBlob; + /* + * In Firebird Clob (textual Blob) is a subtype of blob, + * hence we store the data in a Blob, and the Clob class is + * a wrapper around that. + */ + rtl::Reference<connectivity::firebird::Blob> m_aBlob; - sal_Int64 m_nCharCount; + sal_Int64 m_nCharCount; - public: - Clob(isc_db_handle* pDatabaseHandle, - isc_tr_handle* pTransactionHandle, - ISC_QUAD const & aBlobID); + public: + Clob(isc_db_handle* pDatabaseHandle, + isc_tr_handle* pTransactionHandle, + ISC_QUAD const & aBlobID); - // ---- XClob ---------------------------------------------------- - virtual sal_Int64 SAL_CALL - length() override; - virtual OUString SAL_CALL - getSubString(sal_Int64 aPosition, sal_Int32 aLength) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL - getCharacterStream() override; - virtual sal_Int64 SAL_CALL - position(const OUString& rPattern, - sal_Int32 aStart) override; - virtual sal_Int64 SAL_CALL - positionOfClob(const ::css::uno::Reference< ::css::sdbc::XClob >& rPattern, - sal_Int64 aStart) override; - // ---- OComponentHelper ------------------------------------------ - virtual void SAL_CALL disposing() override; - }; + // ---- XClob ---------------------------------------------------- + virtual sal_Int64 SAL_CALL + length() override; + virtual OUString SAL_CALL + getSubString(sal_Int64 aPosition, sal_Int32 aLength) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL + getCharacterStream() override; + virtual sal_Int64 SAL_CALL + position(const OUString& rPattern, + sal_Int32 aStart) override; + virtual sal_Int64 SAL_CALL + positionOfClob(const ::css::uno::Reference< ::css::sdbc::XClob >& rPattern, + sal_Int64 aStart) override; + // ---- OComponentHelper ------------------------------------------ + virtual void SAL_CALL disposing() override; + }; } diff --git a/connectivity/source/drivers/firebird/Column.cxx b/connectivity/source/drivers/firebird/Column.cxx index 0a18ebe5b441..5838456abaf7 100644 --- a/connectivity/source/drivers/firebird/Column.cxx +++ b/connectivity/source/drivers/firebird/Column.cxx @@ -45,7 +45,7 @@ void Column::construct() css::uno::Sequence< OUString > SAL_CALL Column::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.Firebird" }; + return { u"com.sun.star.sdbc.Firebird"_ustr }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Column.hxx b/connectivity/source/drivers/firebird/Column.hxx index c66287ce5668..13a13052feeb 100644 --- a/connectivity/source/drivers/firebird/Column.hxx +++ b/connectivity/source/drivers/firebird/Column.hxx @@ -11,21 +11,21 @@ #include <connectivity/sdbcx/VColumn.hxx> namespace connectivity::firebird +{ + class Column; + typedef ::comphelper::OIdPropertyArrayUsageHelper<Column> Column_PROP; + class Column : public sdbcx::OColumn, + public Column_PROP { - class Column; - typedef ::comphelper::OIdPropertyArrayUsageHelper<Column> Column_PROP; - class Column : public sdbcx::OColumn, - public Column_PROP - { - OUString m_sAutoIncrement; - protected: - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const override; - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; - public: - Column(); - virtual void construct() override; - virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; - }; + OUString m_sAutoIncrement; + protected: + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const override; + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + public: + Column(); + virtual void construct() override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + }; } diff --git a/connectivity/source/drivers/firebird/Columns.cxx b/connectivity/source/drivers/firebird/Columns.cxx index 200eec1fb57d..d36e25f9195b 100644 --- a/connectivity/source/drivers/firebird/Columns.cxx +++ b/connectivity/source/drivers/firebird/Columns.cxx @@ -12,13 +12,11 @@ using namespace ::connectivity; using namespace ::connectivity::firebird; -using namespace ::connectivity::sdbcx; using namespace ::cppu; using namespace ::osl; using namespace ::com::sun::star; -using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::uno; Columns::Columns(Table& rTable, diff --git a/connectivity/source/drivers/firebird/Columns.hxx b/connectivity/source/drivers/firebird/Columns.hxx index a211f70d1809..ef3b06bc6a4f 100644 --- a/connectivity/source/drivers/firebird/Columns.hxx +++ b/connectivity/source/drivers/firebird/Columns.hxx @@ -15,15 +15,15 @@ namespace connectivity::firebird { - class Columns: public ::connectivity::OColumnsHelper - { - protected: - virtual css::uno::Reference< css::beans::XPropertySet > createDescriptor() override; - public: - Columns(Table& rTable, - ::osl::Mutex& rMutex, - const ::std::vector< OUString> &_rVector); - }; + class Columns: public ::connectivity::OColumnsHelper + { + protected: + virtual css::uno::Reference< css::beans::XPropertySet > createDescriptor() override; + public: + Columns(Table& rTable, + ::osl::Mutex& rMutex, + const ::std::vector< OUString> &_rVector); + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/Connection.cxx b/connectivity/source/drivers/firebird/Connection.cxx index 7122d80b7a15..fc105a883e4e 100644 --- a/connectivity/source/drivers/firebird/Connection.cxx +++ b/connectivity/source/drivers/firebird/Connection.cxx @@ -22,7 +22,6 @@ #include "Clob.hxx" #include "Connection.hxx" #include "DatabaseMetaData.hxx" -#include "Driver.hxx" #include "PreparedStatement.hxx" #include "Statement.hxx" #include "Util.hxx" @@ -48,7 +47,6 @@ #include <comphelper/storagehelper.hxx> #include <cppuhelper/exc_hlp.hxx> #include <unotools/tempfile.hxx> -#include <unotools/localfilehelper.hxx> #include <osl/file.hxx> #include <rtl/strbuf.hxx> @@ -74,11 +72,11 @@ using namespace ::com::sun::star::uno; * Location within the .odb that an embedded .fdb will be stored. * Only relevant for embedded dbs. */ -constexpr OUStringLiteral our_sFDBLocation( u"firebird.fdb" ); +constexpr OUString our_sFDBLocation( u"firebird.fdb"_ustr ); /** * Older version of LO may store the database in a .fdb file */ -constexpr OUStringLiteral our_sFBKLocation( u"firebird.fbk" ); +constexpr OUString our_sFBKLocation( u"firebird.fbk"_ustr ); Connection::Connection() : Connection_BASE(m_aMutex) @@ -86,7 +84,7 @@ Connection::Connection() , m_bIsFile(false) , m_bIsAutoCommit(true) , m_bIsReadOnly(false) - , m_aTransactionIsolation(TransactionIsolation::REPEATABLE_READ) + , m_aTransactionIsolation(TransactionIsolation::READ_COMMITTED) #if SAL_TYPES_SIZEOFPOINTER == 8 , m_aDBHandle(0) , m_aTransactionHandle(0) @@ -163,7 +161,7 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >& bIsNewDatabase = !m_xEmbeddedStorage->hasElements(); - m_pDatabaseFileDir.reset(new ::utl::TempFile(nullptr, true)); + m_pDatabaseFileDir.reset(new ::utl::TempFileNamed(nullptr, true)); m_pDatabaseFileDir->EnableKillingFile(); m_sFirebirdURL = m_pDatabaseFileDir->GetFileName() + "/firebird.fdb"; m_sFBKPath = m_pDatabaseFileDir->GetFileName() + "/firebird.fbk"; @@ -198,7 +196,7 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >& // External file AND/OR remote connection else if (url.startsWith("sdbc:firebird:")) { - m_sFirebirdURL = url.copy(OUString("sdbc:firebird:").getLength()); + m_sFirebirdURL = url.copy(strlen("sdbc:firebird:")); if (m_sFirebirdURL.startsWith("file://")) { m_bIsFile = true; @@ -219,7 +217,7 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >& dpbBuffer.push_back(isc_dpb_version1); dpbBuffer.push_back(isc_dpb_sql_dialect); dpbBuffer.push_back(1); // 1 byte long - dpbBuffer.push_back(FIREBIRD_SQL_DIALECT); + dpbBuffer.push_back(SQL_DIALECT_CURRENT); // set UTF8 as default character set of the database const char sCharset[] = "UTF8"; @@ -235,8 +233,8 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >& if (m_bIsEmbedded || m_bIsFile) { - userName = "sysdba"; - userPassword = "masterkey"; + userName = "sysdba"_ostr; + userPassword = "masterkey"_ostr; } else { @@ -341,15 +339,9 @@ void Connection::construct(const OUString& url, const Sequence< PropertyValue >& } } -void Connection::notifyDatabaseModified() -{ - if (m_xParentDocument.is()) // Only true in embedded mode - m_xParentDocument->setModified(true); -} - //----- XServiceInfo --------------------------------------------------------- -IMPLEMENT_SERVICE_INFO(Connection, "com.sun.star.sdbc.drivers.firebird.Connection", - "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(Connection, u"com.sun.star.sdbc.drivers.firebird.Connection"_ustr, + u"com.sun.star.sdbc.Connection"_ustr) Reference< XBlob> Connection::createBlob(ISC_QUAD const * pBlobId) { @@ -360,7 +352,7 @@ Reference< XBlob> Connection::createBlob(ISC_QUAD const * pBlobId) &m_aTransactionHandle, *pBlobId); - m_aStatements.push_back(WeakReferenceHelper(xReturn)); + m_aStatements.emplace_back(xReturn); return xReturn; } @@ -373,7 +365,7 @@ Reference< XClob> Connection::createClob(ISC_QUAD const * pBlobId) &m_aTransactionHandle, *pBlobId); - m_aStatements.push_back(WeakReferenceHelper(xReturn)); + m_aStatements.emplace_back(xReturn); return xReturn; } @@ -385,7 +377,7 @@ sal_Int64 SAL_CALL Connection::getSomething(const css::uno::Sequence<sal_Int8>& } // static -css::uno::Sequence<sal_Int8> Connection::getUnoTunnelId() +const css::uno::Sequence<sal_Int8> & Connection::getUnoTunnelId() { static const comphelper::UnoIdInit implId; return implId.getSeq(); @@ -404,7 +396,7 @@ Reference< XStatement > SAL_CALL Connection::createStatement( ) // create a statement // the statement can only be executed once Reference< XStatement > xReturn = new OStatement(this); - m_aStatements.push_back(WeakReferenceHelper(xReturn)); + m_aStatements.emplace_back(xReturn); return xReturn; } @@ -420,7 +412,7 @@ Reference< XPreparedStatement > SAL_CALL Connection::prepareStatement( buildTypeInfo(); Reference< XPreparedStatement > xReturn = new OPreparedStatement(this, _sSql); - m_aStatements.push_back(WeakReferenceHelper(xReturn)); + m_aStatements.emplace_back(xReturn); return xReturn; } @@ -442,7 +434,6 @@ Reference< XPreparedStatement > SAL_CALL Connection::prepareCall( OUString SAL_CALL Connection::nativeSQL( const OUString& _sSql ) { - MutexGuard aGuard( m_aMutex ); // We do not need to adapt the SQL for Firebird atm. return _sSql; } @@ -492,8 +483,6 @@ void Connection::setupTransaction() aTransactionIsolation = isc_tpb_read_committed; break; case TransactionIsolation::REPEATABLE_READ: - aTransactionIsolation = isc_tpb_consistency; - break; case TransactionIsolation::SERIALIZABLE: aTransactionIsolation = isc_tpb_consistency; break; @@ -583,7 +572,7 @@ isc_svc_handle Connection::attachServiceManager() *pSPB++ = isc_spb_version; *pSPB++ = isc_spb_current_version; *pSPB++ = isc_spb_user_name; - OUString sUserName("SYSDBA"); + OUString sUserName(u"SYSDBA"_ustr); char aLength = static_cast<char>(sUserName.getLength()); *pSPB++ = aLength; strncpy(pSPB, @@ -631,22 +620,18 @@ void Connection::runBackupService(const short nAction) OString sFBKPath = OUStringToOString(m_sFBKPath, RTL_TEXTENCODING_UTF8); - OStringBuffer aRequest; // byte array - - - aRequest.append(static_cast<char>(nAction)); - - aRequest.append(char(isc_spb_dbname)); // .fdb sal_uInt16 nFDBLength = sFDBPath.getLength(); - aRequest.append(static_cast<char>(nFDBLength & 0xFF)); // least significant byte first - aRequest.append(static_cast<char>((nFDBLength >> 8) & 0xFF)); - aRequest.append(sFDBPath); - - aRequest.append(char(isc_spb_bkp_file)); // .fbk sal_uInt16 nFBKLength = sFBKPath.getLength(); - aRequest.append(static_cast<char>(nFBKLength & 0xFF)); - aRequest.append(static_cast<char>((nFBKLength >> 8) & 0xFF)); - aRequest.append(sFBKPath); + OStringBuffer aRequest( // byte array + OStringChar(static_cast<char>(nAction)) + + OStringChar(char(isc_spb_dbname)) // .fdb + + OStringChar(static_cast<char>(nFDBLength & 0xFF)) // least significant byte first + + OStringChar(static_cast<char>((nFDBLength >> 8) & 0xFF)) + + sFDBPath + + OStringChar(char(isc_spb_bkp_file)) // .fbk + + OStringChar(static_cast<char>(nFBKLength & 0xFF)) + + OStringChar(static_cast<char>((nFBKLength >> 8) & 0xFF)) + + sFBKPath); if (nAction == isc_action_svc_restore) { @@ -724,11 +709,11 @@ Reference< XDatabaseMetaData > SAL_CALL Connection::getMetaData( ) // here we have to create the class with biggest interface // The answer is 42 :-) - Reference< XDatabaseMetaData > xMetaData = m_xMetaData; + rtl::Reference< ODatabaseMetaData > xMetaData = m_xMetaData.get(); if(!xMetaData.is()) { xMetaData = new ODatabaseMetaData(this); // need the connection because it can return it - m_xMetaData = xMetaData; + m_xMetaData = xMetaData.get(); } return xMetaData; @@ -753,13 +738,12 @@ sal_Bool SAL_CALL Connection::isReadOnly() void SAL_CALL Connection::setCatalog(const OUString& /*catalog*/) { - ::dbtools::throwFunctionNotSupportedSQLException("setCatalog", *this); + ::dbtools::throwFunctionNotSupportedSQLException(u"setCatalog"_ustr, *this); } OUString SAL_CALL Connection::getCatalog() { - ::dbtools::throwFunctionNotSupportedSQLException("getCatalog", *this); - return OUString(); + ::dbtools::throwFunctionNotSupportedSQLException(u"getCatalog"_ustr, *this); } void SAL_CALL Connection::setTransactionIsolation( sal_Int32 level ) @@ -781,13 +765,12 @@ sal_Int32 SAL_CALL Connection::getTransactionIsolation( ) Reference< XNameAccess > SAL_CALL Connection::getTypeMap() { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::getTypeMap", *this ); - return nullptr; + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::getTypeMap"_ustr, *this ); } void SAL_CALL Connection::setTypeMap(const Reference< XNameAccess >&) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setTypeMap", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setTypeMap"_ustr, *this ); } //----- XCloseable ----------------------------------------------------------- @@ -829,42 +812,9 @@ void SAL_CALL Connection::documentEventOccured( const DocumentEvent& Event ) if ( !(m_bIsEmbedded && m_xEmbeddedStorage.is()) ) return; - SAL_INFO("connectivity.firebird", "Writing .fbk from running db"); - try - { - runBackupService(isc_action_svc_backup); - } - catch (const SQLException& e) - { - auto a = cppu::getCaughtException(); - throw WrappedTargetRuntimeException(e.Message, e.Context, a); - } - - - Reference< XStream > xDBStream(m_xEmbeddedStorage->openStreamElement(our_sFBKLocation, - ElementModes::WRITE)); - - // TODO: verify the backup actually exists -- the backup service - // can fail without giving any sane error messages / telling us - // that it failed. - using namespace ::comphelper; - Reference< XComponentContext > xContext = comphelper::getProcessComponentContext(); - Reference< XInputStream > xInputStream; - if (!xContext.is()) - return; - - xInputStream = - OStorageHelper::GetInputStreamFromURL(m_sFBKPath, xContext); - if (xInputStream.is()) - OStorageHelper::CopyInputToOutput( xInputStream, - xDBStream->getOutputStream()); - - // remove old fdb file if exists - uno::Reference< ucb::XSimpleFileAccess > xFileAccess = - ucb::SimpleFileAccess::create(xContext); - if (xFileAccess->exists(m_sFirebirdURL)) - xFileAccess->kill(m_sFirebirdURL); + storeDatabase(); } + // XEventListener void SAL_CALL Connection::disposing(const EventObject& /*rSource*/) { @@ -929,7 +879,7 @@ void Connection::disposing() disposeStatements(); - m_xMetaData = css::uno::WeakReference< css::sdbc::XDatabaseMetaData>(); + m_xMetaData.clear(); ISC_STATUS_ARRAY status; /* status vector */ if (m_aTransactionHandle) @@ -945,13 +895,43 @@ void Connection::disposing() evaluateStatusVector(status, u"isc_detach_database", *this); } } - // TODO: write to storage again? + + storeDatabase(); cppu::WeakComponentImplHelperBase::disposing(); m_pDatabaseFileDir.reset(); } +void Connection::storeDatabase() +{ + MutexGuard aGuard(m_aMutex); + if (m_bIsEmbedded && m_xEmbeddedStorage.is()) + { + SAL_INFO("connectivity.firebird", "Writing .fbk from running db"); + try + { + runBackupService(isc_action_svc_backup); + } + catch (const SQLException& e) + { + auto a = cppu::getCaughtException(); + throw WrappedTargetRuntimeException(e.Message, e.Context, a); + } + Reference<XStream> xDBStream( + m_xEmbeddedStorage->openStreamElement(our_sFBKLocation, ElementModes::WRITE)); + using namespace ::comphelper; + const Reference<XComponentContext>& xContext = comphelper::getProcessComponentContext(); + Reference<XInputStream> xInputStream; + if (!xContext.is()) + return; + xInputStream = OStorageHelper::GetInputStreamFromURL(m_sFBKPath, xContext); + if (xInputStream.is()) + OStorageHelper::CopyInputToOutput(xInputStream, xDBStream->getOutputStream()); + } +} + + void Connection::disposeStatements() { MutexGuard aGuard(m_aMutex); @@ -969,18 +949,13 @@ uno::Reference< XTablesSupplier > Connection::createCatalog() MutexGuard aGuard(m_aMutex); // m_xCatalog is a weak reference. Reuse it if it still exists. - Reference< XTablesSupplier > xCatalog = m_xCatalog; - if (xCatalog.is()) - { - return xCatalog; - } - else + rtl::Reference< Catalog > xCatalog = m_xCatalog.get(); + if (!xCatalog.is()) { xCatalog = new Catalog(this); - m_xCatalog = xCatalog; - return m_xCatalog; + m_xCatalog = xCatalog.get(); } - + return xCatalog; } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Connection.hxx b/connectivity/source/drivers/firebird/Connection.hxx index caf091146ae6..524c0a7c476f 100644 --- a/connectivity/source/drivers/firebird/Connection.hxx +++ b/connectivity/source/drivers/firebird/Connection.hxx @@ -27,6 +27,7 @@ #include <memory> #include <OTypeInfo.hxx> #include <unotools/tempfile.hxx> +#include <unotools/weakref.hxx> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/document/DocumentEvent.hpp> @@ -42,205 +43,201 @@ #include <com/sun/star/util/XModifiable.hpp> namespace connectivity::firebird - { +{ + + typedef ::cppu::WeakComponentImplHelper< css::document::XDocumentEventListener, + css::lang::XServiceInfo, + css::lang::XUnoTunnel, + css::sdbc::XConnection, + css::sdbc::XWarningsSupplier + > Connection_BASE; + + class OStatementCommonBase; + class FirebirdDriver; + class ODatabaseMetaData; + class Catalog; - typedef ::cppu::WeakComponentImplHelper< css::document::XDocumentEventListener, - css::lang::XServiceInfo, - css::lang::XUnoTunnel, - css::sdbc::XConnection, - css::sdbc::XWarningsSupplier - > Connection_BASE; - - class OStatementCommonBase; - class FirebirdDriver; - class ODatabaseMetaData; - - - typedef std::vector< ::connectivity::OTypeInfo> TTypeInfoVector; - typedef std::vector< css::uno::WeakReferenceHelper > OWeakRefArray; - - class Connection final : public Connection_BASE - { - ::osl::Mutex m_aMutex; - - TTypeInfoVector m_aTypeInfo; // vector containing an entry - // for each row returned by - // DatabaseMetaData.getTypeInfo. - - /** The URL passed to us when opening, i.e. of the form sdbc:* */ - OUString m_sConnectionURL; - /** - * The URL passed to firebird, i.e. either a local file (for a - * temporary .fdb extracted from a .odb or a normal local file) or - * a remote url. - */ - OUString m_sFirebirdURL; - - /* EMBEDDED MODE DATA */ - /** Denotes that we have a database stored within a .odb file. */ - bool m_bIsEmbedded; - - /** - * Handle for the parent DatabaseDocument. We need to notify this - * whenever any data is written to our temporary database so that - * the user is able to save this back to the .odb file. - * - * Note that this is ONLY set in embedded mode. - */ - css::uno::Reference< css::util::XModifiable > - m_xParentDocument; - - /** - * Handle for the folder within the .odb where we store our .fbk - * (Only used if m_bIsEmbedded is true). - */ - css::uno::Reference< css::embed::XStorage > - m_xEmbeddedStorage; - /** - * The temporary folder where we extract the .fbk from a .odb, - * and also store the temporary .fdb - * It is only valid if m_bIsEmbedded is true. - * - * The extracted .fbk is written in firebird.fbk, the temporary - * .fdb is stored as firebird.fdb. - */ - std::unique_ptr< ::utl::TempFile > m_pDatabaseFileDir; - /** - * Path for our extracted .fbk file. - * - * (The temporary .fdb is our m_sFirebirdURL.) - */ - OUString m_sFBKPath; - - void loadDatabaseFile(const OUString& pSrcLocation, const OUString& pTmpLocation); - - /** - * Run the backup service, use nAction = - * isc_action_svc_backup to backup, nAction = isc_action_svc_restore - * to restore. - */ - void runBackupService(const short nAction); - - isc_svc_handle attachServiceManager(); - - void detachServiceManager(isc_svc_handle pServiceHandle); - - /** We are using an external (local) file */ - bool m_bIsFile; - - /* CONNECTION PROPERTIES */ - bool m_bIsAutoCommit; - bool m_bIsReadOnly; - sal_Int32 m_aTransactionIsolation; - - isc_db_handle m_aDBHandle; - isc_tr_handle m_aTransactionHandle; - - css::uno::WeakReference< css::sdbcx::XTablesSupplier> - m_xCatalog; - css::uno::WeakReference< css::sdbc::XDatabaseMetaData > - m_xMetaData; - /** Statements owned by this connection. */ - OWeakRefArray m_aStatements; - - /// @throws css::sdbc::SQLException - void buildTypeInfo(); - - /** - * Creates a new transaction with the desired parameters, if - * necessary discarding an existing transaction. This has to be done - * anytime we change the transaction isolation, or autocommitting. - * - * @throws css::sdbc::SQLException - */ - void setupTransaction(); - void disposeStatements(); - - public: - explicit Connection(); - virtual ~Connection() override; - - /// @throws css::sdbc::SQLException - /// @throws css::uno::RuntimeException - void construct( const OUString& url, - const css::uno::Sequence< css::beans::PropertyValue >& info); - - const OUString& getConnectionURL() const {return m_sConnectionURL;} - bool isEmbedded() const {return m_bIsEmbedded;} - isc_db_handle& getDBHandle() {return m_aDBHandle;} - /// @throws css::sdbc::SQLException - isc_tr_handle& getTransaction(); - - /** - * Must be called anytime the underlying database is likely to have - * changed. - * - * This is used to notify the database document of any changes, so - * that the user is informed of any pending changes needing to be - * saved. - */ - void notifyDatabaseModified(); - - /** - * Create a new Blob tied to this connection. Blobs are tied to a - * transaction and not to a statement, hence the connection should - * deal with their management. - * - * @throws css::sdbc::SQLException - * @throws css::uno::RuntimeException - */ - css::uno::Reference< css::sdbc::XBlob> - createBlob(ISC_QUAD const * pBlobID); - /// @throws css::sdbc::SQLException - /// @throws css::uno::RuntimeException - css::uno::Reference< css::sdbc::XClob> - createClob(ISC_QUAD const * pBlobID); - - /** - * Create and/or connect to the sdbcx Catalog. This is completely - * unrelated to the SQL "Catalog". - */ - css::uno::Reference< css::sdbcx::XTablesSupplier > - createCatalog(); - - // OComponentHelper - virtual void SAL_CALL disposing() override; - - // XServiceInfo - DECLARE_SERVICE_INFO(); - // XUnoTunnel - virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence<sal_Int8>& rId) override; - static css::uno::Sequence<sal_Int8> getUnoTunnelId(); - // XConnection - virtual css::uno::Reference< css::sdbc::XStatement > SAL_CALL createStatement( ) override; - virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const OUString& sql ) override; - virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareCall( const OUString& sql ) override; - virtual OUString SAL_CALL nativeSQL( const OUString& sql ) override; - virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) override; - virtual sal_Bool SAL_CALL getAutoCommit( ) override; - virtual void SAL_CALL commit( ) override; - virtual void SAL_CALL rollback( ) override; - virtual sal_Bool SAL_CALL isClosed( ) override; - virtual css::uno::Reference< css::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) override; - virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) override; - virtual sal_Bool SAL_CALL isReadOnly( ) override; - virtual void SAL_CALL setCatalog( const OUString& catalog ) override; - virtual OUString SAL_CALL getCatalog( ) override; - virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) override; - virtual sal_Int32 SAL_CALL getTransactionIsolation( ) override; - virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTypeMap( ) override; - virtual void SAL_CALL setTypeMap( const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; - // XCloseable - virtual void SAL_CALL close( ) override; - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - // XDocumentEventListener - virtual void SAL_CALL documentEventOccured( const css::document::DocumentEvent& Event ) override; - // css.lang.XEventListener - virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; - - }; + + typedef std::vector< ::connectivity::OTypeInfo> TTypeInfoVector; + typedef std::vector< css::uno::WeakReferenceHelper > OWeakRefArray; + + class Connection final : public Connection_BASE + { + ::osl::Mutex m_aMutex; + + TTypeInfoVector m_aTypeInfo; // vector containing an entry + // for each row returned by + // DatabaseMetaData.getTypeInfo. + + /** The URL passed to us when opening, i.e. of the form sdbc:* */ + OUString m_sConnectionURL; + /** + * The URL passed to firebird, i.e. either a local file (for a + * temporary .fdb extracted from a .odb or a normal local file) or + * a remote url. + */ + OUString m_sFirebirdURL; + + /* EMBEDDED MODE DATA */ + /** Denotes that we have a database stored within a .odb file. */ + bool m_bIsEmbedded; + + /** + * Handle for the parent DatabaseDocument. We need to notify this + * whenever any data is written to our temporary database so that + * the user is able to save this back to the .odb file. + * + * Note that this is ONLY set in embedded mode. + */ + css::uno::Reference< css::util::XModifiable > + m_xParentDocument; + + /** + * Handle for the folder within the .odb where we store our .fbk + * (Only used if m_bIsEmbedded is true). + */ + css::uno::Reference< css::embed::XStorage > + m_xEmbeddedStorage; + /** + * The temporary folder where we extract the .fbk from a .odb, + * and also store the temporary .fdb + * It is only valid if m_bIsEmbedded is true. + * + * The extracted .fbk is written in firebird.fbk, the temporary + * .fdb is stored as firebird.fdb. + */ + std::unique_ptr< ::utl::TempFileNamed > m_pDatabaseFileDir; + /** + * Path for our extracted .fbk file. + * + * (The temporary .fdb is our m_sFirebirdURL.) + */ + OUString m_sFBKPath; + + void loadDatabaseFile(const OUString& pSrcLocation, const OUString& pTmpLocation); + + /** + * Run the backup service, use nAction = + * isc_action_svc_backup to backup, nAction = isc_action_svc_restore + * to restore. + */ + void runBackupService(const short nAction); + + isc_svc_handle attachServiceManager(); + + void detachServiceManager(isc_svc_handle pServiceHandle); + + /** We are using an external (local) file */ + bool m_bIsFile; + + /* CONNECTION PROPERTIES */ + bool m_bIsAutoCommit; + bool m_bIsReadOnly; + sal_Int32 m_aTransactionIsolation; + + isc_db_handle m_aDBHandle; + isc_tr_handle m_aTransactionHandle; + + unotools::WeakReference< Catalog > + m_xCatalog; + unotools::WeakReference< ODatabaseMetaData > + m_xMetaData; + /** Statements owned by this connection. */ + OWeakRefArray m_aStatements; + + /// @throws css::sdbc::SQLException + void buildTypeInfo(); + + /** + * Creates a new transaction with the desired parameters, if + * necessary discarding an existing transaction. This has to be done + * anytime we change the transaction isolation, or autocommitting. + * + * @throws css::sdbc::SQLException + */ + void setupTransaction(); + void disposeStatements(); + + public: + explicit Connection(); + virtual ~Connection() override; + + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + void construct( const OUString& url, + const css::uno::Sequence< css::beans::PropertyValue >& info); + + const OUString& getConnectionURL() const {return m_sConnectionURL;} + bool isEmbedded() const {return m_bIsEmbedded;} + isc_db_handle& getDBHandle() {return m_aDBHandle;} + /// @throws css::sdbc::SQLException + isc_tr_handle& getTransaction(); + + /** + * Create a new Blob tied to this connection. Blobs are tied to a + * transaction and not to a statement, hence the connection should + * deal with their management. + * + * @throws css::sdbc::SQLException + * @throws css::uno::RuntimeException + */ + css::uno::Reference< css::sdbc::XBlob> + createBlob(ISC_QUAD const * pBlobID); + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + css::uno::Reference< css::sdbc::XClob> + createClob(ISC_QUAD const * pBlobID); + + /** + * Create and/or connect to the sdbcx Catalog. This is completely + * unrelated to the SQL "Catalog". + */ + css::uno::Reference< css::sdbcx::XTablesSupplier > + createCatalog(); + + /** + * Backup and store embedded extracted database to the .odb file + */ + void storeDatabase(); + + // OComponentHelper + virtual void SAL_CALL disposing() override; + + // XServiceInfo + DECLARE_SERVICE_INFO(); + // XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence<sal_Int8>& rId) override; + static const css::uno::Sequence<sal_Int8> & getUnoTunnelId(); + // XConnection + virtual css::uno::Reference< css::sdbc::XStatement > SAL_CALL createStatement( ) override; + virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const OUString& sql ) override; + virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareCall( const OUString& sql ) override; + virtual OUString SAL_CALL nativeSQL( const OUString& sql ) override; + virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) override; + virtual sal_Bool SAL_CALL getAutoCommit( ) override; + virtual void SAL_CALL commit( ) override; + virtual void SAL_CALL rollback( ) override; + virtual sal_Bool SAL_CALL isClosed( ) override; + virtual css::uno::Reference< css::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) override; + virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) override; + virtual sal_Bool SAL_CALL isReadOnly( ) override; + virtual void SAL_CALL setCatalog( const OUString& catalog ) override; + virtual OUString SAL_CALL getCatalog( ) override; + virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) override; + virtual sal_Int32 SAL_CALL getTransactionIsolation( ) override; + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTypeMap( ) override; + virtual void SAL_CALL setTypeMap( const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; + // XCloseable + virtual void SAL_CALL close( ) override; + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + // XDocumentEventListener + virtual void SAL_CALL documentEventOccured( const css::document::DocumentEvent& Event ) override; + // css.lang.XEventListener + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + }; } diff --git a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx index f63468f0813f..948a39861d29 100644 --- a/connectivity/source/drivers/firebird/DatabaseMetaData.cxx +++ b/connectivity/source/drivers/firebird/DatabaseMetaData.cxx @@ -221,7 +221,7 @@ sal_Bool SAL_CALL ODatabaseMetaData::doesMaxRowSizeIncludeBlobs( ) // Only quoted identifiers are case sensitive, unquoted are case insensitive OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { - return "\""; + return u"\""_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseQuotedIdentifiers( ) @@ -600,7 +600,7 @@ OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion( ) { uno::Reference< XStatement > xSelect = m_pConnection->createStatement(); - uno::Reference< XResultSet > xRs = xSelect->executeQuery("SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') as version from rdb$database"); + uno::Reference< XResultSet > xRs = xSelect->executeQuery(u"SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') as version from rdb$database"_ustr); (void)xRs->next(); // first and only row uno::Reference< XRow > xRow( xRs, UNO_QUERY_THROW ); return xRow->getString(1); @@ -608,7 +608,7 @@ OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion( ) OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName( ) { - return "Firebird (engine12)"; + return u"Firebird (engine12)"_ustr; } OUString SAL_CALL ODatabaseMetaData::getProcedureTerm( ) @@ -638,15 +638,15 @@ OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape( ) OUString SAL_CALL ODatabaseMetaData::getStringFunctions( ) { - return "ASCII_CHAR,ASCII_VAL,BIT_LENGTH,CHAR_LENGTH,CHAR_TO_UUID,CHARACTER_LENGTH," + return u"ASCII_CHAR,ASCII_VAL,BIT_LENGTH,CHAR_LENGTH,CHAR_TO_UUID,CHARACTER_LENGTH," "GEN_UUID,HASH,LEFT,LOWER,LPAD,OCTET_LENGTH,OVERLAY,POSITION,REPLACE,REVERSE," - "RIGHT,RPAD,SUBSTRING,TRIM,UPPER,UUID_TO_CHAR"; + "RIGHT,RPAD,SUBSTRING,TRIM,UPPER,UUID_TO_CHAR"_ustr; } OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions( ) { - return "CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,DATEADD, DATEDIFF," - "EXTRACT,'NOW','TODAY','TOMORROW','YESTERDAY'"; + return u"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,DATEADD, DATEDIFF," + "EXTRACT,'NOW','TODAY','TOMORROW','YESTERDAY'"_ustr; } OUString SAL_CALL ODatabaseMetaData::getSystemFunctions( ) @@ -656,9 +656,9 @@ OUString SAL_CALL ODatabaseMetaData::getSystemFunctions( ) OUString SAL_CALL ODatabaseMetaData::getNumericFunctions( ) { - return "ABS,ACOS,ASIN,ATAN,ATAN2,BIN_AND,BIN_NOT,BIN_OR,BIN_SHL," + return u"ABS,ACOS,ASIN,ATAN,ATAN2,BIN_AND,BIN_NOT,BIN_OR,BIN_SHL," "BIN_SHR,BIN_XOR,CEIL,CEILING,COS,COSH,COT,EXP,FLOOR,LN," - "LOG,LOG10,MOD,PI,POWER,RAND,ROUND,SIGN,SIN,SINH,SQRT,TAN,TANH,TRUNC"; + "LOG,LOG10,MOD,PI,POWER,RAND,ROUND,SIGN,SIN,SINH,SQRT,TAN,TANH,TRUNC"_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar( ) @@ -774,6 +774,192 @@ uno::Reference< XConnection > SAL_CALL ODatabaseMetaData::getConnection() return m_pConnection; } +::css::uno::Sequence< ::css::beans::PropertyValue > SAL_CALL ODatabaseMetaData::getConnectionInfo() +{ + // TODO IMPLEMENT + return Sequence< ::css::beans::PropertyValue >(); +} + +sal_Bool SAL_CALL ODatabaseMetaData::autoCommitFailureClosesAllResultSets() +{ + // TODO IMPLEMENT + return false; +} + +sal_Bool SAL_CALL ODatabaseMetaData::generatedKeyAlwaysReturned() +{ + // TODO IMPLEMENT + return false; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getAttributes( const ::rtl::OUString& /* catalog */, + const ::rtl::OUString& /* schemaPattern */, + const ::rtl::OUString& /* typeNamePattern */, + const ::rtl::OUString& /* attributeNamePattern */) +{ + // TODO IMPLEMENT + return nullptr; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getClientInfoProperties() +{ + // TODO IMPLEMENT + return nullptr; +} + +::sal_Int32 SAL_CALL ODatabaseMetaData::getDatabaseMajorVersion() +{ + // TODO IMPLEMENT + return 0; +} + +::sal_Int32 SAL_CALL ODatabaseMetaData::getDatabaseMinorVersion() +{ + // TODO IMPLEMENT + return 0; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getFunctions( const ::rtl::OUString& /* catalog */, const ::rtl::OUString& /* schemaPattern */, const ::rtl::OUString& functionNamePattern ) +{ + OUString strQuery( + "SELECT " + " null as FUNCTION_CAT," + "RDB$FUNCTION_NAME as FUNCTION_NAME," + "RDB$DESCRIPTION as REMARKS," + "cast(null as blob sub_type text) as JB_FUNCTION_SOURCE," + "'UDF' as JB_FUNCTION_KIND," + "trim(trailing from RDB$MODULE_NAME) as JB_MODULE_NAME," + "trim(trailing from RDB$ENTRYPOINT) as JB_ENTRYPOINT," + "cast(null as varchar(255)) as JB_ENGINE_NAME " + "FROM RDB$FUNCTIONS " + "WHERE RDB$FUNCTION_NAME = '" + functionNamePattern + "'"); + + uno::Reference< XStatement > statement = m_pConnection->createStatement(); + uno::Reference< XResultSet > rs = statement->executeQuery(strQuery); + return rs; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getFunctionColumns( const ::rtl::OUString& /* catalog */, const ::rtl::OUString& /* schemaPattern */, const ::rtl::OUString& /* functionNamePattern */, const ::rtl::OUString& /* columnNamePattern */ ) +{ + // TODO IMPLEMENT + return nullptr; +} + +::sal_Int32 SAL_CALL ODatabaseMetaData::getMaxLogicalLobSize() +{ + // TODO IMPLEMENT + return 0; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPseudoColumns( const ::rtl::OUString& /* catalog */, + const ::rtl::OUString& /* schemaPattern */, + const ::rtl::OUString& /* tableNamePattern */, + const ::rtl::OUString& /* columnNamePattern */) +{ + // TODO IMPLEMENT + return nullptr; +} + +::sal_Int32 SAL_CALL ODatabaseMetaData::getResultSetHoldability() +{ + // TODO IMPLEMENT + return 0; +} + +::sal_Int32 SAL_CALL ODatabaseMetaData::getRowIdLifetime() +{ + // TODO IMPLEMENT + return 0; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSchemasFiltered( const ::css::beans::Optional< ::rtl::OUString >& /* catalog */, + const ::css::beans::Optional< ::rtl::OUString >& /* schemaPattern */) +{ + // TODO IMPLEMENT + return nullptr; +} + +::sal_Int32 SAL_CALL ODatabaseMetaData::getSQLStateType() +{ + // TODO IMPLEMENT + return 0; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSuperTables( const ::rtl::OUString& /* catalog */, + const ::rtl::OUString& /* schemaPattern */, const ::rtl::OUString& /* tableNamePattern */) +{ + // TODO IMPLEMENT + return nullptr; +} + +uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSuperTypes( const ::rtl::OUString& /* catalog */, + const ::rtl::OUString& /* schemaPattern */, + const ::rtl::OUString& /* typeNamePattern */) +{ + // TODO IMPLEMENT + return nullptr; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::locatorsUpdateCopy() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsConvertInGeneral() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsGetGeneratedKeys() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleOpenResults() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsNamedParameters() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsRefCursors() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsSavepoints() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsSharding() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsStatementPooling() +{ + // TODO IMPLEMENT + return false; +} + +::sal_Bool SAL_CALL ODatabaseMetaData::supportsStoredFunctionsUsingCallSyntax() +{ + // TODO IMPLEMENT + return false; +} + // here follow all methods which return a resultset // the first methods is an example implementation how to use this resultset // of course you could implement it on your and you should do this because @@ -792,13 +978,13 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTableTypes( ) // TODO Put these statics to one place // like postgreSQL's Statics class. - aRow[1] = new ORowSetValueDecorator(OUString("TABLE")); + aRow[1] = new ORowSetValueDecorator(u"TABLE"_ustr); aResults.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("VIEW")); + aRow[1] = new ORowSetValueDecorator(u"VIEW"_ustr); aResults.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("SYSTEM TABLE")); + aRow[1] = new ORowSetValueDecorator(u"SYSTEM TABLE"_ustr); aResults.push_back(aRow); pResultSet->setRows(std::move(aResults)); @@ -821,14 +1007,14 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() // Common data aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); // Literal quote marks aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); // Literal quote marks - aRow[7] = new ORowSetValueDecorator(true); // Nullable - aRow[8] = new ORowSetValueDecorator(true); // Case sensitive - aRow[10] = new ORowSetValueDecorator(false); // Is unsigned + aRow[7] = new ORowSetValueDecorator(ORowSetValue(true)); // Nullable + aRow[8] = new ORowSetValueDecorator(ORowSetValue(true)); // Case sensitive + aRow[10] = new ORowSetValueDecorator(ORowSetValue(false)); // Is unsigned // FIXED_PREC_SCALE: docs state "can it be a money value? " however // in reality this causes Base to treat all numbers as money formatted // by default which is wrong (and formatting as money value is still // possible for all values). - aRow[11] = new ORowSetValueDecorator(false); + aRow[11] = new ORowSetValueDecorator(ORowSetValue(false)); // Localised Type Name -- TODO: implement (but can be null): aRow[13] = new ORowSetValueDecorator(); aRow[16] = new ORowSetValueDecorator(); // Unused @@ -836,25 +1022,25 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() aRow[18] = new ORowSetValueDecorator(sal_Int16(10));// Radix // Char - aRow[1] = new ORowSetValueDecorator(OUString("CHAR")); + aRow[1] = new ORowSetValueDecorator(u"CHAR"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::CHAR); aRow[3] = new ORowSetValueDecorator(sal_Int16(32765)); // Prevision = max length - aRow[6] = new ORowSetValueDecorator(OUString("length")); // Create Params + aRow[6] = new ORowSetValueDecorator(u"length"_ustr); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); // Varchar - aRow[1] = new ORowSetValueDecorator(OUString("VARCHAR")); + aRow[1] = new ORowSetValueDecorator(u"VARCHAR"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::VARCHAR); aRow[3] = new ORowSetValueDecorator(sal_Int16(32765)); // Prevision = max length - aRow[6] = new ORowSetValueDecorator(OUString("length")); // Create Params + aRow[6] = new ORowSetValueDecorator(u"length"_ustr); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); @@ -863,10 +1049,10 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() // to fool LO into seeing it as different types. // It is distinguished from Text type by its character set OCTETS; // that will be added by Tables::createStandardColumnPart - aRow[1] = new ORowSetValueDecorator(OUString("CHARACTER")); + aRow[1] = new ORowSetValueDecorator(u"CHARACTER"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::BINARY); aRow[3] = new ORowSetValueDecorator(sal_Int16(32765)); // Prevision = max length - aRow[6] = new ORowSetValueDecorator(OUString("length")); // Create Params + aRow[6] = new ORowSetValueDecorator(u"length"_ustr); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::NONE)); // Searchable aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale @@ -874,21 +1060,21 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() tmp.push_back(aRow); // Varbinary (VARCHAR); see comment above about BINARY - aRow[1] = new ORowSetValueDecorator(OUString("CHARACTER VARYING")); + aRow[1] = new ORowSetValueDecorator(u"CHARACTER VARYING"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::VARBINARY); aRow[3] = new ORowSetValueDecorator(sal_Int16(32765)); // Prevision = max length - aRow[6] = new ORowSetValueDecorator(OUString("length")); // Create Params + aRow[6] = new ORowSetValueDecorator(u"length"_ustr); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::NONE)); // Searchable // Clob (SQL_BLOB) - aRow[1] = new ORowSetValueDecorator(OUString("BLOB SUB_TYPE TEXT")); // BLOB, with subtype 1 + aRow[1] = new ORowSetValueDecorator(u"BLOB SUB_TYPE TEXT"_ustr); // BLOB, with subtype 1 aRow[2] = new ORowSetValueDecorator(DataType::CLOB); aRow[3] = new ORowSetValueDecorator(sal_Int32(2147483647)); // Precision = max length aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); @@ -904,22 +1090,22 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(true); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(true)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale } // Smallint (SQL_SHORT) - aRow[1] = new ORowSetValueDecorator(OUString("SMALLINT")); + aRow[1] = new ORowSetValueDecorator(u"SMALLINT"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::SMALLINT); aRow[3] = new ORowSetValueDecorator(sal_Int16(5)); // Prevision tmp.push_back(aRow); // Integer (SQL_LONG) - aRow[1] = new ORowSetValueDecorator(OUString("INTEGER")); + aRow[1] = new ORowSetValueDecorator(u"INTEGER"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::INTEGER); aRow[3] = new ORowSetValueDecorator(sal_Int16(10)); // Precision tmp.push_back(aRow); // Bigint (SQL_INT64) - aRow[1] = new ORowSetValueDecorator(OUString("BIGINT")); + aRow[1] = new ORowSetValueDecorator(u"BIGINT"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::BIGINT); aRow[3] = new ORowSetValueDecorator(sal_Int16(20)); // Precision tmp.push_back(aRow); @@ -928,19 +1114,19 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() { aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(true); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(true)); // Autoincrement } - aRow[6] = new ORowSetValueDecorator(OUString("PRECISION,SCALE")); // Create params + aRow[6] = new ORowSetValueDecorator(u"PRECISION,SCALE"_ustr); // Create params // Numeric - aRow[1] = new ORowSetValueDecorator(OUString("NUMERIC")); + aRow[1] = new ORowSetValueDecorator(u"NUMERIC"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::NUMERIC); aRow[3] = new ORowSetValueDecorator(sal_Int16(18)); // Precision aRow[14] = new ORowSetValueDecorator(sal_Int16(0)); // Minimum scale aRow[15] = new ORowSetValueDecorator(sal_Int16(18)); // Max scale tmp.push_back(aRow); // Decimal - aRow[1] = new ORowSetValueDecorator(OUString("DECIMAL")); + aRow[1] = new ORowSetValueDecorator(u"DECIMAL"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); aRow[3] = new ORowSetValueDecorator(sal_Int16(18)); // Precision aRow[14] = new ORowSetValueDecorator(sal_Int16(0)); // Minimum scale @@ -949,14 +1135,14 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() aRow[6] = new ORowSetValueDecorator(); // Create Params // Float (SQL_FLOAT) - aRow[1] = new ORowSetValueDecorator(OUString("FLOAT")); + aRow[1] = new ORowSetValueDecorator(u"FLOAT"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::FLOAT); aRow[3] = new ORowSetValueDecorator(sal_Int16(7)); // Precision aRow[14] = new ORowSetValueDecorator(sal_Int16(1)); // Minimum scale aRow[15] = new ORowSetValueDecorator(sal_Int16(7)); // Max scale tmp.push_back(aRow); // Double (SQL_DOUBLE) - aRow[1] = new ORowSetValueDecorator(OUString("DOUBLE PRECISION")); + aRow[1] = new ORowSetValueDecorator(u"DOUBLE PRECISION"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::DOUBLE); aRow[3] = new ORowSetValueDecorator(sal_Int16(15)); // Precision aRow[14] = new ORowSetValueDecorator(sal_Int16(1)); // Minimum scale @@ -966,66 +1152,67 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo() // TODO: no idea whether D_FLOAT corresponds to an sql type // SQL_TIMESTAMP - aRow[1] = new ORowSetValueDecorator(OUString("TIMESTAMP")); + aRow[1] = new ORowSetValueDecorator(u"TIMESTAMP"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); aRow[3] = new ORowSetValueDecorator(sal_Int32(8)); // Prevision = max length aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); // SQL_TYPE_TIME - aRow[1] = new ORowSetValueDecorator(OUString("TIME")); + aRow[1] = new ORowSetValueDecorator(u"TIME"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::TIME); aRow[3] = new ORowSetValueDecorator(sal_Int32(8)); // Prevision = max length aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); // SQL_TYPE_DATE - aRow[1] = new ORowSetValueDecorator(OUString("DATE")); + aRow[1] = new ORowSetValueDecorator(u"DATE"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::DATE); aRow[3] = new ORowSetValueDecorator(sal_Int32(8)); // Prevision = max length aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::FULL)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); // SQL_BLOB - aRow[1] = new ORowSetValueDecorator(OUString("BLOB SUB_TYPE BINARY")); + aRow[1] = new ORowSetValueDecorator(u"BLOB SUB_TYPE BINARY"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::BLOB); aRow[3] = new ORowSetValueDecorator(sal_Int32(0)); // Prevision = max length aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::NONE)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); // SQL_BOOLEAN - aRow[1] = new ORowSetValueDecorator(OUString("BOOLEAN")); + aRow[1] = new ORowSetValueDecorator(u"BOOLEAN"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::BOOLEAN); aRow[3] = new ORowSetValueDecorator(sal_Int32(1)); // Prevision = max length aRow[6] = new ORowSetValueDecorator(); // Create Params aRow[9] = new ORowSetValueDecorator( sal_Int16(ColumnSearch::BASIC)); // Searchable - aRow[12] = new ORowSetValueDecorator(false); // Autoincrement + aRow[12] = new ORowSetValueDecorator(ORowSetValue(false)); // Autoincrement aRow[14] = ODatabaseMetaDataResultSet::get0Value(); // Minimum scale aRow[15] = ODatabaseMetaDataResultSet::get0Value(); // Max scale tmp.push_back(aRow); return tmp; }(); + // [-loplugin:redundantfcast] false positive: pResultSet->setRows(ODatabaseMetaDataResultSet::ORows(aResults)); return pResultSet; } @@ -1056,7 +1243,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges( "FROM RDB$USER_PRIVILEGES priv "); { - OUString sAppend = "WHERE priv.RDB$RELATION_NAME = '%' "; + OUString sAppend = u"WHERE priv.RDB$RELATION_NAME = '%' "_ustr; queryBuf.append(sAppend.replaceAll("%", sTable)); } if (!sColumnNamePattern.isEmpty()) @@ -1094,7 +1281,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges( aCurrentRow[6] = new ORowSetValueDecorator(sanitizeIdentifier(xRow->getString(3))); // 6. GRANTEE aCurrentRow[7] = new ORowSetValueDecorator(xRow->getString(4)); // 7. Privilege aCurrentRow[8] = new ORowSetValueDecorator( ( xRow->getShort(5) == 1 ) ? - OUString("YES") : OUString("NO")); // 8. Grantable + u"YES"_ustr : u"NO"_ustr); // 8. Grantable aResults.push_back(aCurrentRow); } @@ -1296,11 +1483,11 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns( // 18. Is nullable if (xRow->getShort(9)) { - aCurrentRow[18] = new ORowSetValueDecorator(OUString("NO")); + aCurrentRow[18] = new ORowSetValueDecorator(u"NO"_ustr); } else { - aCurrentRow[18] = new ORowSetValueDecorator(OUString("YES")); + aCurrentRow[18] = new ORowSetValueDecorator(u"YES"_ustr); } aResults.push_back(aCurrentRow); @@ -1339,8 +1526,10 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables( // TODO: GLOBAL TEMPORARY, LOCAL TEMPORARY, ALIAS, SYNONYM if (!types.hasElements() || (types.getLength() == 1 && types[0].match(wld))) { + // from Firebird: src/jrd/constants.h + // rel_persistent = 0, rel_view = 1, rel_external = 2 // All table types? I.e. includes system tables. - queryBuf.append("(RDB$RELATION_TYPE = 0 OR RDB$RELATION_TYPE = 1) "); + queryBuf.append("(RDB$RELATION_TYPE = 0 OR RDB$RELATION_TYPE = 1 OR RDB$RELATION_TYPE = 2) "); } else { @@ -1406,7 +1595,8 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables( } else { - if (nTableType == 0) + // see above about src/jrd/constants.h + if (nTableType == 0 || nTableType == 2) sTableType = "TABLE"; } @@ -1473,11 +1663,11 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getImportedKeys( uno::Reference< XResultSet > ODatabaseMetaData::lcl_getKeys(const bool bIsImport, std::u16string_view table ) { rtl::Reference<ODatabaseMetaDataResultSet> pResultSet = new - ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eImportedKeys); + ODatabaseMetaDataResultSet(bIsImport?ODatabaseMetaDataResultSet::eImportedKeys:ODatabaseMetaDataResultSet::eExportedKeys); uno::Reference< XStatement > statement = m_pConnection->createStatement(); - OUString sSQL = "SELECT " + OUString sSQL = u"SELECT " "RDB$REF_CONSTRAINTS.RDB$UPDATE_RULE, " // 1 update rule "RDB$REF_CONSTRAINTS.RDB$DELETE_RULE, " // 2 delete rule "RDB$REF_CONSTRAINTS.RDB$CONST_NAME_UQ, " // 3 primary or unique key name @@ -1498,7 +1688,7 @@ uno::Reference< XResultSet > ODatabaseMetaData::lcl_getKeys(const bool bIsImport "ON PRIM.RDB$INDEX_NAME = PRIMARY_INDEX.RDB$INDEX_NAME " "INNER JOIN RDB$INDEX_SEGMENTS AS FOREIGN_INDEX " "ON FOREI.RDB$INDEX_NAME = FOREIGN_INDEX.RDB$INDEX_NAME " - "WHERE FOREI.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' "; + "WHERE FOREI.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY' "_ustr; if (bIsImport) sSQL += OUString::Concat("AND FOREI.RDB$RELATION_NAME = '")+ table +"'"; else @@ -1518,11 +1708,11 @@ uno::Reference< XResultSet > ODatabaseMetaData::lcl_getKeys(const bool bIsImport aCurrentRow[6] = new ORowSetValueDecorator(); // FKTABLE_SCHEM unsupported std::map< OUString,sal_Int32> aRuleMap; - aRuleMap[ OUString("CASCADE")] = KeyRule::CASCADE; - aRuleMap[ OUString("RESTRICT")] = KeyRule::RESTRICT; - aRuleMap[ OUString("SET NULL")] = KeyRule::SET_NULL; - aRuleMap[ OUString("SET DEFAULT")] = KeyRule::SET_DEFAULT; - aRuleMap[ OUString("NO ACTION")] = KeyRule::NO_ACTION; + aRuleMap[ u"CASCADE"_ustr] = KeyRule::CASCADE; + aRuleMap[ u"RESTRICT"_ustr] = KeyRule::RESTRICT; + aRuleMap[ u"SET NULL"_ustr] = KeyRule::SET_NULL; + aRuleMap[ u"SET DEFAULT"_ustr] = KeyRule::SET_DEFAULT; + aRuleMap[ u"NO ACTION"_ustr] = KeyRule::NO_ACTION; while(rs->next()) { @@ -1564,7 +1754,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPrimaryKeys( SAL_INFO("connectivity.firebird", "getPrimaryKeys() with " "Table: " << sTable); - OUString sAppend = "WHERE constr.RDB$RELATION_NAME = '%' "; + OUString sAppend = u"WHERE constr.RDB$RELATION_NAME = '%' "_ustr; OUString sQuery = "SELECT " "constr.RDB$RELATION_NAME, " // 1. Table Name "inds.RDB$FIELD_NAME, " // 2. Column Name @@ -1676,7 +1866,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo( } // 4. NON_UNIQUE -- i.e. specifically negate here. - aCurrentRow[4] = new ORowSetValueDecorator(xRow->getShort(5) == 0); + aCurrentRow[4] = new ORowSetValueDecorator(ORowSetValue(xRow->getShort(5) == 0)); // 6. INDEX NAME aCurrentRow[6] = new ORowSetValueDecorator(sanitizeIdentifier(xRow->getString(4))); @@ -1686,9 +1876,9 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo( aCurrentRow[9] = new ORowSetValueDecorator(sanitizeIdentifier(xRow->getString(2))); // 10. ASC(ending)/DESC(ending) if (xRow->getShort(6) == 1) - aCurrentRow[10] = new ORowSetValueDecorator(OUString("D")); + aCurrentRow[10] = new ORowSetValueDecorator(u"D"_ustr); else - aCurrentRow[10] = new ORowSetValueDecorator(OUString("A")); + aCurrentRow[10] = new ORowSetValueDecorator(u"A"_ustr); // TODO: double check this^^^, doesn't seem to be officially documented anywhere. // 11. CARDINALITY aCurrentRow[11] = new ORowSetValueDecorator(sal_Int32(0)); // TODO: determine how to do this @@ -1698,7 +1888,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo( aResults.push_back(aCurrentRow); } rtl::Reference<ODatabaseMetaDataResultSet> pResultSet = new - ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::ePrimaryKeys); + ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eIndexInfo); pResultSet->setRows( std::move(aResults) ); return pResultSet; @@ -1769,7 +1959,7 @@ uno::Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges( aRow[4] = new ORowSetValueDecorator(sanitizeIdentifier(xRow->getString(2))); // 4. GRANTOR aRow[5] = new ORowSetValueDecorator(sanitizeIdentifier(xRow->getString(3))); // 5. GRANTEE aRow[6] = new ORowSetValueDecorator(xRow->getString(4)); // 6. Privilege - aRow[7] = new ORowSetValueDecorator(bool(xRow->getBoolean(5))); // 7. Is Grantable + aRow[7] = new ORowSetValueDecorator(ORowSetValue(bool(xRow->getBoolean(5)))); // 7. Is Grantable aResults.push_back(aRow); } diff --git a/connectivity/source/drivers/firebird/DatabaseMetaData.hxx b/connectivity/source/drivers/firebird/DatabaseMetaData.hxx index c577f594d245..ca6155ed4ca1 100644 --- a/connectivity/source/drivers/firebird/DatabaseMetaData.hxx +++ b/connectivity/source/drivers/firebird/DatabaseMetaData.hxx @@ -25,180 +25,211 @@ #include "Connection.hxx" -#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include <com/sun/star/sdbc/XDatabaseMetaData3.hpp> #include <cppuhelper/implbase.hxx> #include <rtl/ref.hxx> namespace connectivity::firebird +{ + + //************ Class: ODatabaseMetaData + + + typedef ::cppu::WeakImplHelper< css::sdbc::XDatabaseMetaData3> ODatabaseMetaData_BASE; + + class ODatabaseMetaData : public ODatabaseMetaData_BASE { + ::rtl::Reference<Connection> m_pConnection; + private: + css::uno::Reference< css::sdbc::XResultSet > lcl_getKeys( bool bIsImport, std::u16string_view table ); + public: + + explicit ODatabaseMetaData(Connection* _pCon); + virtual ~ODatabaseMetaData() override; + + // as I mentioned before this interface is really BIG + // XDatabaseMetaData + virtual sal_Bool SAL_CALL allProceduresAreCallable( ) override; + virtual sal_Bool SAL_CALL allTablesAreSelectable( ) override; + virtual OUString SAL_CALL getURL( ) override; + virtual OUString SAL_CALL getUserName( ) override; + virtual sal_Bool SAL_CALL isReadOnly( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedLow( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) override; + virtual OUString SAL_CALL getDatabaseProductName( ) override; + virtual OUString SAL_CALL getDatabaseProductVersion( ) override; + virtual OUString SAL_CALL getDriverName( ) override; + virtual OUString SAL_CALL getDriverVersion( ) override; + virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) override; + virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) override; + virtual sal_Bool SAL_CALL usesLocalFiles( ) override; + virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) override; + virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) override; + virtual OUString SAL_CALL getIdentifierQuoteString( ) override; + virtual OUString SAL_CALL getSQLKeywords( ) override; + virtual OUString SAL_CALL getNumericFunctions( ) override; + virtual OUString SAL_CALL getStringFunctions( ) override; + virtual OUString SAL_CALL getSystemFunctions( ) override; + virtual OUString SAL_CALL getTimeDateFunctions( ) override; + virtual OUString SAL_CALL getSearchStringEscape( ) override; + virtual OUString SAL_CALL getExtraNameCharacters( ) override; + virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) override; + virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) override; + virtual sal_Bool SAL_CALL supportsColumnAliasing( ) override; + virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) override; + virtual sal_Bool SAL_CALL supportsTypeConversion( ) override; + virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) override; + virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) override; + virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) override; + virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) override; + virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) override; + virtual sal_Bool SAL_CALL supportsGroupBy( ) override; + virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) override; + virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) override; + virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) override; + virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) override; + virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) override; + virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) override; + virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) override; + virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) override; + virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) override; + virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) override; + virtual sal_Bool SAL_CALL supportsOuterJoins( ) override; + virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) override; + virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) override; + virtual OUString SAL_CALL getSchemaTerm( ) override; + virtual OUString SAL_CALL getProcedureTerm( ) override; + virtual OUString SAL_CALL getCatalogTerm( ) override; + virtual sal_Bool SAL_CALL isCatalogAtStart( ) override; + virtual OUString SAL_CALL getCatalogSeparator( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsPositionedDelete( ) override; + virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) override; + virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) override; + virtual sal_Bool SAL_CALL supportsStoredProcedures( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) override; + virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) override; + virtual sal_Bool SAL_CALL supportsUnion( ) override; + virtual sal_Bool SAL_CALL supportsUnionAll( ) override; + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) override; + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) override; + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) override; + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) override; + virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) override; + virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) override; + virtual sal_Int32 SAL_CALL getMaxConnections( ) override; + virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxIndexLength( ) override; + virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxRowSize( ) override; + virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) override; + virtual sal_Int32 SAL_CALL getMaxStatementLength( ) override; + virtual sal_Int32 SAL_CALL getMaxStatements( ) override; + virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) override; + virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) override; + virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) override; + virtual sal_Bool SAL_CALL supportsTransactions( ) override; + virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) override; + virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) override; + virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) override; + virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) override; + virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedures( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedureColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern, const OUString& columnNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const css::uno::Sequence< OUString >& types ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getSchemas( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCatalogs( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const css::uno::Any& catalog, const OUString& schema, const OUString& table, const OUString& columnNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTablePrivileges( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Int32 scope, sal_Bool nullable ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getVersionColumns( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getImportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getExportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCrossReference( const css::uno::Any& primaryCatalog, const OUString& primarySchema, const OUString& primaryTable, const css::uno::Any& foreignCatalog, const OUString& foreignSchema, const OUString& foreignTable ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTypeInfo( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getIndexInfo( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Bool unique, sal_Bool approximate ) override; + virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) override; + virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL supportsBatchUpdates( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& typeNamePattern, const css::uno::Sequence< sal_Int32 >& types ) override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; + + // XDatabaseMetaData2 + virtual ::css::uno::Sequence< ::css::beans::PropertyValue > SAL_CALL getConnectionInfo() override; - //************ Class: ODatabaseMetaData - - - typedef ::cppu::WeakImplHelper< css::sdbc::XDatabaseMetaData> ODatabaseMetaData_BASE; - - class ODatabaseMetaData : public ODatabaseMetaData_BASE - { - ::rtl::Reference<Connection> m_pConnection; - private: - css::uno::Reference< css::sdbc::XResultSet > lcl_getKeys( bool bIsImport, std::u16string_view table ); - public: - - explicit ODatabaseMetaData(Connection* _pCon); - virtual ~ODatabaseMetaData() override; - - // as I mentioned before this interface is really BIG - // XDatabaseMetaData - virtual sal_Bool SAL_CALL allProceduresAreCallable( ) override; - virtual sal_Bool SAL_CALL allTablesAreSelectable( ) override; - virtual OUString SAL_CALL getURL( ) override; - virtual OUString SAL_CALL getUserName( ) override; - virtual sal_Bool SAL_CALL isReadOnly( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedLow( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) override; - virtual OUString SAL_CALL getDatabaseProductName( ) override; - virtual OUString SAL_CALL getDatabaseProductVersion( ) override; - virtual OUString SAL_CALL getDriverName( ) override; - virtual OUString SAL_CALL getDriverVersion( ) override; - virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) override; - virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) override; - virtual sal_Bool SAL_CALL usesLocalFiles( ) override; - virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) override; - virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) override; - virtual OUString SAL_CALL getIdentifierQuoteString( ) override; - virtual OUString SAL_CALL getSQLKeywords( ) override; - virtual OUString SAL_CALL getNumericFunctions( ) override; - virtual OUString SAL_CALL getStringFunctions( ) override; - virtual OUString SAL_CALL getSystemFunctions( ) override; - virtual OUString SAL_CALL getTimeDateFunctions( ) override; - virtual OUString SAL_CALL getSearchStringEscape( ) override; - virtual OUString SAL_CALL getExtraNameCharacters( ) override; - virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) override; - virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) override; - virtual sal_Bool SAL_CALL supportsColumnAliasing( ) override; - virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) override; - virtual sal_Bool SAL_CALL supportsTypeConversion( ) override; - virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) override; - virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) override; - virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) override; - virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) override; - virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) override; - virtual sal_Bool SAL_CALL supportsGroupBy( ) override; - virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) override; - virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) override; - virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) override; - virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) override; - virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) override; - virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) override; - virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) override; - virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) override; - virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) override; - virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) override; - virtual sal_Bool SAL_CALL supportsOuterJoins( ) override; - virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) override; - virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) override; - virtual OUString SAL_CALL getSchemaTerm( ) override; - virtual OUString SAL_CALL getProcedureTerm( ) override; - virtual OUString SAL_CALL getCatalogTerm( ) override; - virtual sal_Bool SAL_CALL isCatalogAtStart( ) override; - virtual OUString SAL_CALL getCatalogSeparator( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsPositionedDelete( ) override; - virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) override; - virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) override; - virtual sal_Bool SAL_CALL supportsStoredProcedures( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) override; - virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) override; - virtual sal_Bool SAL_CALL supportsUnion( ) override; - virtual sal_Bool SAL_CALL supportsUnionAll( ) override; - virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) override; - virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) override; - virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) override; - virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) override; - virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) override; - virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) override; - virtual sal_Int32 SAL_CALL getMaxConnections( ) override; - virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxIndexLength( ) override; - virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxRowSize( ) override; - virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) override; - virtual sal_Int32 SAL_CALL getMaxStatementLength( ) override; - virtual sal_Int32 SAL_CALL getMaxStatements( ) override; - virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) override; - virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) override; - virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) override; - virtual sal_Bool SAL_CALL supportsTransactions( ) override; - virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) override; - virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) override; - virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) override; - virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) override; - virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedures( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedureColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern, const OUString& columnNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const css::uno::Sequence< OUString >& types ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getSchemas( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCatalogs( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const css::uno::Any& catalog, const OUString& schema, const OUString& table, const OUString& columnNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTablePrivileges( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Int32 scope, sal_Bool nullable ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getVersionColumns( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getImportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getExportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCrossReference( const css::uno::Any& primaryCatalog, const OUString& primarySchema, const OUString& primaryTable, const css::uno::Any& foreignCatalog, const OUString& foreignSchema, const OUString& foreignTable ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTypeInfo( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getIndexInfo( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Bool unique, sal_Bool approximate ) override; - virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) override; - virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL supportsBatchUpdates( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& typeNamePattern, const css::uno::Sequence< sal_Int32 >& types ) override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; - }; + // XDatabaseMetaData3 + virtual sal_Bool SAL_CALL autoCommitFailureClosesAllResultSets() override; + virtual sal_Bool SAL_CALL generatedKeyAlwaysReturned() override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getAttributes( const ::rtl::OUString& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& typeNamePattern, const ::rtl::OUString& attributeNamePattern ) override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getClientInfoProperties() override; + virtual ::sal_Int32 SAL_CALL getDatabaseMajorVersion() override; + virtual ::sal_Int32 SAL_CALL getDatabaseMinorVersion() override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getFunctions( const ::rtl::OUString& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& functionNamePattern ) override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getFunctionColumns( const ::rtl::OUString& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& functionNamePattern, const ::rtl::OUString& columnNamePattern ) override; + virtual ::sal_Int32 SAL_CALL getMaxLogicalLobSize() override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getPseudoColumns( const ::rtl::OUString& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::rtl::OUString& columnNamePattern ) override; + virtual ::sal_Int32 SAL_CALL getResultSetHoldability() override; + virtual ::sal_Int32 SAL_CALL getRowIdLifetime() override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getSchemasFiltered( const ::css::beans::Optional< ::rtl::OUString >& catalog, const ::css::beans::Optional< ::rtl::OUString >& schemaPattern ) override; + virtual ::sal_Int32 SAL_CALL getSQLStateType() override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getSuperTables( const ::rtl::OUString& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern ) override; + virtual ::css::uno::Reference< ::css::sdbc::XResultSet > SAL_CALL getSuperTypes( const ::rtl::OUString& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& typeNamePattern ) override; + virtual ::sal_Bool SAL_CALL locatorsUpdateCopy() override; + virtual ::sal_Bool SAL_CALL supportsConvertInGeneral() override; + virtual ::sal_Bool SAL_CALL supportsGetGeneratedKeys() override; + virtual ::sal_Bool SAL_CALL supportsMultipleOpenResults() override; + virtual ::sal_Bool SAL_CALL supportsNamedParameters() override; + virtual ::sal_Bool SAL_CALL supportsRefCursors() override; + virtual ::sal_Bool SAL_CALL supportsSavepoints() override; + virtual ::sal_Bool SAL_CALL supportsSharding() override; + virtual ::sal_Bool SAL_CALL supportsStatementPooling() override; + virtual ::sal_Bool SAL_CALL supportsStoredFunctionsUsingCallSyntax() override; + }; } diff --git a/connectivity/source/drivers/firebird/Driver.cxx b/connectivity/source/drivers/firebird/Driver.cxx index c9dc6155d0e0..0879a7eca310 100644 --- a/connectivity/source/drivers/firebird/Driver.cxx +++ b/connectivity/source/drivers/firebird/Driver.cxx @@ -31,7 +31,6 @@ #include <osl/process.h> #include <rtl/bootstrap.hxx> #include <sal/log.hxx> -#include <unotools/localfilehelper.hxx> using namespace com::sun::star; using namespace com::sun::star::uno; @@ -46,11 +45,11 @@ using namespace connectivity::firebird; // Static const variables namespace { -constexpr OUStringLiteral our_sFirebirdTmpVar = u"FIREBIRD_TMP"; -constexpr OUStringLiteral our_sFirebirdLockVar = u"FIREBIRD_LOCK"; -constexpr OUStringLiteral our_sFirebirdMsgVar = u"FIREBIRD_MSG"; +constexpr OUString our_sFirebirdTmpVar = u"FIREBIRD_TMP"_ustr; +constexpr OUString our_sFirebirdLockVar = u"FIREBIRD_LOCK"_ustr; +constexpr OUString our_sFirebirdMsgVar = u"FIREBIRD_MSG"_ustr; #ifdef MACOSX -constexpr OUStringLiteral our_sFirebirdLibVar = u"LIBREOFFICE_FIREBIRD_LIB"; +constexpr OUString our_sFirebirdLibVar = u"LIBREOFFICE_FIREBIRD_LIB"_ustr; #endif }; @@ -67,19 +66,19 @@ FirebirdDriver::FirebirdDriver(const css::uno::Reference< css::uno::XComponentCo m_firebirdLockDirectory.EnableKillingFile(true); // Overrides firebird's default of /tmp or c:\temp - osl_setEnvironment(OUString(our_sFirebirdTmpVar).pData, m_firebirdTMPDirectory.GetFileName().pData); + osl_setEnvironment(our_sFirebirdTmpVar.pData, m_firebirdTMPDirectory.GetFileName().pData); // Overrides firebird's default of /tmp/firebird or c:\temp\firebird - osl_setEnvironment(OUString(our_sFirebirdLockVar).pData, m_firebirdLockDirectory.GetFileName().pData); + osl_setEnvironment(our_sFirebirdLockVar.pData, m_firebirdLockDirectory.GetFileName().pData); #ifndef SYSTEM_FIREBIRD // Overrides firebird's hardcoded default of /usr/local/firebird on *nix, // however on Windows it seems to use the current directory as a default. - OUString sMsgURL("$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/firebird"); + OUString sMsgURL(u"$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/firebird"_ustr); ::rtl::Bootstrap::expandMacros(sMsgURL); OUString sMsgPath; ::osl::FileBase::getSystemPathFromFileURL(sMsgURL, sMsgPath); - osl_setEnvironment(OUString(our_sFirebirdMsgVar).pData, sMsgPath.pData); + osl_setEnvironment(our_sFirebirdMsgVar.pData, sMsgPath.pData); #ifdef MACOSX // Set an env. variable to specify library location // for dlopen used in fbclient. @@ -87,7 +86,7 @@ FirebirdDriver::FirebirdDriver(const css::uno::Reference< css::uno::XComponentCo ::rtl::Bootstrap::expandMacros(sLibURL); OUString sLibPath; ::osl::FileBase::getSystemPathFromFileURL(sLibURL, sLibPath); - osl_setEnvironment(OUString(our_sFirebirdLibVar).pData, sLibPath.pData); + osl_setEnvironment(our_sFirebirdLibVar.pData, sLibPath.pData); #endif /*MACOSX*/ #endif /*!SYSTEM_FIREBIRD*/ } @@ -100,30 +99,30 @@ void FirebirdDriver::disposing() for (auto const& elem : m_xConnections) { - Reference< XComponent > xComp(elem.get(), UNO_QUERY); + rtl::Reference< Connection > xComp(elem.get()); if (xComp.is()) xComp->dispose(); } m_xConnections.clear(); - osl_clearEnvironment(OUString(our_sFirebirdTmpVar).pData); - osl_clearEnvironment(OUString(our_sFirebirdLockVar).pData); + osl_clearEnvironment(our_sFirebirdTmpVar.pData); + osl_clearEnvironment(our_sFirebirdLockVar.pData); #ifndef SYSTEM_FIREBIRD - osl_clearEnvironment(OUString(our_sFirebirdMsgVar).pData); + osl_clearEnvironment(our_sFirebirdMsgVar.pData); #ifdef MACOSX - osl_clearEnvironment(OUString(our_sFirebirdLibVar).pData); + osl_clearEnvironment(our_sFirebirdLibVar.pData); #endif /*MACOSX*/ #endif /*!SYSTEM_FIREBIRD*/ - OSL_VERIFY(fb_shutdown(0, 1)); + OSL_VERIFY(fb_shutdown(0, 1) == 0); ODriver_BASE::disposing(); } OUString SAL_CALL FirebirdDriver::getImplementationName() { - return "com.sun.star.comp.sdbc.firebird.Driver"; + return u"com.sun.star.comp.sdbc.firebird.Driver"_ustr; } sal_Bool SAL_CALL FirebirdDriver::supportsService(const OUString& _rServiceName) @@ -133,7 +132,7 @@ sal_Bool SAL_CALL FirebirdDriver::supportsService(const OUString& _rServiceName) Sequence< OUString > SAL_CALL FirebirdDriver::getSupportedServiceNames() { - return { "com.sun.star.sdbc.Driver", "com.sun.star.sdbcx.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr, u"com.sun.star.sdbcx.Driver"_ustr }; } // ---- XDriver ------------------------------------------------------------- @@ -152,7 +151,7 @@ Reference< XConnection > SAL_CALL FirebirdDriver::connect( rtl::Reference<Connection> pCon = new Connection(); pCon->construct(url, info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon); return pCon; } diff --git a/connectivity/source/drivers/firebird/Driver.hxx b/connectivity/source/drivers/firebird/Driver.hxx index d8ce92b0ed93..5428568b4166 100644 --- a/connectivity/source/drivers/firebird/Driver.hxx +++ b/connectivity/source/drivers/firebird/Driver.hxx @@ -27,61 +27,65 @@ #include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp> #include <cppuhelper/compbase.hxx> #include <unotools/tempfile.hxx> +#include <unotools/weakref.hxx> namespace connectivity::firebird - { - // The SQL dialect in use - // Has to be used in various isc_* calls. - // 3: Is IB6 -- minimum required for delimited identifiers. - const int FIREBIRD_SQL_DIALECT = 3; +{ + // The SQL dialect in use + // Has to be used in various isc_* calls. + // 3: Is IB6 -- minimum required for delimited identifiers. + // SQL_DIALECT_V6 = 3, it's the last current version + // SQL_DIALECT_CURRENT is an alias for SQL_DIALECT_V6 + // See src/dsql/sqlda_pub.h for full details - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XDriver, - css::sdbcx::XDataDefinitionSupplier, - css::lang::XServiceInfo > ODriver_BASE; + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XDriver, + css::sdbcx::XDataDefinitionSupplier, + css::lang::XServiceInfo > ODriver_BASE; - class FirebirdDriver : public ODriver_BASE - { - private: - css::uno::Reference<css::uno::XComponentContext> m_aContext; - ::utl::TempFile m_firebirdTMPDirectory; - ::utl::TempFile m_firebirdLockDirectory; + class FirebirdDriver : public ODriver_BASE + { + private: + css::uno::Reference<css::uno::XComponentContext> m_aContext; + ::utl::TempFileNamed m_firebirdTMPDirectory; + ::utl::TempFileNamed m_firebirdLockDirectory; - protected: - ::osl::Mutex m_aMutex; // mutex is need to control member access - OWeakRefArray m_xConnections; // vector containing a list - // of all the Connection objects - // for this Driver + protected: + ::osl::Mutex m_aMutex; // mutex is need to control member access + std::vector<unotools::WeakReference<Connection>> + m_xConnections; // vector containing a list + // of all the Connection objects + // for this Driver - public: + public: - explicit FirebirdDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext); - virtual ~FirebirdDriver() override; - const css::uno::Reference<css::uno::XComponentContext>& getContext() const { return m_aContext; } + explicit FirebirdDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext); + virtual ~FirebirdDriver() override; + const css::uno::Reference<css::uno::XComponentContext>& getContext() const { return m_aContext; } - // OComponentHelper - virtual void SAL_CALL disposing() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; - // XServiceInfo - virtual OUString SAL_CALL getImplementationName( ) override; - virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; - virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; - // XDriver - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL connect( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; - virtual sal_Bool SAL_CALL acceptsURL( const OUString& url ) override; - virtual css::uno::Sequence< css::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; - virtual sal_Int32 SAL_CALL getMajorVersion( ) override; - virtual sal_Int32 SAL_CALL getMinorVersion( ) override; + // XDriver + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL connect( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; + virtual sal_Bool SAL_CALL acceptsURL( const OUString& url ) override; + virtual css::uno::Sequence< css::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; + virtual sal_Int32 SAL_CALL getMajorVersion( ) override; + virtual sal_Int32 SAL_CALL getMinorVersion( ) override; - // XDataDefinitionSupplier - virtual css::uno::Reference< css::sdbcx::XTablesSupplier > - SAL_CALL getDataDefinitionByConnection( - const css::uno::Reference< css::sdbc::XConnection >& rxConnection) override; - virtual css::uno::Reference< css::sdbcx::XTablesSupplier > - SAL_CALL getDataDefinitionByURL( - const OUString& rsURL, - const css::uno::Sequence< css::beans::PropertyValue >& rInfo) override; - }; + // XDataDefinitionSupplier + virtual css::uno::Reference< css::sdbcx::XTablesSupplier > + SAL_CALL getDataDefinitionByConnection( + const css::uno::Reference< css::sdbc::XConnection >& rxConnection) override; + virtual css::uno::Reference< css::sdbcx::XTablesSupplier > + SAL_CALL getDataDefinitionByURL( + const OUString& rsURL, + const css::uno::Sequence< css::beans::PropertyValue >& rInfo) override; + }; } diff --git a/connectivity/source/drivers/firebird/Indexes.cxx b/connectivity/source/drivers/firebird/Indexes.cxx index 10ec90dc5be0..7bf783c79c7b 100644 --- a/connectivity/source/drivers/firebird/Indexes.cxx +++ b/connectivity/source/drivers/firebird/Indexes.cxx @@ -13,12 +13,11 @@ using namespace ::connectivity; using namespace ::connectivity::firebird; using namespace ::osl; -using namespace ::std; using namespace ::com::sun::star; using namespace ::com::sun::star::sdbc; -Indexes::Indexes(Table* pTable, Mutex& rMutex, const vector<OUString>& rVector) +Indexes::Indexes(Table* pTable, Mutex& rMutex, const std::vector<OUString>& rVector) : OIndexesHelper(pTable, rMutex, rVector) , m_pTable(pTable) { diff --git a/connectivity/source/drivers/firebird/Indexes.hxx b/connectivity/source/drivers/firebird/Indexes.hxx index 12d7dd198028..58991e23a788 100644 --- a/connectivity/source/drivers/firebird/Indexes.hxx +++ b/connectivity/source/drivers/firebird/Indexes.hxx @@ -14,25 +14,25 @@ #include <connectivity/TIndexes.hxx> namespace connectivity::firebird - { +{ - /** - * Firebird has a non-standard DROP INDEX statement, hence we need - * to override OIndexesHelper::dropObject - */ - class Indexes: public ::connectivity::OIndexesHelper - { - private: - Table* m_pTable; - protected: - // XDrop - virtual void dropObject(sal_Int32 nPosition, - const OUString& sIndexName) override; - public: - Indexes(Table* pTable, - ::osl::Mutex& rMutex, - const std::vector< OUString>& rVector); - }; + /** + * Firebird has a non-standard DROP INDEX statement, hence we need + * to override OIndexesHelper::dropObject + */ + class Indexes: public ::connectivity::OIndexesHelper + { + private: + Table* m_pTable; + protected: + // XDrop + virtual void dropObject(sal_Int32 nPosition, + const OUString& sIndexName) override; + public: + Indexes(Table* pTable, + ::osl::Mutex& rMutex, + const std::vector< OUString>& rVector); + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/Keys.cxx b/connectivity/source/drivers/firebird/Keys.cxx index 8de112ec6fc4..18d74c8b6ac0 100644 --- a/connectivity/source/drivers/firebird/Keys.cxx +++ b/connectivity/source/drivers/firebird/Keys.cxx @@ -37,7 +37,7 @@ void Keys::dropObject(sal_Int32 nPosition, const OUString& sName) if (m_pTable->isNew()) return; - uno::Reference<XPropertySet> xKey(getObject(nPosition), UNO_QUERY); + uno::Reference<XPropertySet> xKey(getObject(nPosition)); if (xKey.is()) { diff --git a/connectivity/source/drivers/firebird/Keys.hxx b/connectivity/source/drivers/firebird/Keys.hxx index 4e9ba5a7eede..fb3d3ca036d4 100644 --- a/connectivity/source/drivers/firebird/Keys.hxx +++ b/connectivity/source/drivers/firebird/Keys.hxx @@ -12,24 +12,24 @@ #include <connectivity/TKeys.hxx> namespace connectivity::firebird - { +{ - class Table; + class Table; - class Keys: public ::connectivity::OKeysHelper - { - private: - Table* m_pTable; + class Keys: public ::connectivity::OKeysHelper + { + private: + Table* m_pTable; - public: - Keys(Table* pTable, - ::osl::Mutex& rMutex, - const ::std::vector< OUString>& rNames); + public: + Keys(Table* pTable, + ::osl::Mutex& rMutex, + const ::std::vector< OUString>& rNames); - // OKeysHelper / XDrop - void dropObject(sal_Int32 nPosition, const OUString& sName) override; + // OKeysHelper / XDrop + void dropObject(sal_Int32 nPosition, const OUString& sName) override; - }; + }; } diff --git a/connectivity/source/drivers/firebird/PreparedStatement.cxx b/connectivity/source/drivers/firebird/PreparedStatement.cxx index 8d08a207a67c..c1ebd314ea7e 100644 --- a/connectivity/source/drivers/firebird/PreparedStatement.cxx +++ b/connectivity/source/drivers/firebird/PreparedStatement.cxx @@ -20,8 +20,6 @@ #include <sal/config.h> #include <cmath> -#include <string_view> - #include "Connection.hxx" #include "PreparedStatement.hxx" #include "ResultSet.hxx" @@ -50,7 +48,9 @@ using namespace com::sun::star::container; using namespace com::sun::star::io; using namespace com::sun::star::util; -IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.firebird.PreparedStatement","com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(OPreparedStatement,u"com.sun.star.sdbcx.firebird.PreparedStatement"_ustr,u"com.sun.star.sdbc.PreparedStatement"_ustr); + +constexpr size_t MAX_SIZE_SEGMENT = 65535; // max value of a segment of CLOB, if we want more than 65535 bytes, we need more segments OPreparedStatement::OPreparedStatement( Connection* _pConnection, @@ -77,6 +77,7 @@ void OPreparedStatement::ensurePrepared() if (!m_pInSqlda) { m_pInSqlda = static_cast<XSQLDA*>(calloc(1, XSQLDA_LENGTH(10))); + assert(m_pInSqlda && "Don't handle OOM conditions"); m_pInSqlda->version = SQLDA_VERSION1; m_pInSqlda->sqln = 10; } @@ -97,6 +98,7 @@ void OPreparedStatement::ensurePrepared() short nItems = m_pInSqlda->sqld; free(m_pInSqlda); m_pInSqlda = static_cast<XSQLDA*>(calloc(1, XSQLDA_LENGTH(nItems))); + assert(m_pInSqlda && "Don't handle OOM conditions"); m_pInSqlda->version = SQLDA_VERSION1; m_pInSqlda->sqln = nItems; aErr = isc_dsql_describe_bind(m_statusVector, @@ -191,80 +193,89 @@ void SAL_CALL OPreparedStatement::setString(sal_Int32 nParameterIndex, checkParameterIndex(nParameterIndex); setParameterNull(nParameterIndex, false); - OString str = OUStringToOString(sInput , RTL_TEXTENCODING_UTF8 ); - XSQLVAR* pVar = m_pInSqlda->sqlvar + (nParameterIndex - 1); + ColumnTypeInfo columnType(*pVar); - int dtype = (pVar->sqltype & ~1); // drop flag bit for now - - if (str.getLength() > pVar->sqllen) - str = str.copy(0, pVar->sqllen); - - switch (dtype) { - case SQL_VARYING: + switch (auto sdbcType = columnType.getSdbcType()) { + case DataType::VARCHAR: + case DataType::CHAR: { - const sal_Int32 max_varchar_len = 0xFFFF; - // First 2 bytes indicate string size - if (str.getLength() > max_varchar_len) + OString str = OUStringToOString(sInput, RTL_TEXTENCODING_UTF8); + const ISC_SHORT nLength = std::min(str.getLength(), static_cast<sal_Int32>(pVar->sqllen)); + int offset = 0; + if (sdbcType == DataType::VARCHAR) { - str = str.copy(0, max_varchar_len); + // First 2 bytes indicate string size + static_assert(sizeof(nLength) == 2, "must match dest memcpy len"); + memcpy(pVar->sqldata, &nLength, 2); + offset = 2; } - const auto nLength = str.getLength(); - memcpy(pVar->sqldata, &nLength, 2); // Actual data - memcpy(pVar->sqldata + 2, str.getStr(), str.getLength()); + memcpy(pVar->sqldata + offset, str.getStr(), nLength); + if (sdbcType == DataType::CHAR) + { + // Fill remainder with spaces + memset(pVar->sqldata + offset + nLength, ' ', pVar->sqllen - nLength); + } break; } - case SQL_TEXT: - memcpy(pVar->sqldata, str.getStr(), str.getLength()); - // Fill remainder with spaces - memset(pVar->sqldata + str.getLength(), ' ', pVar->sqllen - str.getLength()); - break; - case SQL_BLOB: // Clob - assert( pVar->sqlsubtype == static_cast<short>(BlobSubtype::Clob) ); + case DataType::CLOB: setClob(nParameterIndex, sInput ); break; - case SQL_SHORT: + case DataType::SMALLINT: { sal_Int32 int32Value = sInput.toInt32(); if ( (int32Value < std::numeric_limits<sal_Int16>::min()) || (int32Value > std::numeric_limits<sal_Int16>::max()) ) { ::dbtools::throwSQLException( - "Value out of range for SQL_SHORT type", + u"Value out of range for SQL_SHORT type"_ustr, ::dbtools::StandardSQLState::INVALID_SQL_DATA_TYPE, *this); } setShort(nParameterIndex, int32Value); break; } - case SQL_LONG: + case DataType::INTEGER: { sal_Int32 int32Value = sInput.toInt32(); setInt(nParameterIndex, int32Value); break; } - case SQL_INT64: + case DataType::BIGINT: { sal_Int64 int64Value = sInput.toInt64(); setLong(nParameterIndex, int64Value); break; } - case SQL_FLOAT: + case DataType::FLOAT: { float floatValue = sInput.toFloat(); setFloat(nParameterIndex, floatValue); break; } - case SQL_BOOLEAN: + case DataType::DOUBLE: + setDouble(nParameterIndex, sInput.toDouble()); + break; + case DataType::NUMERIC: + case DataType::DECIMAL: + return setObjectWithInfo(nParameterIndex, Any{ sInput }, sdbcType, 0); + break; + case DataType::BOOLEAN: { bool boolValue = sInput.toBoolean(); setBoolean(nParameterIndex, boolValue); break; } + case DataType::SQLNULL: + { + // See https://www.firebirdsql.org/file/documentation/html/en/refdocs/fblangref25/firebird-25-language-reference.html#fblangref25-datatypes-special-sqlnull + pVar->sqldata = nullptr; + break; + } default: ::dbtools::throwSQLException( - "Incorrect type for setString", + u"Incorrect type for setString"_ustr, ::dbtools::StandardSQLState::INVALID_SQL_DATA_TYPE, *this); } @@ -327,9 +338,6 @@ sal_Bool SAL_CALL OPreparedStatement::execute() m_aStatementHandle, m_pOutSqlda); - if (getStatementChangeCount() > 0) - m_pConnection->notifyDatabaseModified(); - return m_xResultSet.is(); // TODO: implement handling of multiple ResultSets. } @@ -348,44 +356,97 @@ Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery() namespace { +sal_Int64 toPowOf10AndRound(double n, int powOf10) +{ + static constexpr sal_Int64 powers[] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000, + }; + powOf10 = std::clamp(powOf10, 0, int(std::size(powers) - 1)); + return n * powers[powOf10] + (n >= 0 ? 0.5 : -0.5); +} + /** * Take out the number part of a fix point decimal without * the information of where is the fractional part from a * string representation of a number. (e.g. 54.654 -> 54654) */ -sal_Int64 toNumericWithoutDecimalPlace(const OUString& sSource) +sal_Int64 toNumericWithoutDecimalPlace(const Any& x, sal_Int32 scale) { - OUString sNumber(sSource); - - // cut off leading 0 eventually ( eg. 0.567 -> .567) - (void)sSource.startsWith("0", &sNumber); + if (double value = 0; x >>= value) + return toPowOf10AndRound(value, scale); - sal_Int32 nDotIndex = sNumber.indexOf('.'); + // Can't use conversion of string to double, because it could be not representable in double - if( nDotIndex < 0) + OUString s; + x >>= s; + std::u16string_view num(o3tl::trim(s)); + size_t end = num.starts_with('-') ? 1 : 0; + for (bool seenDot = false; end < num.size(); ++end) { - return sNumber.toInt64(); // no dot -> it's an integer + if (num[end] == '.') + { + if (seenDot) + break; + seenDot = true; + } + else if (!rtl::isAsciiDigit(num[end])) + break; } - else + num = num.substr(0, end); + + // fill in the number with nulls in fractional part. + // We need this because e.g. 0.450 != 0.045 despite + // their scale is equal + OUStringBuffer buffer(num); + if (auto dotPos = num.find('.'); dotPos != std::u16string_view::npos) // there is a dot { - // remove dot - OUStringBuffer sBuffer(15); - if(nDotIndex > 0) + scale -= num.substr(dotPos + 1).size(); + buffer.remove(dotPos, 1); + if (scale < 0) { - sBuffer.append(sNumber.subView(0, nDotIndex)); + const sal_Int32 n = std::min(buffer.getLength(), -scale); + buffer.truncate(buffer.getLength() - n); + scale = 0; } - sBuffer.append(sNumber.subView(nDotIndex + 1)); - return sBuffer.makeStringAndClear().toInt64(); } + for (sal_Int32 i = 0; i < scale; ++i) + buffer.append('0'); + + return OUString::unacquired(buffer).toInt64(); } +double toDouble(const Any& x) +{ + if (double value = 0; x >>= value) + return value; + OUString s; + x >>= s; + return s.toDouble(); +} } //----- XParameters ----------------------------------------------------------- void SAL_CALL OPreparedStatement::setNull(sal_Int32 nIndex, sal_Int32 /*nSqlType*/) { MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); ensurePrepared(); checkParameterIndex(nIndex); @@ -401,7 +462,6 @@ template <typename T> void OPreparedStatement::setValue(sal_Int32 nIndex, const T& nValue, ISC_SHORT nType) { MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); ensurePrepared(); checkParameterIndex(nIndex); @@ -412,7 +472,7 @@ void OPreparedStatement::setValue(sal_Int32 nIndex, const T& nValue, ISC_SHORT n if ((pVar->sqltype & ~1) != nType) { ::dbtools::throwSQLException( - "Incorrect type for setValue", + u"Incorrect type for setValue"_ustr, ::dbtools::StandardSQLState::INVALID_SQL_DATA_TYPE, *this); } @@ -420,20 +480,48 @@ void OPreparedStatement::setValue(sal_Int32 nIndex, const T& nValue, ISC_SHORT n memcpy(pVar->sqldata, &nValue, sizeof(nValue)); } +// Integral type setters convert transparently to bigger types + void SAL_CALL OPreparedStatement::setByte(sal_Int32 nIndex, sal_Int8 nValue) { // there's no TINYINT or equivalent on Firebird, // so do the same as setShort - setValue< sal_Int16 >(nIndex, nValue, SQL_SHORT); + setShort(nIndex, nValue); } void SAL_CALL OPreparedStatement::setShort(sal_Int32 nIndex, sal_Int16 nValue) { + MutexGuard aGuard(m_aMutex); + ensurePrepared(); + + ColumnTypeInfo columnType{ m_pInSqlda, nIndex }; + switch (columnType.getSdbcType()) + { + case DataType::INTEGER: + return setValue<sal_Int32>(nIndex, nValue, columnType.getType()); + case DataType::BIGINT: + return setValue<sal_Int64>(nIndex, nValue, columnType.getType()); + case DataType::FLOAT: + return setValue<float>(nIndex, nValue, columnType.getType()); + case DataType::DOUBLE: + return setValue<double>(nIndex, nValue, columnType.getType()); + } setValue< sal_Int16 >(nIndex, nValue, SQL_SHORT); } void SAL_CALL OPreparedStatement::setInt(sal_Int32 nIndex, sal_Int32 nValue) { + MutexGuard aGuard(m_aMutex); + ensurePrepared(); + + ColumnTypeInfo columnType{ m_pInSqlda, nIndex }; + switch (columnType.getSdbcType()) + { + case DataType::BIGINT: + return setValue<sal_Int64>(nIndex, nValue, columnType.getType()); + case DataType::DOUBLE: + return setValue<double>(nIndex, nValue, columnType.getType()); + } setValue< sal_Int32 >(nIndex, nValue, SQL_LONG); } @@ -450,51 +538,34 @@ void SAL_CALL OPreparedStatement::setFloat(sal_Int32 nIndex, float nValue) void SAL_CALL OPreparedStatement::setDouble(sal_Int32 nIndex, double nValue) { MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); ensurePrepared(); - XSQLVAR* pVar = m_pInSqlda->sqlvar + (nIndex - 1); - short dType = (pVar->sqltype & ~1); // drop flag bit for now - short dSubType = pVar->sqlsubtype; + ColumnTypeInfo columnType{ m_pInSqlda, nIndex }; // Assume it is a sub type of a number. - if(dSubType < 0 || dSubType > 2) + if (columnType.getSubType() < 0 || columnType.getSubType() > 2) { ::dbtools::throwSQLException( - "Incorrect number sub type", + u"Incorrect number sub type"_ustr, ::dbtools::StandardSQLState::INVALID_SQL_DATA_TYPE, *this); } - // firebird stores scale as a negative number - ColumnTypeInfo columnType{ dType, dSubType, - static_cast<short>(-pVar->sqlscale) }; // Caller might try to set an integer type here. It makes sense to convert // it instead of throwing an error. - switch(columnType.getSdbcType()) + switch(auto sdbcType = columnType.getSdbcType()) { case DataType::SMALLINT: - setValue< sal_Int16 >(nIndex, - static_cast<sal_Int16>(nValue), - dType); - break; + return setValue(nIndex, static_cast<sal_Int16>(nValue), columnType.getType()); case DataType::INTEGER: - setValue< sal_Int32 >(nIndex, - static_cast<sal_Int32>(nValue), - dType); - break; + return setValue(nIndex, static_cast<sal_Int32>(nValue), columnType.getType()); case DataType::BIGINT: - setValue< sal_Int64 >(nIndex, - static_cast<sal_Int64>(nValue), - dType); - break; + return setValue(nIndex, static_cast<sal_Int64>(nValue), columnType.getType()); case DataType::NUMERIC: case DataType::DECIMAL: - // take decimal places into account, later on they are removed in makeNumericString - setObjectWithInfo(nIndex,Any{nValue}, columnType.getSdbcType(), columnType.getScale()); - break; - default: - setValue< double >(nIndex, nValue, SQL_DOUBLE); // TODO: SQL_D_FLOAT? + return setObjectWithInfo(nIndex, Any{ nValue }, sdbcType, 0); + // TODO: SQL_D_FLOAT? } + setValue<double>(nIndex, nValue, SQL_DOUBLE); } void SAL_CALL OPreparedStatement::setDate(sal_Int32 nIndex, const Date& rDate) @@ -563,7 +634,7 @@ void OPreparedStatement::openBlobForWriting(isc_blob_handle& rBlobHandle, ISC_QU if (aErr) { evaluateStatusVector(m_statusVector, - OUStringConcatenation("setBlob failed on " + m_sSqlStatement), + Concat2View("setBlob failed on " + m_sSqlStatement), *this); assert(false); } @@ -589,11 +660,8 @@ void SAL_CALL OPreparedStatement::setClob(sal_Int32 nParameterIndex, const Refer ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); -#if SAL_TYPES_SIZEOFPOINTER == 8 - isc_blob_handle aBlobHandle = 0; -#else - isc_blob_handle aBlobHandle = nullptr; -#endif + // value-initialization: isc_blob_handle may be either a pointer of an integer + isc_blob_handle aBlobHandle{}; ISC_QUAD aBlobId; openBlobForWriting(aBlobHandle, aBlobId); @@ -605,9 +673,9 @@ void SAL_CALL OPreparedStatement::setClob(sal_Int32 nParameterIndex, const Refer sal_Int64 nCharWritten = 1; // XClob is indexed from 1 ISC_STATUS aErr = 0; sal_Int64 nLen = xClob->length(); - while ( nLen > nCharWritten ) + while ( nLen >= nCharWritten ) { - sal_Int64 nCharRemain = nLen - nCharWritten; + sal_Int64 nCharRemain = nLen - nCharWritten + 1; constexpr sal_uInt16 MAX_SIZE = SAL_MAX_UINT16 / 4; sal_uInt16 nWriteSize = std::min<sal_Int64>(nCharRemain, MAX_SIZE); OString sData = OUStringToOString( @@ -638,17 +706,14 @@ void SAL_CALL OPreparedStatement::setClob(sal_Int32 nParameterIndex, const Refer setValue< ISC_QUAD >(nParameterIndex, aBlobId, SQL_BLOB); } -void OPreparedStatement::setClob( sal_Int32 nParameterIndex, const OUString& rStr ) +void OPreparedStatement::setClob(sal_Int32 nParameterIndex, std::u16string_view rStr) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); checkParameterIndex(nParameterIndex); -#if SAL_TYPES_SIZEOFPOINTER == 8 - isc_blob_handle aBlobHandle = 0; -#else - isc_blob_handle aBlobHandle = nullptr; -#endif + // value-initialization: isc_blob_handle may be either a pointer of an integer + isc_blob_handle aBlobHandle{}; ISC_QUAD aBlobId; openBlobForWriting(aBlobHandle, aBlobId); @@ -656,10 +721,41 @@ void OPreparedStatement::setClob( sal_Int32 nParameterIndex, const OUString& rSt OString sData = OUStringToOString( rStr, RTL_TEXTENCODING_UTF8); - ISC_STATUS aErr = isc_put_segment( m_statusVector, + size_t nDataSize = sData.getLength(); + ISC_STATUS aErr = 0; + // we can't store more than MAX_SIZE_SEGMENT in a segment + if (nDataSize <= MAX_SIZE_SEGMENT) + { + aErr = isc_put_segment( m_statusVector, &aBlobHandle, sData.getLength(), sData.getStr() ); + } + else + { + // if we need more, let's split the input and first let's calculate the nb of entire chunks needed + size_t nNbEntireChunks = nDataSize / MAX_SIZE_SEGMENT; + for (size_t i = 0; i < nNbEntireChunks; ++i) + { + OString strCurrentChunk = sData.copy(i * MAX_SIZE_SEGMENT, MAX_SIZE_SEGMENT); + aErr = isc_put_segment( m_statusVector, + &aBlobHandle, + strCurrentChunk.getLength(), + strCurrentChunk.getStr() ); + if (aErr) + break; + } + size_t nRemainingBytes = nDataSize - (nNbEntireChunks * MAX_SIZE_SEGMENT); + if (nRemainingBytes && !aErr) + { + // then copy the remaining + OString strCurrentChunk = sData.copy(nNbEntireChunks * MAX_SIZE_SEGMENT, nRemainingBytes); + aErr = isc_put_segment( m_statusVector, + &aBlobHandle, + strCurrentChunk.getLength(), + strCurrentChunk.getStr() ); + } + } // We need to make sure we close the Blob even if there are errors, hence evaluate // errors after closing. @@ -683,11 +779,8 @@ void SAL_CALL OPreparedStatement::setBlob(sal_Int32 nParameterIndex, checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); checkParameterIndex(nParameterIndex); -#if SAL_TYPES_SIZEOFPOINTER == 8 - isc_blob_handle aBlobHandle = 0; -#else - isc_blob_handle aBlobHandle = nullptr; -#endif + // value-initialization: isc_blob_handle may be either a pointer of an integer + isc_blob_handle aBlobHandle{}; ISC_QUAD aBlobId; openBlobForWriting(aBlobHandle, aBlobId); @@ -754,62 +847,28 @@ void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, c checkParameterIndex(parameterIndex); setParameterNull(parameterIndex, false); - XSQLVAR* pVar = m_pInSqlda->sqlvar + (parameterIndex - 1); - int dType = (pVar->sqltype & ~1); // drop null flag + ColumnTypeInfo columnType{ m_pInSqlda, parameterIndex }; + int dType = columnType.getType() & ~1; // drop null flag if(sqlType == DataType::DECIMAL || sqlType == DataType::NUMERIC) { - double dbValue =0.0; - OUString sValue; - if( x >>= dbValue ) - { - // truncate and round to 'scale' number of decimal places - sValue = OUString::number( std::floor((dbValue * pow10Integer(scale)) + .5) / pow10Integer(scale) ); - } - else - { - x >>= sValue; - } - - // fill in the number with nulls in fractional part. - // We need this because e.g. 0.450 != 0.045 despite - // their scale is equal - OUStringBuffer sBuffer(15); - sBuffer.append(sValue); - if(sValue.indexOf('.') != -1) // there is a dot - { - for(sal_Int32 i=sValue.copy(sValue.indexOf('.')+1).getLength(); i<scale;i++) - { - sBuffer.append('0'); - } - } - else - { - for (sal_Int32 i=0; i<scale; i++) - { - sBuffer.append('0'); - } - } - - sValue = sBuffer.makeStringAndClear(); switch(dType) { case SQL_SHORT: - setValue< sal_Int16 >(parameterIndex, - static_cast<sal_Int16>( toNumericWithoutDecimalPlace(sValue) ), - dType); - break; + return setValue( + parameterIndex, + static_cast<sal_Int16>(toNumericWithoutDecimalPlace(x, columnType.getScale())), + dType); case SQL_LONG: - case SQL_DOUBLE: - setValue< sal_Int32 >(parameterIndex, - static_cast<sal_Int32>( toNumericWithoutDecimalPlace(sValue) ), - dType); - break; + return setValue( + parameterIndex, + static_cast<sal_Int32>(toNumericWithoutDecimalPlace(x, columnType.getScale())), + dType); case SQL_INT64: - setValue< sal_Int64 >(parameterIndex, - toNumericWithoutDecimalPlace(sValue), - dType); - break; + return setValue(parameterIndex, + toNumericWithoutDecimalPlace(x, columnType.getScale()), dType); + case SQL_DOUBLE: + return setValue(parameterIndex, toDouble(x), dType); default: SAL_WARN("connectivity.firebird", "No Firebird sql type found for numeric or decimal types"); @@ -851,11 +910,8 @@ void SAL_CALL OPreparedStatement::setBytes(sal_Int32 nParameterIndex, if( dType == SQL_BLOB ) { -#if SAL_TYPES_SIZEOFPOINTER == 8 - isc_blob_handle aBlobHandle = 0; -#else - isc_blob_handle aBlobHandle = nullptr; -#endif + // value-initialization: isc_blob_handle may be either a pointer of an integer + isc_blob_handle aBlobHandle{}; ISC_QUAD aBlobId; openBlobForWriting(aBlobHandle, aBlobId); @@ -899,12 +955,7 @@ void SAL_CALL OPreparedStatement::setBytes(sal_Int32 nParameterIndex, { setParameterNull(nParameterIndex, false); const sal_Int32 nMaxSize = 0xFFFF; - Sequence<sal_Int8> xBytesCopy(xBytes); - if (xBytesCopy.getLength() > nMaxSize) - { - xBytesCopy.realloc( nMaxSize ); - } - const auto nSize = xBytesCopy.getLength(); + const sal_uInt16 nSize = std::min(xBytes.getLength(), nMaxSize); // 8000 corresponds to value from lcl_addDefaultParameters // in dbaccess/source/filter/hsqldb/createparser.cxx if (nSize > 8000) @@ -912,22 +963,26 @@ void SAL_CALL OPreparedStatement::setBytes(sal_Int32 nParameterIndex, free(pVar->sqldata); pVar->sqldata = static_cast<char *>(malloc(sizeof(char) * nSize + 2)); } + static_assert(sizeof(nSize) == 2, "must match dest memcpy len"); // First 2 bytes indicate string size memcpy(pVar->sqldata, &nSize, 2); // Actual data - memcpy(pVar->sqldata + 2, xBytesCopy.getConstArray(), nSize); + memcpy(pVar->sqldata + 2, xBytes.getConstArray(), nSize); } else if( dType == SQL_TEXT ) { + if (pVar->sqllen < xBytes.getLength()) + dbtools::throwSQLException(u"Data too big for this field"_ustr, + dbtools::StandardSQLState::INVALID_SQL_DATA_TYPE, *this); setParameterNull(nParameterIndex, false); memcpy(pVar->sqldata, xBytes.getConstArray(), xBytes.getLength() ); - // Fill remainder with spaces + // Fill remainder with zeroes memset(pVar->sqldata + xBytes.getLength(), 0, pVar->sqllen - xBytes.getLength()); } else { ::dbtools::throwSQLException( - "Incorrect type for setBytes", + u"Incorrect type for setBytes"_ustr, ::dbtools::StandardSQLState::INVALID_SQL_DATA_TYPE, *this); } diff --git a/connectivity/source/drivers/firebird/PreparedStatement.hxx b/connectivity/source/drivers/firebird/PreparedStatement.hxx index 3e61436b5874..1c0fbb8f13f0 100644 --- a/connectivity/source/drivers/firebird/PreparedStatement.hxx +++ b/connectivity/source/drivers/firebird/PreparedStatement.hxx @@ -32,120 +32,120 @@ #include <ibase.h> namespace connectivity::firebird +{ + class OResultSetMetaData; + class OBoundParam; + typedef ::cppu::ImplHelper5< css::sdbc::XPreparedStatement, + css::sdbc::XParameters, + css::sdbc::XPreparedBatchExecution, + css::sdbc::XResultSetMetaDataSupplier, + css::lang::XServiceInfo> OPreparedStatement_Base; + + class OPreparedStatement : public OStatementCommonBase, + public OPreparedStatement_Base { - - class OBoundParam; - typedef ::cppu::ImplHelper5< css::sdbc::XPreparedStatement, - css::sdbc::XParameters, - css::sdbc::XPreparedBatchExecution, - css::sdbc::XResultSetMetaDataSupplier, - css::lang::XServiceInfo> OPreparedStatement_Base; - - class OPreparedStatement : public OStatementCommonBase, - public OPreparedStatement_Base - { - protected: - OUString m_sSqlStatement; - css::uno::Reference< css::sdbc::XResultSetMetaData > m_xMetaData; - - XSQLDA* m_pOutSqlda; - XSQLDA* m_pInSqlda; - /// @throws css::sdbc::SQLException - /// @throws css::uno::RuntimeException - void checkParameterIndex(sal_Int32 nParameterIndex); - - /** - * Set a numeric value in the input SQLDA. If the destination - * parameter is not of nType then an Exception will be thrown. - * - * @throws css::sdbc::SQLException - * @throws css::uno::RuntimeException - */ - template <typename T> void setValue(sal_Int32 nIndex, const T& nValue, ISC_SHORT nType); - void setParameterNull(sal_Int32 nParameterIndex, bool bSetNull = true); - - /// @throws css::sdbc::SQLException - /// @throws css::uno::RuntimeException - void ensurePrepared(); - /** - * Assumes that all necessary mutexes have been taken. - */ - void openBlobForWriting(isc_blob_handle& rBlobHandle, ISC_QUAD& rBlobId); - /** - * Assumes that all necessary mutexes have been taken. - */ - void closeBlobAfterWriting(isc_blob_handle& rBlobHandle); - void setClob(sal_Int32 nParamIndex, const OUString& rStr); - - protected: - virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, - const css::uno::Any& rValue) override; - virtual ~OPreparedStatement() override; - public: - DECLARE_SERVICE_INFO(); - // a constructor, which is required for returning objects: - OPreparedStatement( Connection* _pConnection, - const OUString& sql); - - //XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - - // XPreparedStatement - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL - executeQuery() override; - virtual sal_Int32 SAL_CALL - executeUpdate() override; - virtual sal_Bool SAL_CALL - execute() override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL - getConnection() override; - - // XParameters - virtual void SAL_CALL setNull(sal_Int32 nIndex, sal_Int32 nValue) override; - virtual void SAL_CALL setObjectNull(sal_Int32 parameterIndex, sal_Int32 sqlType, const OUString& typeName ) override; - virtual void SAL_CALL setBoolean( sal_Int32 nIndex, sal_Bool nValue) override; - virtual void SAL_CALL setByte(sal_Int32 nIndex, sal_Int8 nValue) override; - virtual void SAL_CALL setShort(sal_Int32 nIndex, sal_Int16 nValue) override; - virtual void SAL_CALL setInt(sal_Int32 nIndex, sal_Int32 nValue) override; - virtual void SAL_CALL setLong(sal_Int32 nIndex, sal_Int64 nValue) override; - virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) override; - virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) override; - virtual void SAL_CALL setString( sal_Int32 parameterIndex, const OUString& x ) override; - virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const css::uno::Sequence< sal_Int8 >& x ) override; - virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const css::util::Date& x ) override; - virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const css::util::Time& x ) override; - virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const css::util::DateTime& x ) override; - virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const css::uno::Any& x ) override; - virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const css::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) override; - virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XRef >& x ) override; - virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XBlob >& x ) override; - virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XClob >& x ) override; - virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XArray >& x ) override; - virtual void SAL_CALL clearParameters( ) override; - - // XPreparedBatchExecution -- UNSUPPORTED by firebird - virtual void SAL_CALL - addBatch() override; - virtual void SAL_CALL - clearBatch() override; - virtual css::uno::Sequence< sal_Int32 > SAL_CALL - executeBatch() override; - - // XCloseable - virtual void SAL_CALL close() override; - // OComponentHelper - virtual void SAL_CALL disposing() override; - - // XResultSetMetaDataSupplier - virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; - - }; + protected: + OUString m_sSqlStatement; + rtl::Reference<OResultSetMetaData> m_xMetaData; + + XSQLDA* m_pOutSqlda; + XSQLDA* m_pInSqlda; + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + void checkParameterIndex(sal_Int32 nParameterIndex); + + /** + * Set a numeric value in the input SQLDA. If the destination + * parameter is not of nType then an Exception will be thrown. + * + * @throws css::sdbc::SQLException + * @throws css::uno::RuntimeException + */ + template <typename T> void setValue(sal_Int32 nIndex, const T& nValue, ISC_SHORT nType); + void setParameterNull(sal_Int32 nParameterIndex, bool bSetNull = true); + + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + void ensurePrepared(); + /** + * Assumes that all necessary mutexes have been taken. + */ + void openBlobForWriting(isc_blob_handle& rBlobHandle, ISC_QUAD& rBlobId); + /** + * Assumes that all necessary mutexes have been taken. + */ + void closeBlobAfterWriting(isc_blob_handle& rBlobHandle); + void setClob(sal_Int32 nParamIndex, std::u16string_view rStr); + + protected: + virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, + const css::uno::Any& rValue) override; + virtual ~OPreparedStatement() override; + public: + DECLARE_SERVICE_INFO(); + // a constructor, which is required for returning objects: + OPreparedStatement( Connection* _pConnection, + const OUString& sql); + + //XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + + // XPreparedStatement + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL + executeQuery() override; + virtual sal_Int32 SAL_CALL + executeUpdate() override; + virtual sal_Bool SAL_CALL + execute() override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL + getConnection() override; + + // XParameters + virtual void SAL_CALL setNull(sal_Int32 nIndex, sal_Int32 nValue) override; + virtual void SAL_CALL setObjectNull(sal_Int32 parameterIndex, sal_Int32 sqlType, const OUString& typeName ) override; + virtual void SAL_CALL setBoolean( sal_Int32 nIndex, sal_Bool nValue) override; + virtual void SAL_CALL setByte(sal_Int32 nIndex, sal_Int8 nValue) override; + virtual void SAL_CALL setShort(sal_Int32 nIndex, sal_Int16 nValue) override; + virtual void SAL_CALL setInt(sal_Int32 nIndex, sal_Int32 nValue) override; + virtual void SAL_CALL setLong(sal_Int32 nIndex, sal_Int64 nValue) override; + virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) override; + virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) override; + virtual void SAL_CALL setString( sal_Int32 parameterIndex, const OUString& x ) override; + virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const css::uno::Sequence< sal_Int8 >& x ) override; + virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const css::util::Date& x ) override; + virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const css::util::Time& x ) override; + virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const css::util::DateTime& x ) override; + virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const css::uno::Any& x ) override; + virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const css::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) override; + virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XRef >& x ) override; + virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XBlob >& x ) override; + virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XClob >& x ) override; + virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XArray >& x ) override; + virtual void SAL_CALL clearParameters( ) override; + + // XPreparedBatchExecution -- UNSUPPORTED by firebird + virtual void SAL_CALL + addBatch() override; + virtual void SAL_CALL + clearBatch() override; + virtual css::uno::Sequence< sal_Int32 > SAL_CALL + executeBatch() override; + + // XCloseable + virtual void SAL_CALL close() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; + + // XResultSetMetaDataSupplier + virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; + + }; } diff --git a/connectivity/source/drivers/firebird/ResultSet.cxx b/connectivity/source/drivers/firebird/ResultSet.cxx index aa13dbd0b96c..ce6b875554da 100644 --- a/connectivity/source/drivers/firebird/ResultSet.cxx +++ b/connectivity/source/drivers/firebird/ResultSet.cxx @@ -151,16 +151,14 @@ sal_Bool SAL_CALL OResultSet::next() sal_Bool SAL_CALL OResultSet::previous() { - ::dbtools::throwFunctionNotSupportedSQLException("previous not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"previous not supported in firebird"_ustr, *this); - return false; } sal_Bool SAL_CALL OResultSet::isLast() { - ::dbtools::throwFunctionNotSupportedSQLException("isLast not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"isLast not supported in firebird"_ustr, *this); - return false; } sal_Bool SAL_CALL OResultSet::isBeforeFirst() @@ -193,7 +191,7 @@ void SAL_CALL OResultSet::beforeFirst() checkDisposed(OResultSet_BASE::rBHelper.bDisposed); if (m_currentRow != 0) - ::dbtools::throwFunctionNotSupportedSQLException("beforeFirst not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"beforeFirst not supported in firebird"_ustr, *this); } @@ -203,7 +201,7 @@ void SAL_CALL OResultSet::afterLast() checkDisposed(OResultSet_BASE::rBHelper.bDisposed); if (!m_bIsAfterLastRow) - ::dbtools::throwFunctionNotSupportedSQLException("afterLast not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"afterLast not supported in firebird"_ustr, *this); } @@ -222,7 +220,7 @@ sal_Bool SAL_CALL OResultSet::first() } else { - ::dbtools::throwFunctionNotSupportedSQLException("first not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"first not supported in firebird"_ustr, *this); return false; } @@ -232,9 +230,8 @@ sal_Bool SAL_CALL OResultSet::last() { // We need to iterate past the last row to know when we've passed the last // row, hence we can't actually move to last. - ::dbtools::throwFunctionNotSupportedSQLException("last not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"last not supported in firebird"_ustr, *this); - return false; } sal_Bool SAL_CALL OResultSet::absolute(sal_Int32 aRow) @@ -249,7 +246,7 @@ sal_Bool SAL_CALL OResultSet::absolute(sal_Int32 aRow) } else { - ::dbtools::throwFunctionNotSupportedSQLException("absolute not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"absolute not supported in firebird"_ustr, *this); return false; } @@ -271,7 +268,7 @@ sal_Bool SAL_CALL OResultSet::relative(sal_Int32 row) } else { - ::dbtools::throwFunctionNotSupportedSQLException("relative not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"relative not supported in firebird"_ustr, *this); return false; } @@ -299,7 +296,7 @@ void OResultSet::checkRowIndex() if((m_currentRow < 1) || m_bIsAfterLastRow) { ::dbtools::throwSQLException( - "Invalid Row", + u"Invalid Row"_ustr, ::dbtools::StandardSQLState::INVALID_CURSOR_POSITION, *this); } @@ -334,8 +331,6 @@ sal_Int32 SAL_CALL OResultSet::findColumn(const OUString& rColumnName) } ::dbtools::throwInvalidColumnException(rColumnName, *this); - assert(false); - return 0; // Never reached } uno::Reference< XInputStream > SAL_CALL OResultSet::getBinaryStream( sal_Int32 ) @@ -368,7 +363,7 @@ bool OResultSet::isNull(const sal_Int32 nColumnIndex) return false; } -template <typename T> +template <typename T> requires std::is_integral_v<T> OUString OResultSet::makeNumericString(const sal_Int32 nColumnIndex) { // minus because firebird stores scale as a negative number @@ -382,40 +377,14 @@ OUString OResultSet::makeNumericString(const sal_Int32 nColumnIndex) OUStringBuffer sRetBuffer; T nAllDigits = *reinterpret_cast<T*>(m_pSqlda->sqlvar[nColumnIndex-1].sqldata); - sal_Int64 nDecimalCountExp = pow10Integer(nDecimalCount); - - if(nAllDigits < 0) - { - sRetBuffer.append('-'); - nAllDigits = -nAllDigits; // abs - } - - sRetBuffer.append(static_cast<sal_Int64>(nAllDigits / nDecimalCountExp) ); - if( nDecimalCount > 0) - { - sRetBuffer.append('.'); + sRetBuffer.append(static_cast<sal_Int64>(nAllDigits)); + sal_Int32 insertionPos = nAllDigits < 0 ? 1 : 0; // consider leading minus + int nMissingNulls = nDecimalCount - (sRetBuffer.getLength() - insertionPos) + 1; + for (int i = 0; i < nMissingNulls; ++i) + sRetBuffer.insert(insertionPos, '0'); - sal_Int64 nFractionalPart = nAllDigits % nDecimalCountExp; - - int iCount = 0; // digit count - sal_Int64 nFracTemp = nFractionalPart; - while(nFracTemp>0) - { - nFracTemp /= 10; - iCount++; - } - - int nMissingNulls = nDecimalCount - iCount; - - // append nulls after dot and before nFractionalPart - for(int i=0; i<nMissingNulls; i++) - { - sRetBuffer.append('0'); - } - - // the rest - sRetBuffer.append(nFractionalPart); - } + if (nDecimalCount) + sRetBuffer.insert(sRetBuffer.getLength() - nDecimalCount, '.'); return sRetBuffer.makeStringAndClear(); } @@ -452,7 +421,7 @@ T OResultSet::retrieveValue(const sal_Int32 nColumnIndex, const ISC_SHORT nType) template <> ORowSetValue OResultSet::retrieveValue(const sal_Int32 nColumnIndex, const ISC_SHORT /*nType*/) { - // See http://wiki.openoffice.org/wiki/Documentation/DevGuide/Database/Using_the_getXXX_Methods + // See https://wiki.documentfoundation.org/Documentation/DevGuide/Database_Access#Using_the_getXXX_Methods // (bottom of page) for a chart of possible conversions, we should allow all // of these -- Blob/Clob will probably need some specialist handling especially // w.r.t. to generating Strings for them. @@ -847,31 +816,28 @@ uno::Reference< XInterface > SAL_CALL OResultSet::getStatement() //----- XResultSet: unsupported change detection methods --------------------- sal_Bool SAL_CALL OResultSet::rowDeleted() { - ::dbtools::throwFunctionNotSupportedSQLException("rowDeleted not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"rowDeleted not supported in firebird"_ustr, *this); - return false; } + sal_Bool SAL_CALL OResultSet::rowInserted() { - ::dbtools::throwFunctionNotSupportedSQLException("rowInserted not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"rowInserted not supported in firebird"_ustr, *this); - return false; } sal_Bool SAL_CALL OResultSet::rowUpdated() { - ::dbtools::throwFunctionNotSupportedSQLException("rowUpdated not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"rowUpdated not supported in firebird"_ustr, *this); - return false; } void SAL_CALL OResultSet::refreshRow() { - ::dbtools::throwFunctionNotSupportedSQLException("refreshRow not supported in firebird", + ::dbtools::throwFunctionNotSupportedSQLException(u"refreshRow not supported in firebird"_ustr, *this); } - void SAL_CALL OResultSet::cancel( ) { MutexGuard aGuard(m_rMutex); @@ -910,12 +876,12 @@ uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OResultSet::getPropertyS // ---- XServiceInfo ----------------------------------------------------------- OUString SAL_CALL OResultSet::getImplementationName() { - return "com.sun.star.sdbcx.firebird.ResultSet"; + return u"com.sun.star.sdbcx.firebird.ResultSet"_ustr; } Sequence< OUString > SAL_CALL OResultSet::getSupportedServiceNames() { - return {"com.sun.star.sdbc.ResultSet","com.sun.star.sdbcx.ResultSet"}; + return {u"com.sun.star.sdbc.ResultSet"_ustr,u"com.sun.star.sdbcx.ResultSet"_ustr}; } sal_Bool SAL_CALL OResultSet::supportsService(const OUString& _rServiceName) diff --git a/connectivity/source/drivers/firebird/ResultSet.hxx b/connectivity/source/drivers/firebird/ResultSet.hxx index fdae21dfbaaf..66814748bd6b 100644 --- a/connectivity/source/drivers/firebird/ResultSet.hxx +++ b/connectivity/source/drivers/firebird/ResultSet.hxx @@ -35,181 +35,184 @@ #include <com/sun/star/sdbc/XRow.hpp> #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp> +#include <type_traits> + namespace connectivity::firebird +{ + class OResultSetMetaData; + /* + ** OResultSet + */ + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XResultSet, + css::sdbc::XRow, + css::sdbc::XResultSetMetaDataSupplier, + css::util::XCancellable, + css::sdbc::XCloseable, + css::sdbc::XColumnLocate, + css::lang::XServiceInfo> OResultSet_BASE; + + /** + * This ResultSet does not deal with the management of the SQLDA + * it is supplied with. The owner must manage its SQLDA appropriately + * and ensure that the ResultSet is destroyed before disposing of the + * SQLDA. + */ + class OResultSet: public OResultSet_BASE, + public ::comphelper::OPropertyContainer, + public ::comphelper::OPropertyArrayUsageHelper<OResultSet> { - /* - ** OResultSet - */ - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XResultSet, - css::sdbc::XRow, - css::sdbc::XResultSetMetaDataSupplier, - css::util::XCancellable, - css::sdbc::XCloseable, - css::sdbc::XColumnLocate, - css::lang::XServiceInfo> OResultSet_BASE; - - /** - * This ResultSet does not deal with the management of the SQLDA - * it is supplied with. The owner must mange its SQLDA appropriately - * and ensure that the ResultSet is destroyed before disposing of the - * SQLDA. - */ - class OResultSet: public OResultSet_BASE, - public ::comphelper::OPropertyContainer, - public ::comphelper::OPropertyArrayUsageHelper<OResultSet> - { - private: - bool m_bIsBookmarkable; - sal_Int32 m_nFetchSize; - sal_Int32 m_nResultSetType; - sal_Int32 m_nFetchDirection; - sal_Int32 m_nResultSetConcurrency; - - protected: - // Connection kept alive by m_xStatement - Connection* m_pConnection; - ::osl::Mutex& m_rMutex; - const css::uno::Reference< css::uno::XInterface >& m_xStatement; - - css::uno::Reference< css::sdbc::XResultSetMetaData> m_xMetaData; - - XSQLDA* m_pSqlda; - isc_stmt_handle m_statementHandle; - - bool m_bWasNull; - // Row numbering starts with 0 for "in front of first row" - sal_Int32 m_currentRow; - bool m_bIsAfterLastRow; - - const sal_Int32 m_fieldCount; - ISC_STATUS_ARRAY m_statusVector; - - bool isNull(const sal_Int32 nColumnIndex); - - template <typename T> OUString makeNumericString( - const sal_Int32 nColumnIndex); - - template <typename T> T retrieveValue(const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - - template <typename T> T safelyRetrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType = 0); - - // OIdPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; - virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper() override; - - /// @throws css::sdbc::SQLException - /// @throws css::uno::RuntimeException - void checkColumnIndex( sal_Int32 index ); - /// @throws css::sdbc::SQLException - /// @throws css::uno::RuntimeException - void checkRowIndex(); - - // you can't delete objects of this type - virtual ~OResultSet() override; - public: - DECLARE_SERVICE_INFO(); - - OResultSet(Connection* pConnection, - ::osl::Mutex& rMutex, - const css::uno::Reference< css::uno::XInterface >& xStatement, - isc_stmt_handle aStatementHandle, - XSQLDA* aSqlda - ); - - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( - const css::uno::Type& rType) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - // XPropertySet - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; - // XResultSet - virtual sal_Bool SAL_CALL next( ) override; - virtual sal_Bool SAL_CALL isBeforeFirst( ) override; - virtual sal_Bool SAL_CALL isAfterLast( ) override; - virtual sal_Bool SAL_CALL isFirst( ) override; - virtual sal_Bool SAL_CALL isLast( ) override; - virtual void SAL_CALL beforeFirst( ) override; - virtual void SAL_CALL afterLast( ) override; - virtual sal_Bool SAL_CALL first( ) override; - virtual sal_Bool SAL_CALL last( ) override; - virtual sal_Int32 SAL_CALL getRow( ) override; - virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) override; - virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) override; - virtual sal_Bool SAL_CALL previous( ) override; - virtual void SAL_CALL refreshRow( ) override; - virtual sal_Bool SAL_CALL rowUpdated( ) override; - virtual sal_Bool SAL_CALL rowInserted( ) override; - virtual sal_Bool SAL_CALL rowDeleted( ) override; - virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getStatement( ) override; - // XRow - virtual sal_Bool SAL_CALL wasNull( ) override; - virtual OUString SAL_CALL getString( sal_Int32 columnIndex ) override; - virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) override; - virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) override; - virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) override; - virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) override; - virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) override; - virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) override; - virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) override; - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) override; - virtual css::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) override; - virtual css::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) override; - virtual css::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) override; - virtual css::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; - virtual css::uno::Reference< css::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) override; - // XResultSetMetaDataSupplier - virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; - // XCancellable - virtual void SAL_CALL cancel( ) override; - // XCloseable - virtual void SAL_CALL close( ) override; - // XWarningsSupplier - - // XColumnLocate - virtual sal_Int32 SAL_CALL findColumn(const OUString& columnName) override; - - }; - - // Specialisations have to be in the namespace and can't be within the class. - template <> css::util::Date - OResultSet::retrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - template <> ::connectivity::ORowSetValue - OResultSet::retrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - template <> css::util::Time - OResultSet::retrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - template <> css::util::DateTime - OResultSet::retrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - template <> ISC_QUAD* - OResultSet::retrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - template <> OUString - OResultSet::retrieveValue( + private: + bool m_bIsBookmarkable; + sal_Int32 m_nFetchSize; + sal_Int32 m_nResultSetType; + sal_Int32 m_nFetchDirection; + sal_Int32 m_nResultSetConcurrency; + + protected: + // Connection kept alive by m_xStatement + Connection* m_pConnection; + ::osl::Mutex& m_rMutex; + const css::uno::Reference< css::uno::XInterface >& m_xStatement; + + rtl::Reference<OResultSetMetaData> m_xMetaData; + + XSQLDA* m_pSqlda; + isc_stmt_handle m_statementHandle; + + bool m_bWasNull; + // Row numbering starts with 0 for "in front of first row" + sal_Int32 m_currentRow; + bool m_bIsAfterLastRow; + + const sal_Int32 m_fieldCount; + ISC_STATUS_ARRAY m_statusVector; + + bool isNull(const sal_Int32 nColumnIndex); + + template <typename T> requires std::is_integral_v<T> + OUString makeNumericString(const sal_Int32 nColumnIndex); + + template <typename T> T retrieveValue(const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + + template <typename T> T safelyRetrieveValue( const sal_Int32 nColumnIndex, - const ISC_SHORT nType); - template <> ISC_QUAD* - OResultSet::retrieveValue( - const sal_Int32 nColumnIndex, - const ISC_SHORT nType); + const ISC_SHORT nType = 0); + + // OIdPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper() override; + + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + void checkColumnIndex( sal_Int32 index ); + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + void checkRowIndex(); + + // you can't delete objects of this type + virtual ~OResultSet() override; + public: + DECLARE_SERVICE_INFO(); + + OResultSet(Connection* pConnection, + ::osl::Mutex& rMutex, + const css::uno::Reference< css::uno::XInterface >& xStatement, + isc_stmt_handle aStatementHandle, + XSQLDA* aSqlda + ); + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( + const css::uno::Type& rType) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + // XResultSet + virtual sal_Bool SAL_CALL next( ) override; + virtual sal_Bool SAL_CALL isBeforeFirst( ) override; + virtual sal_Bool SAL_CALL isAfterLast( ) override; + virtual sal_Bool SAL_CALL isFirst( ) override; + virtual sal_Bool SAL_CALL isLast( ) override; + virtual void SAL_CALL beforeFirst( ) override; + virtual void SAL_CALL afterLast( ) override; + virtual sal_Bool SAL_CALL first( ) override; + virtual sal_Bool SAL_CALL last( ) override; + virtual sal_Int32 SAL_CALL getRow( ) override; + virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) override; + virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) override; + virtual sal_Bool SAL_CALL previous( ) override; + virtual void SAL_CALL refreshRow( ) override; + virtual sal_Bool SAL_CALL rowUpdated( ) override; + virtual sal_Bool SAL_CALL rowInserted( ) override; + virtual sal_Bool SAL_CALL rowDeleted( ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getStatement( ) override; + // XRow + virtual sal_Bool SAL_CALL wasNull( ) override; + virtual OUString SAL_CALL getString( sal_Int32 columnIndex ) override; + virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) override; + virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) override; + virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) override; + virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) override; + virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) override; + virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) override; + virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) override; + virtual css::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) override; + virtual css::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) override; + virtual css::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) override; + virtual css::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; + virtual css::uno::Reference< css::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) override; + // XResultSetMetaDataSupplier + virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; + // XCancellable + virtual void SAL_CALL cancel( ) override; + // XCloseable + virtual void SAL_CALL close( ) override; + // XWarningsSupplier + + // XColumnLocate + virtual sal_Int32 SAL_CALL findColumn(const OUString& columnName) override; + + }; + + // Specialisations have to be in the namespace and can't be within the class. + template <> css::util::Date + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + template <> ::connectivity::ORowSetValue + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + template <> css::util::Time + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + template <> css::util::DateTime + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + template <> ISC_QUAD* + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + template <> OUString + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); + template <> ISC_QUAD* + OResultSet::retrieveValue( + const sal_Int32 nColumnIndex, + const ISC_SHORT nType); } diff --git a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx index 2ed46bae9b34..1e2db23e0256 100644 --- a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx +++ b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx @@ -53,8 +53,8 @@ OUString OResultSetMetaData::getCharacterSet( sal_Int32 nIndex ) "JOIN RDB$RELATION_FIELDS relfields " "ON (fields.RDB$FIELD_NAME = relfields.RDB$FIELD_SOURCE) " "WHERE relfields.RDB$RELATION_NAME = '" - + escapeWith(sTable, '\'', '\'') + "' AND " - "relfields.RDB$FIELD_NAME = '"+ escapeWith(sColumnName, '\'', '\'') +"'"; + + sTable.replaceAll("'", "''") + "' AND " + "relfields.RDB$FIELD_NAME = '"+ sColumnName.replaceAll("'", "''") +"'"; Reference<XStatement> xStmt= m_pConnection->createStatement(); @@ -75,7 +75,7 @@ OUString OResultSetMetaData::getCharacterSet( sal_Int32 nIndex ) void OResultSetMetaData::verifyValidColumn(sal_Int32 column) { if (column>getColumnCount() || column < 1) - throw SQLException("Invalid column specified", *this, OUString(), 0, Any()); + throw SQLException(u"Invalid column specified"_ustr, *this, OUString(), 0, Any()); } sal_Int32 SAL_CALL OResultSetMetaData::getColumnCount() @@ -102,10 +102,7 @@ sal_Int32 SAL_CALL OResultSetMetaData::getColumnType(sal_Int32 column) sCharset = getCharacterSet(column); } - ColumnTypeInfo aInfo( m_pSqlda->sqlvar[column-1].sqltype, - m_pSqlda->sqlvar[column-1].sqlsubtype, - -(m_pSqlda->sqlvar[column-1].sqlscale), - sCharset ); + ColumnTypeInfo aInfo(m_pSqlda, column, sCharset); return aInfo.getSdbcType(); } @@ -128,9 +125,25 @@ OUString SAL_CALL OResultSetMetaData::getSchemaName(sal_Int32) OUString SAL_CALL OResultSetMetaData::getColumnName(sal_Int32 column) { verifyValidColumn(column); - OUString sRet(m_pSqlda->sqlvar[column-1].sqlname, - m_pSqlda->sqlvar[column-1].sqlname_length, - RTL_TEXTENCODING_UTF8); + char* pColumnName = m_pSqlda->sqlvar[column - 1].sqlname; + sal_Int32 nColumnNameLength = m_pSqlda->sqlvar[column - 1].sqlname_length; + // tdf#132924 - return column alias if specified + if (m_pSqlda->sqlvar[column - 1].aliasname_length > 0) + { + pColumnName = m_pSqlda->sqlvar[column - 1].aliasname; + nColumnNameLength = m_pSqlda->sqlvar[column - 1].aliasname_length; + } + OUString sRet(pColumnName, nColumnNameLength, RTL_TEXTENCODING_UTF8); + sanitizeIdentifier(sRet); + return sRet; +} + +OUString OResultSetMetaData::getColumnNameWithoutAlias(sal_Int32 column) +{ + verifyValidColumn(column); + char* pColumnName = m_pSqlda->sqlvar[column - 1].sqlname; + sal_Int32 nColumnNameLength = m_pSqlda->sqlvar[column - 1].sqlname_length; + OUString sRet(pColumnName, nColumnNameLength, RTL_TEXTENCODING_UTF8); sanitizeIdentifier(sRet); return sRet; } @@ -152,9 +165,7 @@ OUString SAL_CALL OResultSetMetaData::getColumnTypeName(sal_Int32 column) { verifyValidColumn(column); - ColumnTypeInfo aInfo( m_pSqlda->sqlvar[column-1].sqltype, - m_pSqlda->sqlvar[column-1].sqlsubtype, - -(m_pSqlda->sqlvar[column-1].sqlscale) ); + ColumnTypeInfo aInfo(m_pSqlda, column); return aInfo.getColumnTypeName(); } @@ -184,34 +195,34 @@ sal_Bool SAL_CALL OResultSetMetaData::isCurrency(sal_Int32) sal_Bool SAL_CALL OResultSetMetaData::isAutoIncrement(sal_Int32 column) { OUString sTable = getTableName(column); - if( !sTable.isEmpty() ) - { - OUString sColumnName = getColumnName( column ); + if( sTable.isEmpty() ) + return false; - OUString sSql = "SELECT RDB$IDENTITY_TYPE FROM RDB$RELATION_FIELDS " - "WHERE RDB$RELATION_NAME = '" - + escapeWith(sTable, '\'', '\'') + "' AND " - "RDB$FIELD_NAME = '"+ escapeWith(sColumnName, '\'', '\'') +"'"; + OUString sColumnName = getColumnNameWithoutAlias( column ); - Reference<XStatement> xStmt =m_pConnection ->createStatement(); + OUString sSql = "SELECT RDB$IDENTITY_TYPE FROM RDB$RELATION_FIELDS " + "WHERE RDB$RELATION_NAME = '" + + sTable.replaceAll("'", "''") + "' AND " + "RDB$FIELD_NAME = '"+ sColumnName.replaceAll("'", "''") +"'"; - Reference<XResultSet> xRes = - xStmt->executeQuery(sSql); - Reference<XRow> xRow ( xRes, UNO_QUERY); - if(xRes->next()) - { - int iType = xRow->getShort(1); - if(iType == 1) // IDENTITY - return true; - } - else - { - SAL_WARN("connectivity.firebird","Column '" - << sColumnName - << "' not found in database"); + Reference<XStatement> xStmt =m_pConnection ->createStatement(); - return false; - } + Reference<XResultSet> xRes = + xStmt->executeQuery(sSql); + Reference<XRow> xRow ( xRes, UNO_QUERY); + if(xRes->next()) + { + int iType = xRow->getShort(1); + if(iType == 1) // IDENTITY + return true; + } + else + { + SAL_WARN("connectivity.firebird","Column '" + << sColumnName + << "' not found in database"); + + return false; } return false; } @@ -226,34 +237,34 @@ sal_Bool SAL_CALL OResultSetMetaData::isSigned(sal_Int32) sal_Int32 SAL_CALL OResultSetMetaData::getPrecision(sal_Int32 column) { sal_Int32 nType = getColumnType(column); - if( nType == DataType::NUMERIC || nType == DataType::DECIMAL ) + if( nType != DataType::NUMERIC && nType != DataType::DECIMAL ) + return 0; + + OUString sColumnName = getColumnName( column ); + + // RDB$FIELD_SOURCE is a unique name of column per database + OUString sSql = "SELECT RDB$FIELD_PRECISION FROM RDB$FIELDS " + " INNER JOIN RDB$RELATION_FIELDS " + " ON RDB$RELATION_FIELDS.RDB$FIELD_SOURCE = RDB$FIELDS.RDB$FIELD_NAME " + "WHERE RDB$RELATION_FIELDS.RDB$RELATION_NAME = '" + + getTableName(column).replaceAll("'", "''") + "' AND " + "RDB$RELATION_FIELDS.RDB$FIELD_NAME = '" + + sColumnName.replaceAll("'", "''") +"'"; + Reference<XStatement> xStmt= m_pConnection->createStatement(); + + Reference<XResultSet> xRes = + xStmt->executeQuery(sSql); + Reference<XRow> xRow ( xRes, UNO_QUERY); + if(xRes->next()) { - OUString sColumnName = getColumnName( column ); - - // RDB$FIELD_SOURCE is a unique name of column per database - OUString sSql = "SELECT RDB$FIELD_PRECISION FROM RDB$FIELDS " - " INNER JOIN RDB$RELATION_FIELDS " - " ON RDB$RELATION_FIELDS.RDB$FIELD_SOURCE = RDB$FIELDS.RDB$FIELD_NAME " - "WHERE RDB$RELATION_FIELDS.RDB$RELATION_NAME = '" - + escapeWith(getTableName(column), '\'', '\'') + "' AND " - "RDB$RELATION_FIELDS.RDB$FIELD_NAME = '" - + escapeWith(sColumnName, '\'', '\'') +"'"; - Reference<XStatement> xStmt= m_pConnection->createStatement(); - - Reference<XResultSet> xRes = - xStmt->executeQuery(sSql); - Reference<XRow> xRow ( xRes, UNO_QUERY); - if(xRes->next()) - { - return static_cast<sal_Int32>(xRow->getShort(1)); - } - else - { - SAL_WARN("connectivity.firebird","Column '" - << sColumnName - << "' not found in database"); - return 0; - } + return static_cast<sal_Int32>(xRow->getShort(1)); + } + else + { + SAL_WARN("connectivity.firebird","Column '" + << sColumnName + << "' not found in database"); + return 0; } return 0; } diff --git a/connectivity/source/drivers/firebird/ResultSetMetaData.hxx b/connectivity/source/drivers/firebird/ResultSetMetaData.hxx index a32c206213aa..ece967379205 100644 --- a/connectivity/source/drivers/firebird/ResultSetMetaData.hxx +++ b/connectivity/source/drivers/firebird/ResultSetMetaData.hxx @@ -29,51 +29,52 @@ #include <com/sun/star/sdbc/XResultSetMetaData.hpp> namespace connectivity::firebird - { - typedef ::cppu::WeakImplHelper< css::sdbc::XResultSetMetaData> - OResultSetMetaData_BASE; +{ + typedef ::cppu::WeakImplHelper< css::sdbc::XResultSetMetaData> + OResultSetMetaData_BASE; - class OResultSetMetaData : public OResultSetMetaData_BASE - { - protected: - ::rtl::Reference<Connection> m_pConnection; - XSQLDA* m_pSqlda; + class OResultSetMetaData : public OResultSetMetaData_BASE + { + protected: + ::rtl::Reference<Connection> m_pConnection; + XSQLDA* m_pSqlda; - virtual ~OResultSetMetaData() override; + virtual ~OResultSetMetaData() override; - /// @throws css::sdbc::SQLException - void verifyValidColumn(sal_Int32 column); - OUString getCharacterSet(sal_Int32 nIndex); - public: - // a constructor, which is required for returning objects: - OResultSetMetaData(Connection* pConnection, - XSQLDA* pSqlda) - : m_pConnection(pConnection) - , m_pSqlda(pSqlda) - {} + /// @throws css::sdbc::SQLException + void verifyValidColumn(sal_Int32 column); + OUString getCharacterSet(sal_Int32 nIndex); + public: + // a constructor, which is required for returning objects: + OResultSetMetaData(Connection* pConnection, + XSQLDA* pSqlda) + : m_pConnection(pConnection) + , m_pSqlda(pSqlda) + {} - virtual sal_Int32 SAL_CALL getColumnCount() override; - virtual sal_Bool SAL_CALL isAutoIncrement(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isCaseSensitive(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isSearchable(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isCurrency(sal_Int32 column) override; - virtual sal_Int32 SAL_CALL isNullable(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isSigned(sal_Int32 column) override; - virtual sal_Int32 SAL_CALL getColumnDisplaySize(sal_Int32 column) override; - virtual OUString SAL_CALL getColumnLabel(sal_Int32 column) override; - virtual OUString SAL_CALL getColumnName(sal_Int32 column) override; - virtual OUString SAL_CALL getSchemaName(sal_Int32 column) override; - virtual sal_Int32 SAL_CALL getPrecision(sal_Int32 column) override; - virtual sal_Int32 SAL_CALL getScale(sal_Int32 column) override; - virtual OUString SAL_CALL getTableName(sal_Int32 column) override; - virtual OUString SAL_CALL getCatalogName(sal_Int32 column) override; - virtual sal_Int32 SAL_CALL getColumnType(sal_Int32 column) override; - virtual OUString SAL_CALL getColumnTypeName(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isReadOnly(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isWritable(sal_Int32 column) override; - virtual sal_Bool SAL_CALL isDefinitelyWritable(sal_Int32 column) override; - virtual OUString SAL_CALL getColumnServiceName(sal_Int32 column) override; - }; + virtual sal_Int32 SAL_CALL getColumnCount() override; + virtual sal_Bool SAL_CALL isAutoIncrement(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isCaseSensitive(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isSearchable(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isCurrency(sal_Int32 column) override; + virtual sal_Int32 SAL_CALL isNullable(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isSigned(sal_Int32 column) override; + virtual sal_Int32 SAL_CALL getColumnDisplaySize(sal_Int32 column) override; + virtual OUString SAL_CALL getColumnLabel(sal_Int32 column) override; + virtual OUString SAL_CALL getColumnName(sal_Int32 column) override; + OUString getColumnNameWithoutAlias(sal_Int32 column); + virtual OUString SAL_CALL getSchemaName(sal_Int32 column) override; + virtual sal_Int32 SAL_CALL getPrecision(sal_Int32 column) override; + virtual sal_Int32 SAL_CALL getScale(sal_Int32 column) override; + virtual OUString SAL_CALL getTableName(sal_Int32 column) override; + virtual OUString SAL_CALL getCatalogName(sal_Int32 column) override; + virtual sal_Int32 SAL_CALL getColumnType(sal_Int32 column) override; + virtual OUString SAL_CALL getColumnTypeName(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isReadOnly(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isWritable(sal_Int32 column) override; + virtual sal_Bool SAL_CALL isDefinitelyWritable(sal_Int32 column) override; + virtual OUString SAL_CALL getColumnServiceName(sal_Int32 column) override; + }; } diff --git a/connectivity/source/drivers/firebird/Statement.cxx b/connectivity/source/drivers/firebird/Statement.cxx index f4faebbf1a55..6b24e5c33321 100644 --- a/connectivity/source/drivers/firebird/Statement.cxx +++ b/connectivity/source/drivers/firebird/Statement.cxx @@ -40,7 +40,6 @@ using namespace com::sun::star::util; using namespace ::comphelper; using namespace ::osl; -using namespace ::std; // ---- XBatchExecution - UNSUPPORTED ---------------------------------------- void SAL_CALL OStatement::addBatch(const OUString&) @@ -56,7 +55,7 @@ Sequence< sal_Int32 > SAL_CALL OStatement::executeBatch() return Sequence< sal_Int32 >(); } -IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbcx.OStatement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(OStatement,u"com.sun.star.sdbcx.OStatement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); void SAL_CALL OStatement::acquire() noexcept { @@ -71,7 +70,8 @@ void SAL_CALL OStatement::release() noexcept void OStatement::disposeResultSet() { MutexGuard aGuard(m_aMutex); - checkDisposed(OStatementCommonBase_Base::rBHelper.bDisposed); + if (OStatementCommonBase_Base::rBHelper.bDisposed) + return; OStatementCommonBase::disposeResultSet(); @@ -126,11 +126,6 @@ uno::Reference< XResultSet > SAL_CALL OStatement::executeQuery(const OUString& s if (isDDLStatement()) { m_pConnection->commit(); - m_pConnection->notifyDatabaseModified(); - } - else if (getStatementChangeCount() > 0) - { - m_pConnection->notifyDatabaseModified(); } return m_xResultSet; diff --git a/connectivity/source/drivers/firebird/Statement.hxx b/connectivity/source/drivers/firebird/Statement.hxx index d1b967def1d5..6e501633a88f 100644 --- a/connectivity/source/drivers/firebird/Statement.hxx +++ b/connectivity/source/drivers/firebird/Statement.hxx @@ -25,59 +25,59 @@ #include <com/sun/star/sdbc/XBatchExecution.hpp> namespace connectivity::firebird - { +{ + + typedef ::cppu::ImplHelper1< css::sdbc::XStatement > + OStatement_Base; - typedef ::cppu::ImplHelper1< css::sdbc::XStatement > - OStatement_Base; - - class OStatement : public OStatementCommonBase, - public OStatement_Base, - public css::sdbc::XBatchExecution, - public css::lang::XServiceInfo - { - XSQLDA* m_pSqlda; - protected: - virtual ~OStatement() override {} - - public: - // a constructor, which is required for returning objects: - explicit OStatement( Connection* _pConnection) - : OStatementCommonBase( _pConnection), - m_pSqlda(nullptr) - {} - - virtual void disposeResultSet() override; - - DECLARE_SERVICE_INFO(); - - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - - // XStatement - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL - executeQuery(const OUString& sql) override; - virtual sal_Int32 SAL_CALL executeUpdate(const OUString& sqlIn) override; - virtual sal_Bool SAL_CALL - execute(const OUString& sql) override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL - getConnection() override; - - // XBatchExecution - UNSUPPORTED - virtual void SAL_CALL addBatch( const OUString& sql ) override; - virtual void SAL_CALL clearBatch( ) override; - virtual css::uno::Sequence< sal_Int32 > SAL_CALL executeBatch( ) override; - - // XInterface - virtual css::uno::Any SAL_CALL - queryInterface(const css::uno::Type & rType) override; - - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL - getTypes() override; - // OComponentHelper - virtual void SAL_CALL disposing() override; - - }; + class OStatement : public OStatementCommonBase, + public OStatement_Base, + public css::sdbc::XBatchExecution, + public css::lang::XServiceInfo + { + XSQLDA* m_pSqlda; + protected: + virtual ~OStatement() override {} + + public: + // a constructor, which is required for returning objects: + explicit OStatement( Connection* _pConnection) + : OStatementCommonBase( _pConnection), + m_pSqlda(nullptr) + {} + + virtual void disposeResultSet() override; + + DECLARE_SERVICE_INFO(); + + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XStatement + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL + executeQuery(const OUString& sql) override; + virtual sal_Int32 SAL_CALL executeUpdate(const OUString& sqlIn) override; + virtual sal_Bool SAL_CALL + execute(const OUString& sql) override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL + getConnection() override; + + // XBatchExecution - UNSUPPORTED + virtual void SAL_CALL addBatch( const OUString& sql ) override; + virtual void SAL_CALL clearBatch( ) override; + virtual css::uno::Sequence< sal_Int32 > SAL_CALL executeBatch( ) override; + + // XInterface + virtual css::uno::Any SAL_CALL + queryInterface(const css::uno::Type & rType) override; + + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL + getTypes() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; + + }; } diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.cxx b/connectivity/source/drivers/firebird/StatementCommonBase.cxx index 61f57f330516..12ce9a8fd7ba 100644 --- a/connectivity/source/drivers/firebird/StatementCommonBase.cxx +++ b/connectivity/source/drivers/firebird/StatementCommonBase.cxx @@ -17,9 +17,9 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "Driver.hxx" #include "StatementCommonBase.hxx" #include "Util.hxx" +#include "ResultSet.hxx" #include <sal/log.hxx> #include <comphelper/sequence.hxx> @@ -44,7 +44,6 @@ using namespace ::com::sun::star::util; using namespace ::comphelper; using namespace ::osl; -using namespace ::std; OStatementCommonBase::OStatementCommonBase(Connection* _pConnection) : OStatementCommonBase_Base(m_aMutex), @@ -64,9 +63,8 @@ OStatementCommonBase::~OStatementCommonBase() void OStatementCommonBase::disposeResultSet() { - uno::Reference< XComponent > xComp(m_xResultSet, UNO_QUERY); - if (xComp.is()) - xComp->dispose(); + if (m_xResultSet.is()) + m_xResultSet->dispose(); m_xResultSet.clear(); } @@ -133,6 +131,7 @@ void OStatementCommonBase::prepareAndDescribeStatement(std::u16string_view sql, if (!pOutSqlda) { pOutSqlda = static_cast<XSQLDA*>(calloc(1, XSQLDA_LENGTH(10))); + assert(pOutSqlda && "Don't handle OOM conditions"); pOutSqlda->version = SQLDA_VERSION1; pOutSqlda->sqln = 10; } @@ -154,7 +153,7 @@ void OStatementCommonBase::prepareAndDescribeStatement(std::u16string_view sql, &m_aStatementHandle, 0, OUStringToOString(sql, RTL_TEXTENCODING_UTF8).getStr(), - FIREBIRD_SQL_DIALECT, + SQL_DIALECT_CURRENT, pOutSqlda); if (aErr) @@ -171,6 +170,7 @@ void OStatementCommonBase::prepareAndDescribeStatement(std::u16string_view sql, int n = pOutSqlda->sqld; free(pOutSqlda); pOutSqlda = static_cast<XSQLDA*>(calloc(1, XSQLDA_LENGTH(n))); + assert(pOutSqlda && "Don't handle OOM conditions"); pOutSqlda->version = SQLDA_VERSION1; pOutSqlda->sqln = n; aErr = isc_dsql_describe(m_statusVector, @@ -243,31 +243,71 @@ void SAL_CALL OStatementCommonBase::clearWarnings() { // this properties are define by the service statement // they must in alphabetic order - Sequence< Property > aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), - PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), - PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), - PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), - PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), - PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), + PROPERTY_ID_ESCAPEPROCESSING, + cppu::UnoType<bool>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), + PROPERTY_ID_MAXFIELDSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), + PROPERTY_ID_MAXROWS, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), + PROPERTY_ID_QUERYTIMEOUT, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), + PROPERTY_ID_USEBOOKMARKS, + cppu::UnoType<bool>::get(), + 0 + } + } + }; } @@ -415,30 +455,31 @@ sal_Int32 OStatementCommonBase::getStatementChangeCount() aDesiredInfoType = isc_info_req_delete_count; break; case isc_info_sql_stmt_exec_procedure: + case isc_info_sql_stmt_ddl: return 0; // cannot determine default: throw SQLException(); // TODO: better error message? } char* pResults = aResultsBuffer; - if (static_cast<short>(*pResults++) == isc_info_sql_records) - { -// const short aTotalLength = (short) isc_vax_integer(pResults, 2); - pResults += 2; + if (static_cast<short>(*pResults++) != isc_info_sql_records) + return 0; - // Seems to be of form TOKEN (1 byte), LENGTH (2 bytes), DATA (LENGTH bytes) - while (*pResults != isc_info_rsb_end) - { - const char aToken = *pResults; - const short aLength = static_cast<short>(isc_vax_integer(pResults+1, 2)); +// const short aTotalLength = (short) isc_vax_integer(pResults, 2); + pResults += 2; - if (aToken == aDesiredInfoType) - { - return isc_vax_integer(pResults + 3, aLength); - } + // Seems to be of form TOKEN (1 byte), LENGTH (2 bytes), DATA (LENGTH bytes) + while (*pResults != isc_info_rsb_end) + { + const char aToken = *pResults; + const short aLength = static_cast<short>(isc_vax_integer(pResults+1, 2)); - pResults += (3 + aLength); + if (aToken == aDesiredInfoType) + { + return isc_vax_integer(pResults + 3, aLength); } + + pResults += (3 + aLength); } return 0; diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.hxx b/connectivity/source/drivers/firebird/StatementCommonBase.hxx index fa9cd790272e..17c130f7a374 100644 --- a/connectivity/source/drivers/firebird/StatementCommonBase.hxx +++ b/connectivity/source/drivers/firebird/StatementCommonBase.hxx @@ -37,97 +37,98 @@ #include <com/sun/star/util/XCancellable.hpp> namespace connectivity::firebird - { +{ + class OResultSet; + + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XWarningsSupplier, + css::util::XCancellable, + css::sdbc::XCloseable, + css::sdbc::XMultipleResults> OStatementCommonBase_Base; - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XWarningsSupplier, - css::util::XCancellable, - css::sdbc::XCloseable, - css::sdbc::XMultipleResults> OStatementCommonBase_Base; - - class OStatementCommonBase : public OStatementCommonBase_Base, - public ::cppu::OPropertySetHelper, - public OPropertyArrayUsageHelper<OStatementCommonBase> - - { - protected: - ::osl::Mutex m_aMutex; - - css::uno::Reference< css::sdbc::XResultSet> m_xResultSet; // The last ResultSet created - // for this Statement - - ::rtl::Reference<Connection> m_pConnection; - - ISC_STATUS_ARRAY m_statusVector; - isc_stmt_handle m_aStatementHandle; - - protected: - virtual void disposeResultSet(); - /// @throws css::sdbc::SQLException - void freeStatementHandle(); - - // OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const override; - // OPropertySetHelper - using OPropertySetHelper::getFastPropertyValue; - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; - virtual sal_Bool SAL_CALL convertFastPropertyValue( - css::uno::Any & rConvertedValue, - css::uno::Any & rOldValue, - sal_Int32 nHandle, - const css::uno::Any& rValue ) override; - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const css::uno::Any& rValue) override; - virtual void SAL_CALL getFastPropertyValue( - css::uno::Any& rValue, - sal_Int32 nHandle) const override; - virtual ~OStatementCommonBase() override; - - /// @throws css::sdbc::SQLException - void prepareAndDescribeStatement(std::u16string_view sqlIn, XSQLDA*& pOutSqlda); - - /// @throws css::sdbc::SQLException - short getSqlInfoItem(char aInfoItem); - /// @throws css::sdbc::SQLException - bool isDDLStatement(); - /// @throws css::sdbc::SQLException - sal_Int32 getStatementChangeCount(); - - public: - - explicit OStatementCommonBase(Connection* _pConnection); - using OStatementCommonBase_Base::operator css::uno::Reference< css::uno::XInterface >; - - // OComponentHelper - virtual void SAL_CALL disposing() override { - disposeResultSet(); - OStatementCommonBase_Base::disposing(); - } - // XInterface - virtual void SAL_CALL release() noexcept override; - virtual void SAL_CALL acquire() noexcept override; - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - - // XPropertySet - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; - - // XWarningsSupplier - UNSUPPORTED - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - // XMultipleResults - UNSUPPORTED - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getResultSet( ) override; - virtual sal_Int32 SAL_CALL getUpdateCount( ) override; - virtual sal_Bool SAL_CALL getMoreResults( ) override; - - // XCancellable - virtual void SAL_CALL cancel( ) override; - // XCloseable - virtual void SAL_CALL close( ) override; - - }; + class OStatementCommonBase : public OStatementCommonBase_Base, + public ::cppu::OPropertySetHelper, + public OPropertyArrayUsageHelper<OStatementCommonBase> + + { + protected: + ::osl::Mutex m_aMutex; + + rtl::Reference<OResultSet> m_xResultSet; // The last ResultSet created + // for this Statement + + ::rtl::Reference<Connection> m_pConnection; + + ISC_STATUS_ARRAY m_statusVector; + isc_stmt_handle m_aStatementHandle; + + protected: + virtual void disposeResultSet(); + /// @throws css::sdbc::SQLException + void freeStatementHandle(); + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const override; + // OPropertySetHelper + using OPropertySetHelper::getFastPropertyValue; + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + virtual sal_Bool SAL_CALL convertFastPropertyValue( + css::uno::Any & rConvertedValue, + css::uno::Any & rOldValue, + sal_Int32 nHandle, + const css::uno::Any& rValue ) override; + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + virtual void SAL_CALL getFastPropertyValue( + css::uno::Any& rValue, + sal_Int32 nHandle) const override; + virtual ~OStatementCommonBase() override; + + /// @throws css::sdbc::SQLException + void prepareAndDescribeStatement(std::u16string_view sqlIn, XSQLDA*& pOutSqlda); + + /// @throws css::sdbc::SQLException + short getSqlInfoItem(char aInfoItem); + /// @throws css::sdbc::SQLException + bool isDDLStatement(); + /// @throws css::sdbc::SQLException + sal_Int32 getStatementChangeCount(); + + public: + + explicit OStatementCommonBase(Connection* _pConnection); + using OStatementCommonBase_Base::operator css::uno::Reference< css::uno::XInterface >; + + // OComponentHelper + virtual void SAL_CALL disposing() override { + disposeResultSet(); + OStatementCommonBase_Base::disposing(); + } + // XInterface + virtual void SAL_CALL release() noexcept override; + virtual void SAL_CALL acquire() noexcept override; + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + //XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + + // XWarningsSupplier - UNSUPPORTED + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + // XMultipleResults - UNSUPPORTED + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getResultSet( ) override; + virtual sal_Int32 SAL_CALL getUpdateCount( ) override; + virtual sal_Bool SAL_CALL getMoreResults( ) override; + + // XCancellable + virtual void SAL_CALL cancel( ) override; + // XCloseable + virtual void SAL_CALL close( ) override; + + }; } diff --git a/connectivity/source/drivers/firebird/SubComponent.hxx b/connectivity/source/drivers/firebird/SubComponent.hxx index bea5d76d423d..8eec40e3275d 100644 --- a/connectivity/source/drivers/firebird/SubComponent.hxx +++ b/connectivity/source/drivers/firebird/SubComponent.hxx @@ -23,88 +23,85 @@ #include <osl/diagnose.h> #include <osl/mutex.hxx> -namespace cppu { class IPropertyArrayHelper; } -namespace com::sun::star::lang { class XComponent; } - namespace connectivity::firebird - { - /// @throws css::lang::DisposedException - void checkDisposed(bool _bThrow); +{ + /// @throws css::lang::DisposedException + void checkDisposed(bool _bThrow); - template <class TYPE> - class OPropertyArrayUsageHelper - { - protected: - static sal_Int32 s_nRefCount; - static ::cppu::IPropertyArrayHelper* s_pProps; - static ::osl::Mutex s_aMutex; - - public: - OPropertyArrayUsageHelper(); - virtual ~OPropertyArrayUsageHelper(); - - /** call this in the getInfoHelper method of your derived class. The method returns the array helper of the - class, which is created if necessary. - */ - ::cppu::IPropertyArrayHelper* getArrayHelper(); - - protected: - /** used to implement the creation of the array helper which is shared amongst all instances of the class. - This method needs to be implemented in derived classes. - <BR> - The method gets called with s_aMutex acquired. - @return a pointer to the newly created array helper. Must not be NULL. - */ - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const = 0; - }; - - template<class TYPE> - sal_Int32 OPropertyArrayUsageHelper< TYPE >::s_nRefCount = 0; - - template<class TYPE> - ::cppu::IPropertyArrayHelper* OPropertyArrayUsageHelper< TYPE >::s_pProps = nullptr; - - template<class TYPE> - ::osl::Mutex OPropertyArrayUsageHelper< TYPE >::s_aMutex; - - - template <class TYPE> - OPropertyArrayUsageHelper<TYPE>::OPropertyArrayUsageHelper() - { - ::osl::MutexGuard aGuard(s_aMutex); - ++s_nRefCount; - } + template <class TYPE> + class OPropertyArrayUsageHelper + { + protected: + static sal_Int32 s_nRefCount; + static ::cppu::IPropertyArrayHelper* s_pProps; + static ::osl::Mutex s_aMutex; + + public: + OPropertyArrayUsageHelper(); + virtual ~OPropertyArrayUsageHelper(); + + /** call this in the getInfoHelper method of your derived class. The method returns the array helper of the + class, which is created if necessary. + */ + ::cppu::IPropertyArrayHelper* getArrayHelper(); + + protected: + /** used to implement the creation of the array helper which is shared amongst all instances of the class. + This method needs to be implemented in derived classes. + <BR> + The method gets called with s_aMutex acquired. + @return a pointer to the newly created array helper. Must not be NULL. + */ + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const = 0; + }; + + template<class TYPE> + sal_Int32 OPropertyArrayUsageHelper< TYPE >::s_nRefCount = 0; + + template<class TYPE> + ::cppu::IPropertyArrayHelper* OPropertyArrayUsageHelper< TYPE >::s_pProps = nullptr; + + template<class TYPE> + ::osl::Mutex OPropertyArrayUsageHelper< TYPE >::s_aMutex; + + + template <class TYPE> + OPropertyArrayUsageHelper<TYPE>::OPropertyArrayUsageHelper() + { + ::osl::MutexGuard aGuard(s_aMutex); + ++s_nRefCount; + } - template <class TYPE> - OPropertyArrayUsageHelper<TYPE>::~OPropertyArrayUsageHelper() + template <class TYPE> + OPropertyArrayUsageHelper<TYPE>::~OPropertyArrayUsageHelper() + { + ::osl::MutexGuard aGuard(s_aMutex); + OSL_ENSURE(s_nRefCount > 0, "OPropertyArrayUsageHelper::~OPropertyArrayUsageHelper : suspicious call : have a refcount of 0 !"); + if (!--s_nRefCount) { - ::osl::MutexGuard aGuard(s_aMutex); - OSL_ENSURE(s_nRefCount > 0, "OPropertyArrayUsageHelper::~OPropertyArrayUsageHelper : suspicious call : have a refcount of 0 !"); - if (!--s_nRefCount) - { - delete s_pProps; - s_pProps = nullptr; - } + delete s_pProps; + s_pProps = nullptr; } + } - template <class TYPE> - ::cppu::IPropertyArrayHelper* OPropertyArrayUsageHelper<TYPE>::getArrayHelper() + template <class TYPE> + ::cppu::IPropertyArrayHelper* OPropertyArrayUsageHelper<TYPE>::getArrayHelper() + { + OSL_ENSURE(s_nRefCount, "OPropertyArrayUsageHelper::getArrayHelper : suspicious call : have a refcount of 0 !"); + if (!s_pProps) { - OSL_ENSURE(s_nRefCount, "OPropertyArrayUsageHelper::getArrayHelper : suspicious call : have a refcount of 0 !"); + ::osl::MutexGuard aGuard(s_aMutex); if (!s_pProps) { - ::osl::MutexGuard aGuard(s_aMutex); - if (!s_pProps) - { - s_pProps = createArrayHelper(); - OSL_ENSURE(s_pProps, "OPropertyArrayUsageHelper::getArrayHelper : createArrayHelper returned nonsense !"); - } + s_pProps = createArrayHelper(); + OSL_ENSURE(s_pProps, "OPropertyArrayUsageHelper::getArrayHelper : createArrayHelper returned nonsense !"); } - return s_pProps; } + return s_pProps; + } } diff --git a/connectivity/source/drivers/firebird/Table.cxx b/connectivity/source/drivers/firebird/Table.cxx index f88b371d5705..c12ea8439333 100644 --- a/connectivity/source/drivers/firebird/Table.cxx +++ b/connectivity/source/drivers/firebird/Table.cxx @@ -59,8 +59,8 @@ Table::Table(Tables* pTables, rName, rType, rDescription, - "", - ""), + u""_ustr, + u""_ustr), m_rMutex(rMutex), m_nPrivileges(0) { @@ -121,19 +121,19 @@ void SAL_CALL Table::alterColumnByName(const OUString& rColName, uno::Reference< XPropertySet > xColumn(m_xColumns->getByName(rColName), UNO_QUERY); // sdbcx::Descriptor - const bool bNameChanged = xColumn->getPropertyValue("Name") != rDescriptor->getPropertyValue("Name"); + const bool bNameChanged = xColumn->getPropertyValue(u"Name"_ustr) != rDescriptor->getPropertyValue(u"Name"_ustr); // sdbcx::ColumnDescriptor - const bool bTypeChanged = xColumn->getPropertyValue("Type") != rDescriptor->getPropertyValue("Type"); - const bool bTypeNameChanged = xColumn->getPropertyValue("TypeName") != rDescriptor->getPropertyValue("TypeName"); - const bool bPrecisionChanged = xColumn->getPropertyValue("Precision") != rDescriptor->getPropertyValue("Precision"); - const bool bScaleChanged = xColumn->getPropertyValue("Scale") != rDescriptor->getPropertyValue("Scale"); - const bool bIsNullableChanged = xColumn->getPropertyValue("IsNullable") != rDescriptor->getPropertyValue("IsNullable"); - const bool bIsAutoIncrementChanged = xColumn->getPropertyValue("IsAutoIncrement") != rDescriptor->getPropertyValue("IsAutoIncrement"); + const bool bTypeChanged = xColumn->getPropertyValue(u"Type"_ustr) != rDescriptor->getPropertyValue(u"Type"_ustr); + const bool bTypeNameChanged = xColumn->getPropertyValue(u"TypeName"_ustr) != rDescriptor->getPropertyValue(u"TypeName"_ustr); + const bool bPrecisionChanged = xColumn->getPropertyValue(u"Precision"_ustr) != rDescriptor->getPropertyValue(u"Precision"_ustr); + const bool bScaleChanged = xColumn->getPropertyValue(u"Scale"_ustr) != rDescriptor->getPropertyValue(u"Scale"_ustr); + const bool bIsNullableChanged = xColumn->getPropertyValue(u"IsNullable"_ustr) != rDescriptor->getPropertyValue(u"IsNullable"_ustr); + const bool bIsAutoIncrementChanged = xColumn->getPropertyValue(u"IsAutoIncrement"_ustr) != rDescriptor->getPropertyValue(u"IsAutoIncrement"_ustr); // TODO: remainder -- these are all "optional" so have to detect presence and change. - bool bDefaultChanged = xColumn->getPropertyValue("DefaultValue") - != rDescriptor->getPropertyValue("DefaultValue"); + bool bDefaultChanged = xColumn->getPropertyValue(u"DefaultValue"_ustr) + != rDescriptor->getPropertyValue(u"DefaultValue"_ustr); if (bTypeChanged || bTypeNameChanged || bPrecisionChanged || bScaleChanged) { @@ -150,32 +150,19 @@ void SAL_CALL Table::alterColumnByName(const OUString& rColName, if (bIsNullableChanged) { sal_Int32 nNullable = 0; - rDescriptor->getPropertyValue("IsNullable") >>= nNullable; + rDescriptor->getPropertyValue(u"IsNullable"_ustr) >>= nNullable; if (nNullable != ColumnValue::NULLABLE_UNKNOWN) { - OUString sSql; - // Dirty hack: can't change null directly in sql, we have to fiddle - // the system tables manually. + OUString sSql(getAlterTableColumn(rColName)); if (nNullable == ColumnValue::NULLABLE) { - sSql = "UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = NULL " - "WHERE RDB$FIELD_NAME = '" + rColName + "' " - "AND RDB$RELATION_NAME = '" + getName() + "'"; + sSql += "DROP NOT NULL"; } else if (nNullable == ColumnValue::NO_NULLS) { - // And if we are making NOT NULL then we have to make sure we have - // no nulls left in the column. - OUString sFillNulls("UPDATE \"" + getName() + "\" SET \"" - + rColName + "\" = 0 " - "WHERE \"" + rColName + "\" IS NULL"); - getConnection()->createStatement()->execute(sFillNulls); - - sSql = "UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 " - "WHERE RDB$FIELD_NAME = '" + rColName + "' " - "AND RDB$RELATION_NAME = '" + getName() + "'"; + sSql += "SET NOT NULL"; } getConnection()->createStatement()->execute(sSql); } @@ -188,7 +175,7 @@ void SAL_CALL Table::alterColumnByName(const OUString& rColName, if (bIsAutoIncrementChanged) { ::dbtools::throwSQLException( - "Changing autoincrement property of existing column is not supported", + u"Changing autoincrement property of existing column is not supported"_ustr, ::dbtools::StandardSQLState::FUNCTION_NOT_SUPPORTED, *this); @@ -197,7 +184,7 @@ void SAL_CALL Table::alterColumnByName(const OUString& rColName, if (bDefaultChanged) { OUString sNewDefault; - rDescriptor->getPropertyValue("DefaultValue") >>= sNewDefault; + rDescriptor->getPropertyValue(u"DefaultValue"_ustr) >>= sNewDefault; OUString sSql; if (sNewDefault.isEmpty()) @@ -211,7 +198,7 @@ void SAL_CALL Table::alterColumnByName(const OUString& rColName, if (bNameChanged) { OUString sNewColName; - rDescriptor->getPropertyValue("Name") >>= sNewColName; + rDescriptor->getPropertyValue(u"Name"_ustr) >>= sNewColName; OUString sSql(getAlterTableColumn(rColName) + " TO \"" + sNewColName + "\""); @@ -225,7 +212,7 @@ void SAL_CALL Table::alterColumnByName(const OUString& rColName, // ----- XRename -------------------------------------------------------------- void SAL_CALL Table::rename(const OUString&) { - throw RuntimeException("Table renaming not supported by Firebird."); + throw RuntimeException(u"Table renaming not supported by Firebird."_ustr); } // ----- XInterface ----------------------------------------------------------- @@ -237,23 +224,6 @@ Any SAL_CALL Table::queryInterface(const Type& rType) return OTableHelper::queryInterface(rType); } -// ----- XTypeProvider -------------------------------------------------------- -uno::Sequence< Type > SAL_CALL Table::getTypes() -{ - uno::Sequence< Type > aTypes = OTableHelper::getTypes(); - - for (int i = 0; i < aTypes.getLength(); i++) - { - if (aTypes[i].getTypeName() == "com.sun.star.sdbcx.XRename") - { - ::comphelper::removeElementAt(aTypes, i); - break; - } - } - - return OTableHelper::getTypes(); -} - OUString Table::getAlterTableColumn(std::u16string_view rColumn) { return ("ALTER TABLE \"" + getName() + "\" ALTER COLUMN \"" + rColumn + "\" "); diff --git a/connectivity/source/drivers/firebird/Table.hxx b/connectivity/source/drivers/firebird/Table.hxx index b641981769af..024f905a88b5 100644 --- a/connectivity/source/drivers/firebird/Table.hxx +++ b/connectivity/source/drivers/firebird/Table.hxx @@ -18,67 +18,63 @@ #include <connectivity/TTableHelper.hxx> namespace connectivity::firebird +{ + + /** + * Implements sdbcx.Table. We don't support table renaming (XRename) + * hence the appropriate methods are overridden. + */ + class Table: public OTableHelper { + private: + ::osl::Mutex& m_rMutex; + sal_Int32 m_nPrivileges; /** - * Implements sdbcx.Table. We don't support table renaming (XRename) - * hence the appropriate methods are overridden. + * Get the ALTER TABLE [TABLE] ALTER [COLUMN] String. + * Includes a trailing space. + */ + OUString getAlterTableColumn(std::u16string_view rColumn); + + protected: + void construct() override; + + public: + Table(Tables* pTables, + ::osl::Mutex& rMutex, + const css::uno::Reference< css::sdbc::XConnection >& _xConnection); + Table(Tables* pTables, + ::osl::Mutex& rMutex, + const css::uno::Reference< css::sdbc::XConnection >& _xConnection, + const OUString& rName, + const OUString& rType, + const OUString& rDescription); + + // OTableHelper + virtual ::connectivity::sdbcx::OCollection* createColumns( + const ::std::vector< OUString>& rNames) override; + virtual ::connectivity::sdbcx::OCollection* createKeys( + const ::std::vector< OUString>& rNames) override; + virtual ::connectivity::sdbcx::OCollection* createIndexes( + const ::std::vector< OUString>& rNames) override; + + // XAlterTable + /** + * See css::sdbcx::ColumnDescriptor for details of + * rDescriptor. */ - class Table: public OTableHelper - { - private: - ::osl::Mutex& m_rMutex; - sal_Int32 m_nPrivileges; - - /** - * Get the ALTER TABLE [TABLE] ALTER [COLUMN] String. - * Includes a trailing space. - */ - OUString getAlterTableColumn(std::u16string_view rColumn); - - protected: - void construct() override; - - public: - Table(Tables* pTables, - ::osl::Mutex& rMutex, - const css::uno::Reference< css::sdbc::XConnection >& _xConnection); - Table(Tables* pTables, - ::osl::Mutex& rMutex, - const css::uno::Reference< css::sdbc::XConnection >& _xConnection, - const OUString& rName, - const OUString& rType, - const OUString& rDescription); - - // OTableHelper - virtual ::connectivity::sdbcx::OCollection* createColumns( - const ::std::vector< OUString>& rNames) override; - virtual ::connectivity::sdbcx::OCollection* createKeys( - const ::std::vector< OUString>& rNames) override; - virtual ::connectivity::sdbcx::OCollection* createIndexes( - const ::std::vector< OUString>& rNames) override; - - // XAlterTable - /** - * See css::sdbcx::ColumnDescriptor for details of - * rDescriptor. - */ - virtual void SAL_CALL alterColumnByName( - const OUString& rColName, - const css::uno::Reference< css::beans::XPropertySet >& rDescriptor) override; - - // XRename -- UNSUPPORTED - virtual void SAL_CALL rename(const OUString& sName) override; - - //XInterface - virtual css::uno::Any - SAL_CALL queryInterface(const css::uno::Type & rType) override; - - //XTypeProvider - virtual css::uno::Sequence< css::uno::Type > - SAL_CALL getTypes() override; - - }; + virtual void SAL_CALL alterColumnByName( + const OUString& rColName, + const css::uno::Reference< css::beans::XPropertySet >& rDescriptor) override; + + // XRename -- UNSUPPORTED + virtual void SAL_CALL rename(const OUString& sName) override; + + //XInterface + virtual css::uno::Any + SAL_CALL queryInterface(const css::uno::Type & rType) override; + + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/Tables.cxx b/connectivity/source/drivers/firebird/Tables.cxx index ebd6f2309cc8..3675882446f4 100644 --- a/connectivity/source/drivers/firebird/Tables.cxx +++ b/connectivity/source/drivers/firebird/Tables.cxx @@ -9,8 +9,8 @@ #include "Table.hxx" #include "Tables.hxx" +#include "Views.hxx" #include "Catalog.hxx" -#include "Util.hxx" #include <TConnection.hxx> @@ -30,7 +30,6 @@ using namespace ::osl; using namespace ::com::sun::star; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::uno; @@ -42,7 +41,7 @@ void Tables::impl_refresh() static_cast<Catalog&>(m_rParent).refreshTables(); } -ObjectType Tables::createObject(const OUString& rName) +css::uno::Reference< css::beans::XPropertySet > Tables::createObject(const OUString& rName) { // Only retrieving a single table, so table type is irrelevant (param 4) uno::Reference< XResultSet > xTables = m_xMetaData->getTables(Any(), @@ -51,14 +50,14 @@ ObjectType Tables::createObject(const OUString& rName) uno::Sequence< OUString >()); if (!xTables.is()) - throw RuntimeException("Could not acquire table."); + throw RuntimeException(u"Could not acquire table."_ustr); uno::Reference< XRow > xRow(xTables,UNO_QUERY_THROW); if (!xTables->next()) throw RuntimeException(); - ObjectType xRet(new Table(this, + css::uno::Reference< css::beans::XPropertySet > xRet(new Table(this, m_rMutex, m_xMetaData->getConnection(), xRow->getString(3), // Name @@ -66,7 +65,7 @@ ObjectType Tables::createObject(const OUString& rName) xRow->getString(5))); // Description / Remarks / Comments if (xTables->next()) - throw RuntimeException("Found more tables than expected."); + throw RuntimeException(u"Found more tables than expected."_ustr); return xRet; } @@ -90,9 +89,8 @@ OUString Tables::createStandardColumnPart(const Reference< XPropertySet >& xColP if ( xPropInfo.is() && xPropInfo->hasPropertyByName(rPropMap.getNameByIndex(PROPERTY_ID_AUTOINCREMENTCREATION)) ) xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_AUTOINCREMENTCREATION)) >>= sAutoIncrementValue; - aSql.append(" "); - - aSql.append(dbtools::createStandardTypePart(xColProp, _xConnection)); + aSql.append(" " + + dbtools::createStandardTypePart(xColProp, _xConnection)); // Add character set for (VAR)BINARY (fix) types: // (VAR) BINARY is distinguished from other CHAR types by its character set. // Octets is a special character set for binary data. @@ -104,15 +102,13 @@ OUString Tables::createStandardColumnPart(const Reference< XPropertySet >& xColP >>= aType; if(aType == DataType::BINARY || aType == DataType::VARBINARY) { - aSql.append(" "); - aSql.append("CHARACTER SET OCTETS"); + aSql.append(" CHARACTER SET OCTETS"); } } if ( bIsAutoIncrement && !sAutoIncrementValue.isEmpty()) { - aSql.append(" "); - aSql.append(sAutoIncrementValue); + aSql.append(" " + sAutoIncrementValue); } // AutoIncrement "IDENTITY" is implicitly "NOT NULL" else if(::comphelper::getINT32(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_ISNULLABLE))) == ColumnValue::NO_NULLS) @@ -130,14 +126,14 @@ uno::Reference< XPropertySet > Tables::createDescriptor() } //----- XAppend --------------------------------------------------------------- -ObjectType Tables::appendObject(const OUString& rName, +css::uno::Reference< css::beans::XPropertySet > Tables::appendObject(const OUString& rName, const uno::Reference< XPropertySet >& rDescriptor) { /* OUString sSql(::dbtools::createSqlCreateTableStatement(rDescriptor, m_xMetaData->getConnection())); */ OUStringBuffer aSqlBuffer("CREATE TABLE "); OUString sCatalog, sSchema, sComposedName, sTable; - const Reference< XConnection>& xConnection = m_xMetaData->getConnection(); + const Reference< XConnection> xConnection = m_xMetaData->getConnection(); ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); @@ -149,11 +145,11 @@ ObjectType Tables::appendObject(const OUString& rName, if ( sComposedName.isEmpty() ) ::dbtools::throwFunctionSequenceException(xConnection); - aSqlBuffer.append(sComposedName); - aSqlBuffer.append(" ("); + aSqlBuffer.append(sComposedName + + " ("); // columns - Reference<XColumnsSupplier> xColumnSup(rDescriptor,UNO_QUERY); + Reference<XColumnsSupplier> xColumnSup(rDescriptor, UNO_QUERY_THROW); Reference<XIndexAccess> xColumns(xColumnSup->getColumns(),UNO_QUERY); // check if there are columns if(!xColumns.is() || !xColumns->getCount()) @@ -166,24 +162,23 @@ ObjectType Tables::appendObject(const OUString& rName, { if ( (xColumns->getByIndex(i) >>= xColProp) && xColProp.is() ) { - aSqlBuffer.append(createStandardColumnPart(xColProp,xConnection)); - aSqlBuffer.append(","); + aSqlBuffer.append(createStandardColumnPart(xColProp,xConnection) + + ","); } } - OUString sSql = aSqlBuffer.makeStringAndClear(); const OUString sKeyStmt = ::dbtools::createStandardKeyStatement(rDescriptor,xConnection); if ( !sKeyStmt.isEmpty() ) - sSql += sKeyStmt; + aSqlBuffer.append(sKeyStmt); else { - if ( sSql.endsWith(",") ) - sSql = sSql.replaceAt(sSql.getLength()-1, 1, u")"); + if (aSqlBuffer[aSqlBuffer.getLength() - 1] == ',') + aSqlBuffer[aSqlBuffer.getLength() - 1] = ')'; else - sSql += ")"; + aSqlBuffer.append(")"); } - m_xMetaData->getConnection()->createStatement()->execute(sSql); + m_xMetaData->getConnection()->createStatement()->execute(OUString::unacquired(aSqlBuffer)); return createObject(rName); } @@ -197,12 +192,33 @@ void Tables::dropObject(sal_Int32 nPosition, const OUString& sName) return; OUString sType; - xTable->getPropertyValue("Type") >>= sType; + xTable->getPropertyValue(u"Type"_ustr) >>= sType; const OUString sQuoteString = m_xMetaData->getIdentifierQuoteString(); m_xMetaData->getConnection()->createStatement()->execute( - "DROP " + sType + ::dbtools::quoteName(sQuoteString,sName)); + "DROP " + sType + " " + ::dbtools::quoteName(sQuoteString,sName)); + + if (sType == "VIEW") + { + Views* pViews = static_cast<Views*>(static_cast<Catalog&>(m_rParent).getPrivateViews()); + if ( pViews && pViews->hasByName(sName) ) + pViews->dropByNameImpl(sName); + } } +void connectivity::firebird::Tables::appendNew(const OUString& _rsNewTable) +{ + insertElement(_rsNewTable, nullptr); + + // notify our container listeners + css::container::ContainerEvent aEvent(static_cast<XContainer*>(this), + css::uno::Any(_rsNewTable), css::uno::Any(), + css::uno::Any()); + comphelper::OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners); + while (aListenerLoop.hasMoreElements()) + aListenerLoop.next()->elementInserted(aEvent); +} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Tables.hxx b/connectivity/source/drivers/firebird/Tables.hxx index d7fe019ef2a6..057d35c1ad33 100644 --- a/connectivity/source/drivers/firebird/Tables.hxx +++ b/connectivity/source/drivers/firebird/Tables.hxx @@ -13,45 +13,48 @@ #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> #include <connectivity/sdbcx/VCollection.hxx> +#include <utility> namespace connectivity::firebird +{ + + /** + * This implements com.sun.star.sdbcx.Container, which seems to be + * also known by the name of Tables and Collection. + */ + class Tables: public ::connectivity::sdbcx::OCollection { + protected: + css::uno::Reference< css::sdbc::XDatabaseMetaData > + m_xMetaData; + + static OUString createStandardColumnPart(const css::uno::Reference< css::beans::XPropertySet >& xColProp,const css::uno::Reference< css::sdbc::XConnection>& _xConnection); + + // OCollection + virtual void impl_refresh() override; + virtual css::uno::Reference< css::beans::XPropertySet > createObject( + const OUString& rName) override; + virtual css::uno::Reference< css::beans::XPropertySet > + createDescriptor() override; + virtual css::uno::Reference< css::beans::XPropertySet > appendObject( + const OUString& rName, + const css::uno::Reference< css::beans::XPropertySet >& rDescriptor) override; + + public: + Tables(css::uno::Reference< css::sdbc::XDatabaseMetaData > xMetaData, + ::cppu::OWeakObject& rParent, + ::osl::Mutex& rMutex, + ::std::vector< OUString> const & rNames) : sdbcx::OCollection(rParent, true, rMutex, rNames), m_xMetaData(std::move(xMetaData)) {} + + // TODO: we should also implement XDataDescriptorFactory, XRefreshable, + // XAppend, etc., but all are optional. + + // XDrop + virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; + + void appendNew(const OUString& _rsNewTable); - /** - * This implements com.sun.star.sdbcx.Container, which seems to be - * also known by the name of Tables and Collection. - */ - class Tables: public ::connectivity::sdbcx::OCollection - { - protected: - css::uno::Reference< css::sdbc::XDatabaseMetaData > - m_xMetaData; - - static OUString createStandardColumnPart(const css::uno::Reference< css::beans::XPropertySet >& xColProp,const css::uno::Reference< com::sun::star::sdbc::XConnection>& _xConnection); - - // OCollection - virtual void impl_refresh() override; - virtual ::connectivity::sdbcx::ObjectType createObject( - const OUString& rName) override; - virtual css::uno::Reference< css::beans::XPropertySet > - createDescriptor() override; - virtual ::connectivity::sdbcx::ObjectType appendObject( - const OUString& rName, - const css::uno::Reference< css::beans::XPropertySet >& rDescriptor) override; - - public: - Tables(const css::uno::Reference< css::sdbc::XDatabaseMetaData >& rMetaData, - ::cppu::OWeakObject& rParent, - ::osl::Mutex& rMutex, - ::std::vector< OUString> const & rNames) : sdbcx::OCollection(rParent, true, rMutex, rNames), m_xMetaData(rMetaData) {} - - // TODO: we should also implement XDataDescriptorFactory, XRefreshable, - // XAppend, etc., but all are optional. - - // XDrop - virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; - - }; + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/User.hxx b/connectivity/source/drivers/firebird/User.hxx index e47565f5d52e..537c6f9aa1d8 100644 --- a/connectivity/source/drivers/firebird/User.hxx +++ b/connectivity/source/drivers/firebird/User.hxx @@ -13,33 +13,33 @@ #include <com/sun/star/sdbc/XConnection.hpp> namespace connectivity::firebird +{ + + /** + * This implements com.sun.star.sdbcx.Container. + */ + class User: public ::connectivity::sdbcx::OUser { + css::uno::Reference< css::sdbc::XConnection > m_xConnection; + public: + /** + * Create a "new" descriptor, which isn't yet in the database. + */ + User(const css::uno::Reference< css::sdbc::XConnection >& rConnection); /** - * This implements com.sun.star.sdbcx.Container. + * For a user that already exists in the db. */ - class User: public ::connectivity::sdbcx::OUser - { - css::uno::Reference< css::sdbc::XConnection > m_xConnection; - - public: - /** - * Create a "new" descriptor, which isn't yet in the database. - */ - User(const css::uno::Reference< css::sdbc::XConnection >& rConnection); - /** - * For a user that already exists in the db. - */ - User(const css::uno::Reference< css::sdbc::XConnection >& rConnection, const OUString& rName); - - // XAuthorizable - virtual void SAL_CALL changePassword(const OUString&, const OUString& newPassword) override; - virtual sal_Int32 SAL_CALL getPrivileges(const OUString&, sal_Int32) override; - virtual sal_Int32 SAL_CALL getGrantablePrivileges(const OUString&, sal_Int32) override; - - // IRefreshableGroups:: - virtual void refreshGroups() override; - }; + User(const css::uno::Reference< css::sdbc::XConnection >& rConnection, const OUString& rName); + + // XAuthorizable + virtual void SAL_CALL changePassword(const OUString&, const OUString& newPassword) override; + virtual sal_Int32 SAL_CALL getPrivileges(const OUString&, sal_Int32) override; + virtual sal_Int32 SAL_CALL getGrantablePrivileges(const OUString&, sal_Int32) override; + + // IRefreshableGroups:: + virtual void refreshGroups() override; + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/Users.cxx b/connectivity/source/drivers/firebird/Users.cxx index 50cfef84be8c..265bae760946 100644 --- a/connectivity/source/drivers/firebird/Users.cxx +++ b/connectivity/source/drivers/firebird/Users.cxx @@ -17,8 +17,6 @@ using namespace ::cppu; using namespace ::osl; using namespace ::com::sun::star; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::uno; @@ -41,7 +39,7 @@ void Users::impl_refresh() // TODO: IMPLEMENT ME } -ObjectType Users::createObject(const OUString& rName) +css::uno::Reference< css::beans::XPropertySet > Users::createObject(const OUString& rName) { return new User(m_xMetaData->getConnection(), rName); } @@ -55,7 +53,7 @@ uno::Reference< XPropertySet > Users::createDescriptor() } //----- XAppend --------------------------------------------------------------- -ObjectType Users::appendObject(const OUString& rName, +css::uno::Reference< css::beans::XPropertySet > Users::appendObject(const OUString& rName, const uno::Reference< XPropertySet >&) { // TODO: set sSql as appropriate diff --git a/connectivity/source/drivers/firebird/Users.hxx b/connectivity/source/drivers/firebird/Users.hxx index 7e78444d1199..a3c65460e162 100644 --- a/connectivity/source/drivers/firebird/Users.hxx +++ b/connectivity/source/drivers/firebird/Users.hxx @@ -13,40 +13,40 @@ #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> namespace connectivity::firebird - { +{ - /** - * This implements com.sun.star.sdbcx.Container. - */ - class Users: public ::connectivity::sdbcx::OCollection - { - css::uno::Reference< css::sdbc::XDatabaseMetaData > - m_xMetaData; - protected: - - // OCollection - virtual void impl_refresh() override; - virtual ::connectivity::sdbcx::ObjectType createObject( - const OUString& rName) override; - virtual css::uno::Reference< css::beans::XPropertySet > - createDescriptor() override; - virtual ::connectivity::sdbcx::ObjectType appendObject( - const OUString& rName, - const css::uno::Reference< css::beans::XPropertySet >& rDescriptor) override; - - public: - Users(const css::uno::Reference< css::sdbc::XDatabaseMetaData >& rMetaData, - ::cppu::OWeakObject& rParent, - ::osl::Mutex& rMutex, - ::std::vector< OUString> const & rNames); - - // TODO: we should also implement XDataDescriptorFactory, XRefreshable, - // XAppend, etc., but all are optional. - - // XDrop - virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; - - }; + /** + * This implements com.sun.star.sdbcx.Container. + */ + class Users: public ::connectivity::sdbcx::OCollection + { + css::uno::Reference< css::sdbc::XDatabaseMetaData > + m_xMetaData; + protected: + + // OCollection + virtual void impl_refresh() override; + virtual css::uno::Reference< css::beans::XPropertySet > createObject( + const OUString& rName) override; + virtual css::uno::Reference< css::beans::XPropertySet > + createDescriptor() override; + virtual ::css::uno::Reference< css::beans::XPropertySet > appendObject( + const OUString& rName, + const css::uno::Reference< css::beans::XPropertySet >& rDescriptor) override; + + public: + Users(const css::uno::Reference< css::sdbc::XDatabaseMetaData >& rMetaData, + ::cppu::OWeakObject& rParent, + ::osl::Mutex& rMutex, + ::std::vector< OUString> const & rNames); + + // TODO: we should also implement XDataDescriptorFactory, XRefreshable, + // XAppend, etc., but all are optional. + + // XDrop + virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; + + }; } // namespace connectivity::firebird diff --git a/connectivity/source/drivers/firebird/Util.cxx b/connectivity/source/drivers/firebird/Util.cxx index 2d694eac94ec..8f11068e80f0 100644 --- a/connectivity/source/drivers/firebird/Util.cxx +++ b/connectivity/source/drivers/firebird/Util.cxx @@ -13,6 +13,7 @@ #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/SQLException.hpp> +#include <o3tl/string_view.hxx> using namespace ::connectivity; @@ -22,12 +23,12 @@ using namespace ::com::sun::star::uno; using namespace firebird; -OUString firebird::sanitizeIdentifier(const OUString& rIdentifier) +OUString firebird::sanitizeIdentifier(std::u16string_view rIdentifier) { - OUString sRet = rIdentifier.trim(); - assert(sRet.getLength() <= 31); // Firebird identifiers cannot be longer than this. + std::u16string_view sRet = o3tl::trim(rIdentifier); + assert(sRet.size() <= 31); // Firebird identifiers cannot be longer than this. - return sRet; + return OUString(sRet); } OUString firebird::StatusVectorToString(const ISC_STATUS_ARRAY& rStatusVector, @@ -43,8 +44,8 @@ OUString firebird::StatusVectorToString(const ISC_STATUS_ARRAY& rStatusVector, while(fb_interpret(msg, sizeof(msg), &pStatus)) { // TODO: verify encoding - buf.append("\n*"); - buf.append(OUString(msg, strlen(msg), RTL_TEXTENCODING_UTF8)); + buf.append("\n*" + + OUString(msg, strlen(msg), RTL_TEXTENCODING_UTF8)); } } catch (...) @@ -185,57 +186,57 @@ OUString firebird::ColumnTypeInfo::getColumnTypeName() const switch (nDataType) { case DataType::BIT: - return "BIT"; + return u"BIT"_ustr; case DataType::TINYINT: - return "TINYINT"; + return u"TINYINT"_ustr; case DataType::SMALLINT: - return "SMALLINT"; + return u"SMALLINT"_ustr; case DataType::INTEGER: - return "INTEGER"; + return u"INTEGER"_ustr; case DataType::BIGINT: - return "BIGINT"; + return u"BIGINT"_ustr; case DataType::FLOAT: - return "FLOAT"; + return u"FLOAT"_ustr; case DataType::REAL: - return "REAL"; + return u"REAL"_ustr; case DataType::DOUBLE: - return "DOUBLE"; + return u"DOUBLE"_ustr; case DataType::NUMERIC: - return "NUMERIC"; + return u"NUMERIC"_ustr; case DataType::DECIMAL: - return "DECIMAL"; + return u"DECIMAL"_ustr; case DataType::CHAR: - return "CHAR"; + return u"CHAR"_ustr; case DataType::VARCHAR: - return "VARCHAR"; + return u"VARCHAR"_ustr; case DataType::LONGVARCHAR: - return "LONGVARCHAR"; + return u"LONGVARCHAR"_ustr; case DataType::DATE: - return "DATE"; + return u"DATE"_ustr; case DataType::TIME: - return "TIME"; + return u"TIME"_ustr; case DataType::TIMESTAMP: - return "TIMESTAMP"; + return u"TIMESTAMP"_ustr; case DataType::BINARY: // in Firebird, that is the same datatype "CHAR" as DataType::CHAR, // only with CHARACTER SET OCTETS; we use the synonym CHARACTER // to fool LO into seeing it as different types. - return "CHARACTER"; + return u"CHARACTER"_ustr; case DataType::VARBINARY: // see above comment about DataType::BINARY. - return "CHARACTER VARYING"; + return u"CHARACTER VARYING"_ustr; case DataType::LONGVARBINARY: return "BLOB SUB_TYPE " + OUString::number(static_cast<short>(BlobSubtype::Image)); case DataType::ARRAY: - return "ARRAY"; + return u"ARRAY"_ustr; case DataType::BLOB: - return "BLOB SUB_TYPE BINARY"; + return u"BLOB SUB_TYPE BINARY"_ustr; case DataType::CLOB: - return "BLOB SUB_TYPE TEXT"; + return u"BLOB SUB_TYPE TEXT"_ustr; case DataType::BOOLEAN: - return "BOOLEAN"; + return u"BOOLEAN"_ustr; case DataType::SQLNULL: - return "NULL"; + return u"NULL"_ustr; default: assert(false); // Should never happen return OUString(); @@ -316,8 +317,6 @@ void firebird::mallocSQLVAR(XSQLDA* pSqlda) pVar->sqldata = static_cast<char *>(malloc(sizeof(float))); break; case SQL_DOUBLE: - pVar->sqldata = static_cast<char *>(malloc(sizeof(double))); - break; case SQL_D_FLOAT: pVar->sqldata = static_cast<char *>(malloc(sizeof(double))); break; @@ -342,8 +341,9 @@ void firebird::mallocSQLVAR(XSQLDA* pSqlda) case SQL_BOOLEAN: pVar->sqldata = static_cast<char *>(malloc(sizeof(sal_Bool))); break; + // See https://www.firebirdsql.org/file/documentation/html/en/refdocs/fblangref25/firebird-25-language-reference.html#fblangref25-datatypes-special-sqlnull case SQL_NULL: - assert(false); // TODO: implement + pVar->sqldata = nullptr; break; case SQL_QUAD: assert(false); // TODO: implement @@ -388,7 +388,8 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda) } break; case SQL_NULL: - assert(false); // TODO: implement + // See SQL_NULL case in mallocSQLVAR + assert(pVar->sqldata == nullptr); break; case SQL_QUAD: assert(false); // TODO: implement @@ -407,31 +408,4 @@ void firebird::freeSQLVAR(XSQLDA* pSqlda) } } - -OUString firebird::escapeWith( const OUString& sText, const char aKey, const char aEscapeChar) -{ - OUString sRet(sText); - sal_Int32 aIndex = 0; - for (;;) - { - aIndex = sRet.indexOf(aKey, aIndex); - if ( aIndex <= 0 || aIndex >= sRet.getLength()) - break; - sRet = sRet.replaceAt(aIndex, 1, rtl::OUStringConcatenation(OUStringChar(aEscapeChar) + OUStringChar(aKey)) ); - aIndex += 2; - } - - return sRet; -} - -sal_Int64 firebird::pow10Integer(int nDecimalCount) -{ - sal_Int64 nRet = 1; - for(int i=0; i< nDecimalCount; i++) - { - nRet *= 10; - } - return nRet; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Util.hxx b/connectivity/source/drivers/firebird/Util.hxx index 46fadebb1a20..b41afc07dbb9 100644 --- a/connectivity/source/drivers/firebird/Util.hxx +++ b/connectivity/source/drivers/firebird/Util.hxx @@ -14,112 +14,109 @@ #include <rtl/ustring.hxx> #include <com/sun/star/uno/XInterface.hpp> +#include <utility> namespace connectivity::firebird - { - // Type Blob has 2 subtypes values - // 0 for BLOB, 1 for CLOB - // see http://www.firebirdfaq.org/faq48/ - // User-defined subtypes are negative. - // Use a number for image which is very unlikely to be defined by a - // user. - enum class BlobSubtype { - Blob = 0, - Clob = 1, - Image = -9546 - }; - - /** - * Numeric and decimal types can be identified by their subtype in - * Firebird API. 1 for NUMERIC, 2 for DECIMAL. - */ - enum class NumberSubType { - Other = 0, - Numeric = 1, - Decimal = 2 - }; - - class ColumnTypeInfo { +{ + // Type Blob has 2 subtypes values + // 0 for BLOB, 1 for CLOB + // see http://www.firebirdfaq.org/faq48/ + // User-defined subtypes are negative. + // Use a number for image which is very unlikely to be defined by a + // user. + enum class BlobSubtype { + Blob = 0, + Clob = 1, + Image = -9546 + }; + + /** + * Numeric and decimal types can be identified by their subtype in + * Firebird API. 1 for NUMERIC, 2 for DECIMAL. + */ + enum class NumberSubType { + Other = 0, + Numeric = 1, + Decimal = 2 + }; + + class ColumnTypeInfo { private: - short m_aType; - short m_aSubType; - short m_nScale; - OUString m_sCharsetName; + short m_aType; + short m_aSubType; + short m_nScale; + OUString m_sCharsetName; public: - /** - * @param tType SQL type of column defined by Firebird (e.g. - * SQL_DOUBLE) - * @param aSubType SQL sub type as in firebird API. See - * NumberSubType. - * @param scale: Scale of the number. It is ignored in case it's not - * a number. Scale obtained from the Firebird API is negative, so - * that should be negated before passing to this constructor. - * - */ - explicit ColumnTypeInfo( short aType, short aSubType = 0, - short nScale = 0, const OUString& sCharset = OUString() ) - : m_aType(aType) - , m_aSubType(aSubType) - , m_nScale(nScale) - , m_sCharsetName(sCharset) {} - explicit ColumnTypeInfo( short aType, const OUString& sCharset ) - : m_aType(aType) - , m_aSubType(0) - , m_nScale(0) - , m_sCharsetName(sCharset) {} - short getType() const { return m_aType; } - short getSubType() const { return m_aSubType; } - short getScale() const { return m_nScale; } - OUString const & getCharacterSet() const { return m_sCharsetName; } - - sal_Int32 getSdbcType() const; - OUString getColumnTypeName() const; - - }; - - /** - * Make sure an identifier is safe to use within the database. Currently - * firebird seems to return identifiers with 93 character (instead of - * 31), whereby the name is simply padded with trailing whitespace. - * This removes all trailing whitespace (i.e. if necessary so that - * the length is below 31 characters). Firebird automatically compensates - * for such shorter strings, however any trailing padding makes the gui - * editing of such names harder, hence we remove all trailing whitespace. - */ - OUString sanitizeIdentifier(const OUString& rIdentifier); - - inline bool IndicatesError(const ISC_STATUS_ARRAY& rStatusVector) - { - return rStatusVector[0]==1 && rStatusVector[1]; // indicates error; - } - - OUString StatusVectorToString(const ISC_STATUS_ARRAY& rStatusVector, - std::u16string_view rCause); - /** - * Evaluate a firebird status vector and throw exceptions as necessary. - * The content of the status vector is included in the thrown exception. + * @param tType SQL type of column defined by Firebird (e.g. + * SQL_DOUBLE) + * @param aSubType SQL sub type as in firebird API. See + * NumberSubType. + * @param scale: Scale of the number. It is ignored in case it's not + * a number. Scale obtained from the Firebird API is negative, so + * that should be negated before passing to this constructor. * - * @throws css::sdbc::SQLException - */ - void evaluateStatusVector(const ISC_STATUS_ARRAY& rStatusVector, - std::u16string_view aCause, - const css::uno::Reference< css::uno::XInterface >& _rxContext); - - /** - * Internally (i.e. in RDB$FIELD_TYPE) firebird stores the data type - * for a column as defined in blr_*, however in the firebird - * api the SQL_* types are used, hence we need to be able to convert - * between the two when retrieving column metadata. */ - short getFBTypeFromBlrType(short blrType); - - void mallocSQLVAR(XSQLDA* pSqlda); - - void freeSQLVAR(XSQLDA* pSqlda); - - OUString escapeWith( const OUString& sText, const char aKey, const char aEscapeChar); - sal_Int64 pow10Integer( int nDecimalCount ); + explicit ColumnTypeInfo( short aType, short aSubType = 0, + short nScale = 0, OUString sCharset = OUString() ) + : m_aType(aType) + , m_aSubType(aSubType) + , m_nScale(nScale) + , m_sCharsetName(std::move(sCharset)) {} + explicit ColumnTypeInfo(const XSQLVAR& var, OUString sCharset = {}) + : ColumnTypeInfo(var.sqltype, var.sqlsubtype, -var.sqlscale, std::move(sCharset)) {} + explicit ColumnTypeInfo(const XSQLDA* pXSQLDA, sal_Int32 column, OUString sCharset = {}) + : ColumnTypeInfo(pXSQLDA->sqlvar[column-1], std::move(sCharset)) {} + short getType() const { return m_aType; } + short getSubType() const { return m_aSubType; } + short getScale() const { return m_nScale; } + OUString const & getCharacterSet() const { return m_sCharsetName; } + + sal_Int32 getSdbcType() const; + OUString getColumnTypeName() const; + + }; + + /** + * Make sure an identifier is safe to use within the database. Currently + * firebird seems to return identifiers with 93 character (instead of + * 31), whereby the name is simply padded with trailing whitespace. + * This removes all trailing whitespace (i.e. if necessary so that + * the length is below 31 characters). Firebird automatically compensates + * for such shorter strings, however any trailing padding makes the gui + * editing of such names harder, hence we remove all trailing whitespace. + */ + OUString sanitizeIdentifier(std::u16string_view rIdentifier); + + inline bool IndicatesError(const ISC_STATUS_ARRAY& rStatusVector) + { + return rStatusVector[0]==1 && rStatusVector[1]; // indicates error; + } + + OUString StatusVectorToString(const ISC_STATUS_ARRAY& rStatusVector, + std::u16string_view rCause); + + /** + * Evaluate a firebird status vector and throw exceptions as necessary. + * The content of the status vector is included in the thrown exception. + * + * @throws css::sdbc::SQLException + */ + void evaluateStatusVector(const ISC_STATUS_ARRAY& rStatusVector, + std::u16string_view aCause, + const css::uno::Reference< css::uno::XInterface >& _rxContext); + + /** + * Internally (i.e. in RDB$FIELD_TYPE) firebird stores the data type + * for a column as defined in blr_*, however in the firebird + * api the SQL_* types are used, hence we need to be able to convert + * between the two when retrieving column metadata. + */ + short getFBTypeFromBlrType(short blrType); + + void mallocSQLVAR(XSQLDA* pSqlda); + + void freeSQLVAR(XSQLDA* pSqlda); } diff --git a/connectivity/source/drivers/firebird/View.cxx b/connectivity/source/drivers/firebird/View.cxx new file mode 100644 index 000000000000..6dcbf6bce2b2 --- /dev/null +++ b/connectivity/source/drivers/firebird/View.cxx @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include "View.hxx" + +#include <propertyids.hxx> + +#include <com/sun/star/sdbc/XRow.hpp> + +namespace connectivity::firebird +{ +View::View(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, bool _bCaseSensitive, + const OUString& _rSchemaName, const OUString& _rName) + : View_Base(_bCaseSensitive, _rName, _rxConnection->getMetaData(), OUString(), _rSchemaName, + OUString()) + , m_xConnection(_rxConnection) +{ +} + +View::~View() {} + +void SAL_CALL View::acquire() noexcept { View_Base::acquire(); }; +void SAL_CALL View::release() noexcept { View_Base::release(); }; +css::uno::Any SAL_CALL View::queryInterface(const css::uno::Type& _rType) +{ + css::uno::Any aReturn = View_Base::queryInterface(_rType); + if (!aReturn.hasValue()) + aReturn = View_IBASE::queryInterface(_rType); + return aReturn; +} + +css::uno::Sequence<css::uno::Type> SAL_CALL View::getTypes() +{ + return ::comphelper::concatSequences(View_Base::getTypes(), View_IBASE::getTypes()); +} + +css::uno::Sequence<sal_Int8> SAL_CALL View::getImplementationId() +{ + return css::uno::Sequence<sal_Int8>(); +} + +void SAL_CALL View::alterCommand(const OUString& _rNewCommand) +{ + OUString aCommand = "ALTER VIEW \"" + m_Name + "\" AS " + _rNewCommand; + m_xMetaData->getConnection()->createStatement()->execute(aCommand); +} + +void SAL_CALL View::getFastPropertyValue(css::uno::Any& _rValue, sal_Int32 _nHandle) const +{ + if (_nHandle == PROPERTY_ID_COMMAND) + { + // retrieve the very current command, don't rely on the base classes cached value + // (which we initialized empty, anyway) + _rValue <<= impl_getCommand(); + return; + } + + View_Base::getFastPropertyValue(_rValue, _nHandle); +} + +OUString View::impl_getCommand() const +{ + OUString aCommand("SELECT RDB$VIEW_SOURCE FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = '" + + m_Name + "'"); + css::uno::Reference<css::sdbc::XStatement> statement = m_xConnection->createStatement(); + css::uno::Reference<css::sdbc::XResultSet> xResult = statement->executeQuery(aCommand); + + css::uno::Reference<css::sdbc::XRow> xRow(xResult, css::uno::UNO_QUERY_THROW); + if (!xResult->next()) + { + // hmm. There is no view the name as we know it. Can only mean some other instance + // dropped this view meanwhile... + std::abort(); + } + + return xRow->getString(1); +} + +} // namespace connectivity::firebird +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/View.hxx b/connectivity/source/drivers/firebird/View.hxx new file mode 100644 index 000000000000..2b300a8d06d9 --- /dev/null +++ b/connectivity/source/drivers/firebird/View.hxx @@ -0,0 +1,60 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include <connectivity/sdbcx/VView.hxx> + +#include <com/sun/star/sdbcx/XAlterView.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> + +#include <comphelper/sequence.hxx> +#include <cppuhelper/implbase1.hxx> + +namespace connectivity::firebird +{ +typedef ::connectivity::sdbcx::OView View_Base; +typedef ::cppu::ImplHelper1<css::sdbcx::XAlterView> View_IBASE; + +class View : public View_Base, public View_IBASE +{ +public: + View(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, bool _bCaseSensitive, + const OUString& _rSchemaName, const OUString& _rName); + + // UNO + virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type& aType) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + virtual css::uno::Sequence<css::uno::Type> SAL_CALL getTypes() override; + virtual css::uno::Sequence<sal_Int8> SAL_CALL getImplementationId() override; + + // XAlterView + virtual void SAL_CALL alterCommand(const OUString& NewCommand) override; + +protected: + virtual ~View() override; + +protected: + // OPropertyContainer + virtual void SAL_CALL getFastPropertyValue(css::uno::Any& _rValue, + sal_Int32 _nHandle) const override; + +private: + /** retrieves the current command of the View */ + OUString impl_getCommand() const; + +private: + css::uno::Reference<css::sdbc::XConnection> m_xConnection; + + using View_Base::getFastPropertyValue; +}; + +} // namespace connectivity::firebird +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Views.cxx b/connectivity/source/drivers/firebird/Views.cxx new file mode 100644 index 000000000000..606ac9ae7e64 --- /dev/null +++ b/connectivity/source/drivers/firebird/Views.cxx @@ -0,0 +1,113 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include "Tables.hxx" +#include "Views.hxx" +#include "View.hxx" +#include "Catalog.hxx" +#include <connectivity/dbtools.hxx> +#include <comphelper/types.hxx> +#include <TConnection.hxx> + +connectivity::firebird::Views::Views( + const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, ::cppu::OWeakObject& _rParent, + ::osl::Mutex& _rMutex, const ::std::vector<OUString>& _rVector) + : sdbcx::OCollection(_rParent, true, _rMutex, _rVector) + , m_xConnection(_rxConnection) + , m_xMetaData(_rxConnection->getMetaData()) + , m_bInDrop(false) +{ +} + +css::uno::Reference<css::beans::XPropertySet> +connectivity::firebird::Views::createObject(const OUString& _rName) +{ + OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents(m_xMetaData, _rName, sCatalog, sSchema, sTable, + ::dbtools::EComposeRule::InDataManipulation); + return new View(m_xConnection, isCaseSensitive(), sSchema, sTable); +} + +void connectivity::firebird::Views::impl_refresh() +{ + static_cast<Catalog&>(m_rParent).refreshViews(); +} + +css::uno::Reference<css::beans::XPropertySet> connectivity::firebird::Views::createDescriptor() +{ + return new connectivity::sdbcx::OView(true, m_xMetaData); +} + +// XAppend +css::uno::Reference<css::beans::XPropertySet> connectivity::firebird::Views::appendObject( + const OUString& _rForName, const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + createView(descriptor); + return createObject(_rForName); +} + +// XDrop +void connectivity::firebird::Views::dropObject(sal_Int32 _nPos, const OUString& /*_sElementName*/) +{ + if (m_bInDrop) + return; + + css::uno::Reference<XInterface> xObject(getObject(_nPos)); + bool bIsNew = connectivity::sdbcx::ODescriptor::isNew(xObject); + if (!bIsNew) + { + OUString aSql(u"DROP VIEW"_ustr); + + css::uno::Reference<css::beans::XPropertySet> xProp(xObject, css::uno::UNO_QUERY); + aSql += ::dbtools::composeTableName(m_xMetaData, xProp, + ::dbtools::EComposeRule::InTableDefinitions, true); + + css::uno::Reference<css::sdbc::XConnection> xConnection = m_xMetaData->getConnection(); + css::uno::Reference<css::sdbc::XStatement> xStmt = xConnection->createStatement(); + xStmt->execute(aSql); + ::comphelper::disposeComponent(xStmt); + } +} + +void connectivity::firebird::Views::dropByNameImpl(const OUString& elementName) +{ + m_bInDrop = true; + connectivity::sdbcx::OCollection::dropByName(elementName); + m_bInDrop = false; +} + +void connectivity::firebird::Views::createView( + const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + css::uno::Reference<css::sdbc::XConnection> xConnection = m_xMetaData->getConnection(); + + OUString sCommand; + descriptor->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_COMMAND)) + >>= sCommand; + + OUString aSql = "CREATE VIEW " + + ::dbtools::composeTableName(m_xMetaData, descriptor, + ::dbtools::EComposeRule::InTableDefinitions, true) + + " AS " + sCommand; + + css::uno::Reference<css::sdbc::XStatement> xStmt = xConnection->createStatement(); + if (xStmt.is()) + { + xStmt->execute(aSql); + ::comphelper::disposeComponent(xStmt); + } + connectivity::firebird::Tables* pTables = static_cast<connectivity::firebird::Tables*>( + static_cast<connectivity::firebird::Catalog&>(m_rParent).getPrivateTables()); + if (pTables) + { + OUString sName = ::dbtools::composeTableName( + m_xMetaData, descriptor, ::dbtools::EComposeRule::InDataManipulation, false); + pTables->appendNew(sName); + } +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/firebird/Views.hxx b/connectivity/source/drivers/firebird/Views.hxx new file mode 100644 index 000000000000..d1308d385494 --- /dev/null +++ b/connectivity/source/drivers/firebird/Views.hxx @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include <connectivity/sdbcx/VCollection.hxx> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +namespace connectivity::firebird +{ +class Views final : public connectivity::sdbcx::OCollection +{ + css::uno::Reference<css::sdbc::XConnection> m_xConnection; + css::uno::Reference<css::sdbc::XDatabaseMetaData> m_xMetaData; + bool m_bInDrop; + + // OCollection + virtual css::uno::Reference<css::beans::XPropertySet> + createObject(const OUString& _rName) override; + virtual void impl_refresh() override; + virtual css::uno::Reference<css::beans::XPropertySet> createDescriptor() override; + virtual css::uno::Reference<css::beans::XPropertySet> + appendObject(const OUString& _rForName, + const css::uno::Reference<css::beans::XPropertySet>& descriptor) override; + + void createView(const css::uno::Reference<css::beans::XPropertySet>& descriptor); + +public: + Views(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, + ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, + const ::std::vector<OUString>& _rVector); + + // XDrop + virtual void dropObject(sal_Int32 _nPos, const OUString& _sElementName) override; + + void dropByNameImpl(const OUString& elementName); +}; +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/flat/ECatalog.cxx b/connectivity/source/drivers/flat/ECatalog.cxx index aed042fdd578..a7e806b58e9c 100644 --- a/connectivity/source/drivers/flat/ECatalog.cxx +++ b/connectivity/source/drivers/flat/ECatalog.cxx @@ -25,7 +25,6 @@ #include <com/sun/star/sdbc/XResultSet.hpp> using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; @@ -41,7 +40,7 @@ void OFlatCatalog::refreshTables() { ::std::vector<OUString> aVector; Sequence<OUString> aTypes; - Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), "%", "%", aTypes); + Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), u"%"_ustr, u"%"_ustr, aTypes); if (xResult.is()) { diff --git a/connectivity/source/drivers/flat/EColumns.cxx b/connectivity/source/drivers/flat/EColumns.cxx index a9e210321ba6..f2d5c5f69461 100644 --- a/connectivity/source/drivers/flat/EColumns.cxx +++ b/connectivity/source/drivers/flat/EColumns.cxx @@ -23,20 +23,16 @@ using namespace connectivity::flat; using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -sdbcx::ObjectType OFlatColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OFlatColumns::createObject(const OUString& _rName) { OFlatTable* pTable = static_cast<OFlatTable*>(m_pTable); const ::rtl::Reference<OSQLColumns>& aCols = pTable->getTableColumns(); OSQLColumns::const_iterator aIter = find(aCols->begin(),aCols->end(),_rName,::comphelper::UStringMixEqual(isCaseSensitive())); - sdbcx::ObjectType xRet; + css::uno::Reference< css::beans::XPropertySet > xRet; if(aIter != aCols->end()) - xRet = sdbcx::ObjectType(*aIter,UNO_QUERY); + xRet = *aIter; return xRet; } diff --git a/connectivity/source/drivers/flat/EConnection.cxx b/connectivity/source/drivers/flat/EConnection.cxx index 288a53fa649a..3f199cdfc4f0 100644 --- a/connectivity/source/drivers/flat/EConnection.cxx +++ b/connectivity/source/drivers/flat/EConnection.cxx @@ -36,7 +36,6 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; OFlatConnection::OFlatConnection(ODriver* _pDriver) : OConnection(_pDriver) @@ -55,7 +54,7 @@ OFlatConnection::~OFlatConnection() // XServiceInfo -IMPLEMENT_SERVICE_INFO(OFlatConnection, "com.sun.star.sdbc.drivers.flat.Connection", "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(OFlatConnection, u"com.sun.star.sdbc.drivers.flat.Connection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) void OFlatConnection::construct(const OUString& url,const Sequence< PropertyValue >& info) @@ -133,11 +132,11 @@ Reference< XDatabaseMetaData > SAL_CALL OFlatConnection::getMetaData( ) css::uno::Reference< XTablesSupplier > OFlatConnection::createCatalog() { ::osl::MutexGuard aGuard( m_aMutex ); - Reference< XTablesSupplier > xTab = m_xCatalog; + rtl::Reference< connectivity::sdbcx::OCatalog > xTab = m_xCatalog; if(!xTab.is()) { xTab = new OFlatCatalog(this); - m_xCatalog = xTab; + m_xCatalog = xTab.get(); } return xTab; } @@ -168,8 +167,7 @@ Reference< XPreparedStatement > SAL_CALL OFlatConnection::prepareCall( const OUS ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_B::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::prepareCall", *this ); - return nullptr; + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::prepareCall"_ustr, *this ); } diff --git a/connectivity/source/drivers/flat/EDatabaseMetaData.cxx b/connectivity/source/drivers/flat/EDatabaseMetaData.cxx index 7150973069d9..b76e88c9359e 100644 --- a/connectivity/source/drivers/flat/EDatabaseMetaData.cxx +++ b/connectivity/source/drivers/flat/EDatabaseMetaData.cxx @@ -47,17 +47,15 @@ OFlatDatabaseMetaData::~OFlatDatabaseMetaData() Reference< XResultSet > OFlatDatabaseMetaData::impl_getTypeInfo_throw( ) { - ::osl::MutexGuard aGuard( m_aMutex ); - rtl::Reference<::connectivity::ODatabaseMetaDataResultSet> pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo); static ODatabaseMetaDataResultSet::ORows aRows = []() { - ODatabaseMetaDataResultSet::ORows tmp(10); + ODatabaseMetaDataResultSet::ORows tmp; ODatabaseMetaDataResultSet::ORow aRow { ODatabaseMetaDataResultSet::getEmptyValue() , - new ORowSetValueDecorator(OUString("CHAR")) , + new ORowSetValueDecorator(u"CHAR"_ustr) , new ORowSetValueDecorator(DataType::CHAR) , new ORowSetValueDecorator(sal_Int32(254)) , ODatabaseMetaDataResultSet::getQuoteValue() , @@ -79,60 +77,60 @@ Reference< XResultSet > OFlatDatabaseMetaData::impl_getTypeInfo_throw( ) tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("VARCHAR")); + aRow[1] = new ORowSetValueDecorator(u"VARCHAR"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::VARCHAR); aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("LONGVARCHAR")); + aRow[1] = new ORowSetValueDecorator(u"LONGVARCHAR"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::LONGVARCHAR); aRow[3] = new ORowSetValueDecorator(sal_Int32(65535)); aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("DATE")); + aRow[1] = new ORowSetValueDecorator(u"DATE"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::DATE); aRow[3] = new ORowSetValueDecorator(sal_Int32(10)); aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("TIME")); + aRow[1] = new ORowSetValueDecorator(u"TIME"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::TIME); aRow[3] = new ORowSetValueDecorator(sal_Int32(8)); aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("TIMESTAMP")); + aRow[1] = new ORowSetValueDecorator(u"TIMESTAMP"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); aRow[3] = new ORowSetValueDecorator(sal_Int32(19)); aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("BOOL")); + aRow[1] = new ORowSetValueDecorator(u"BOOL"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::BIT); aRow[3] = ODatabaseMetaDataResultSet::get1Value(); aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("DECIMAL")); + aRow[1] = new ORowSetValueDecorator(u"DECIMAL"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); aRow[15] = new ORowSetValueDecorator(sal_Int32(15)); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("DOUBLE")); + aRow[1] = new ORowSetValueDecorator(u"DOUBLE"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::DOUBLE); aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); aRow[15] = ODatabaseMetaDataResultSet::get0Value(); tmp.push_back(aRow); - aRow[1] = new ORowSetValueDecorator(OUString("NUMERIC")); + aRow[1] = new ORowSetValueDecorator(u"NUMERIC"_ustr); aRow[2] = new ORowSetValueDecorator(DataType::NUMERIC); aRow[3] = new ORowSetValueDecorator(sal_Int32(20)); aRow[15] = new ORowSetValueDecorator(sal_Int32(20)); @@ -214,10 +212,10 @@ Reference< XResultSet > SAL_CALL OFlatDatabaseMetaData::getColumns( switch(aRow[11]->getValue().getInt32()) { case ColumnValue::NO_NULLS: - aRow[18] = new ORowSetValueDecorator(OUString("NO")); + aRow[18] = new ORowSetValueDecorator(u"NO"_ustr); break; case ColumnValue::NULLABLE: - aRow[18] = new ORowSetValueDecorator(OUString("YES")); + aRow[18] = new ORowSetValueDecorator(u"YES"_ustr); break; default: aRow[18] = new ORowSetValueDecorator(OUString()); diff --git a/connectivity/source/drivers/flat/EDriver.cxx b/connectivity/source/drivers/flat/EDriver.cxx index 29492895510e..e9cb465d327f 100644 --- a/connectivity/source/drivers/flat/EDriver.cxx +++ b/connectivity/source/drivers/flat/EDriver.cxx @@ -39,7 +39,7 @@ using namespace css::lang; OUString SAL_CALL ODriver::getImplementationName( ) { - return "com.sun.star.comp.sdbc.flat.ODriver"; + return u"com.sun.star.comp.sdbc.flat.ODriver"_ustr; } @@ -54,7 +54,7 @@ connectivity_flat_ODriver( } if (ret) ret->acquire(); - return static_cast<cppu::OWeakObject*>(ret.get()); + return getXWeak(ret.get()); } Reference< XConnection > SAL_CALL ODriver::connect( const OUString& url, const Sequence< PropertyValue >& info ) @@ -68,7 +68,7 @@ Reference< XConnection > SAL_CALL ODriver::connect( const OUString& url, const S rtl::Reference<OFlatConnection> pCon = new OFlatConnection(this); pCon->construct(url,info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon.get()); return pCon; } @@ -82,43 +82,43 @@ Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const OUString { if ( acceptsURL(url) ) { - Sequence< OUString > aBoolean { "0", "1" }; + Sequence< OUString > aBoolean { u"0"_ustr, u"1"_ustr }; std::vector< DriverPropertyInfo > aDriverInfo { { - "FieldDelimiter" - ,"Field separator." + u"FieldDelimiter"_ustr + ,u"Field separator."_ustr ,false ,{} ,{} }, { - "HeaderLine" - ,"Text contains headers." + u"HeaderLine"_ustr + ,u"Text contains headers."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "StringDelimiter" - ,"Text separator." + u"StringDelimiter"_ustr + ,u"Text separator."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "DecimalDelimiter" - ,"Decimal separator." + u"DecimalDelimiter"_ustr + ,u"Decimal separator."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean }, { - "ThousandDelimiter" - ,"Thousands separator." + u"ThousandDelimiter"_ustr + ,u"Thousands separator."_ustr ,false - ,"0" + ,u"0"_ustr ,aBoolean } }; @@ -128,7 +128,6 @@ Sequence< DriverPropertyInfo > SAL_CALL ODriver::getPropertyInfo( const OUString ::connectivity::SharedResources aResources; const OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); ::dbtools::throwGenericSQLException(sMessage ,*this); - return Sequence< DriverPropertyInfo >(); } diff --git a/connectivity/source/drivers/flat/EPreparedStatement.cxx b/connectivity/source/drivers/flat/EPreparedStatement.cxx index f4095ac2c087..90a8cb7d0127 100644 --- a/connectivity/source/drivers/flat/EPreparedStatement.cxx +++ b/connectivity/source/drivers/flat/EPreparedStatement.cxx @@ -22,14 +22,14 @@ using namespace connectivity::flat; using namespace connectivity::file; -using namespace ::com::sun::star::uno; rtl::Reference<OResultSet> OFlatPreparedStatement::createResultSet() { return new OFlatResultSet(this, m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(OFlatPreparedStatement, "com.sun.star.sdbc.driver.flat.PreparedStatement", - "com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(OFlatPreparedStatement, + u"com.sun.star.sdbc.driver.flat.PreparedStatement"_ustr, + u"com.sun.star.sdbc.PreparedStatement"_ustr); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/flat/EResultSet.cxx b/connectivity/source/drivers/flat/EResultSet.cxx index 2e8c2a391d97..57fd3ea1f324 100644 --- a/connectivity/source/drivers/flat/EResultSet.cxx +++ b/connectivity/source/drivers/flat/EResultSet.cxx @@ -46,12 +46,12 @@ OFlatResultSet::OFlatResultSet( OStatement_Base* pStmt,connectivity::OSQLParseTr OUString SAL_CALL OFlatResultSet::getImplementationName( ) { - return "com.sun.star.sdbcx.flat.ResultSet"; + return u"com.sun.star.sdbcx.flat.ResultSet"_ustr; } Sequence< OUString > SAL_CALL OFlatResultSet::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.ResultSet", "com.sun.star.sdbcx.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr, u"com.sun.star.sdbcx.ResultSet"_ustr }; } sal_Bool SAL_CALL OFlatResultSet::supportsService( const OUString& _rServiceName ) @@ -96,7 +96,7 @@ Any SAL_CALL OFlatResultSet::getBookmark( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - return makeAny((*m_aRow)[0]->getValue().getInt32()); + return Any((*m_aRow)[0]->getValue().getInt32()); } sal_Bool SAL_CALL OFlatResultSet::moveToBookmark( const Any& bookmark ) diff --git a/connectivity/source/drivers/flat/EStatement.cxx b/connectivity/source/drivers/flat/EStatement.cxx index dc801ac48653..795011ac61b1 100644 --- a/connectivity/source/drivers/flat/EStatement.cxx +++ b/connectivity/source/drivers/flat/EStatement.cxx @@ -22,13 +22,12 @@ using namespace connectivity::flat; using namespace connectivity::file; -using namespace css::uno; rtl::Reference<OResultSet> OFlatStatement::createResultSet() { return new OFlatResultSet(this,m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(OFlatStatement,"com.sun.star.sdbc.driver.flat.Statement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(OFlatStatement,u"com.sun.star.sdbc.driver.flat.Statement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/flat/ETable.cxx b/connectivity/source/drivers/flat/ETable.cxx index f4676c8712c6..cbf2f1805be5 100644 --- a/connectivity/source/drivers/flat/ETable.cxx +++ b/connectivity/source/drivers/flat/ETable.cxx @@ -27,7 +27,6 @@ #include <o3tl/safeint.hxx> #include <rtl/math.hxx> #include <sal/log.hxx> -#include <tools/solar.h> #include <tools/urlobj.hxx> #include <cppuhelper/queryinterface.hxx> #include <comphelper/numbers.hxx> @@ -230,7 +229,6 @@ void OFlatTable::impl_fillColumnInfo_nothrow(QuotedTokenizedString const & aFirs } else { - bNumeric = true; sal_Int32 nDot = 0; sal_Int32 nDecimalDelCount = 0; sal_Int32 nSpaceCount = 0; @@ -266,8 +264,8 @@ void OFlatTable::impl_fillColumnInfo_nothrow(QuotedTokenizedString const & aFirs if (bNumeric && cThousandDelimiter) { // Is the delimiter correct? - const OUString aValue = aField2.getToken(0,cDecimalDelimiter); - for( sal_Int32 j = aValue.getLength() - 4; j >= 0; j -= 4) + const std::u16string_view aValue = o3tl::getToken(aField2, 0, cDecimalDelimiter); + for( sal_Int32 j = static_cast<sal_Int32>(aValue.size()) - 4; j >= 0; j -= 4) { const sal_Unicode c = aValue[j]; // just digits, decimal- and thousands-delimiter? @@ -416,7 +414,7 @@ void OFlatTable::construct() m_xNumberFormatter.set( NumberFormatter::create( m_pConnection->getDriver()->getComponentContext()), UNO_QUERY_THROW); m_xNumberFormatter->attachNumberFormatsSupplier(xSupplier); Reference<XPropertySet> xProp = xSupplier->getNumberFormatSettings(); - xProp->getPropertyValue("NullDate") >>= m_aNullDate; + xProp->getPropertyValue(u"NullDate"_ustr) >>= m_aNullDate; INetURLObject aURL; aURL.SetURL(getEntry()); @@ -546,24 +544,10 @@ Any SAL_CALL OFlatTable::queryInterface( const Type & rType ) return Any(); Any aRet = OTable_TYPEDEF::queryInterface(rType); - return aRet.hasValue() ? aRet : ::cppu::queryInterface(rType,static_cast< css::lang::XUnoTunnel*> (this)); + return aRet; } -Sequence< sal_Int8 > OFlatTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OFlatTable::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OFlatTable_BASE>{}); -} - bool OFlatTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool bRetrieveData) { *(*_rRow)[0] = m_nFilePos; @@ -675,7 +659,7 @@ bool OFlatTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns & _rCols, bool // #99178# OJ if ( DataType::DECIMAL == nType || DataType::NUMERIC == nType ) - *(*_rRow)[i] = OUString(OUString::number(nVal)); + *(*_rRow)[i] = OUString::number(nVal); else *(*_rRow)[i] = nVal; } break; @@ -871,7 +855,7 @@ bool OFlatTable::readLine(sal_Int32 * const pEndPos, sal_Int32 * const pStartPos { if (pStartPos) *pStartPos = static_cast<sal_Int32>(m_pFileStream->Tell()); - m_pFileStream->ReadByteStringLine(m_aCurrentLine, nEncoding); + m_pFileStream->ReadByteStringLine(m_aCurrentLine, nEncoding, 262144); if (m_pFileStream->eof()) return false; diff --git a/connectivity/source/drivers/flat/ETables.cxx b/connectivity/source/drivers/flat/ETables.cxx index 2e4dd377ed83..b1a0859a7acb 100644 --- a/connectivity/source/drivers/flat/ETables.cxx +++ b/connectivity/source/drivers/flat/ETables.cxx @@ -22,20 +22,13 @@ #include <file/FCatalog.hxx> using namespace connectivity; -using namespace ::comphelper; using namespace connectivity::flat; using namespace connectivity::file; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::container; -sdbcx::ObjectType OFlatTables::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OFlatTables::createObject(const OUString& _rName) { rtl::Reference<OFlatTable> pRet = new OFlatTable(this, static_cast<OFlatConnection*>(static_cast<OFileCatalog&>(m_rParent).getConnection()), - _rName,"TABLE"); + _rName,u"TABLE"_ustr); pRet->construct(); return pRet; } diff --git a/connectivity/source/drivers/hsqldb/HCatalog.cxx b/connectivity/source/drivers/hsqldb/HCatalog.cxx index 1074be53559c..d905e67399f0 100644 --- a/connectivity/source/drivers/hsqldb/HCatalog.cxx +++ b/connectivity/source/drivers/hsqldb/HCatalog.cxx @@ -30,11 +30,8 @@ using namespace connectivity; using namespace connectivity::hsqldb; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OHCatalog::OHCatalog(const Reference< XConnection >& _xConnection) : sdbcx::OCatalog(_xConnection) ,m_xConnection(_xConnection) @@ -44,8 +41,8 @@ OHCatalog::OHCatalog(const Reference< XConnection >& _xConnection) : sdbcx::OCat void OHCatalog::refreshObjects(const Sequence< OUString >& _sKindOfObject,::std::vector< OUString>& _rNames) { Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), - "%", - "%", + u"%"_ustr, + u"%"_ustr, _sKindOfObject); fillNames(xResult,_rNames); } @@ -54,7 +51,7 @@ void OHCatalog::refreshTables() { ::std::vector< OUString> aVector; - Sequence< OUString > sTableTypes {"VIEW", "TABLE"}; + Sequence< OUString > sTableTypes {u"VIEW"_ustr, u"TABLE"_ustr}; refreshObjects(sTableTypes,aVector); @@ -66,7 +63,7 @@ void OHCatalog::refreshTables() void OHCatalog::refreshViews() { - Sequence< OUString > aTypes { "VIEW" }; + Sequence< OUString > aTypes { u"VIEW"_ustr }; bool bSupportsViews = false; try @@ -103,7 +100,7 @@ void OHCatalog::refreshUsers() { ::std::vector< OUString> aVector; Reference< XStatement > xStmt = m_xConnection->createStatement( ); - Reference< XResultSet > xResult = xStmt->executeQuery("select User from hsqldb.user group by User"); + Reference< XResultSet > xResult = xStmt->executeQuery(u"select User from hsqldb.user group by User"_ustr); if ( xResult.is() ) { Reference< XRow > xRow(xResult,UNO_QUERY); diff --git a/connectivity/source/drivers/hsqldb/HColumns.cxx b/connectivity/source/drivers/hsqldb/HColumns.cxx index 3f03c3616bc1..6906bde4435a 100644 --- a/connectivity/source/drivers/hsqldb/HColumns.cxx +++ b/connectivity/source/drivers/hsqldb/HColumns.cxx @@ -27,10 +27,6 @@ using namespace connectivity::sdbcx; using namespace connectivity; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OHSQLColumns::OHSQLColumns( ::cppu::OWeakObject& _rParent ,::osl::Mutex& _rMutex @@ -69,7 +65,7 @@ void OHSQLColumn::construct() Sequence< OUString > SAL_CALL OHSQLColumn::getSupportedServiceNames( ) { - return { "com.sun.star.sdbcx.Column" }; + return { u"com.sun.star.sdbcx.Column"_ustr }; } diff --git a/connectivity/source/drivers/hsqldb/HConnection.cxx b/connectivity/source/drivers/hsqldb/HConnection.cxx index 506bf5b075f9..032d02d90e8a 100644 --- a/connectivity/source/drivers/hsqldb/HConnection.cxx +++ b/connectivity/source/drivers/hsqldb/HConnection.cxx @@ -36,7 +36,7 @@ #include <cppuhelper/exc_hlp.hxx> #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <resource/sharedresources.hxx> #include <strings.hrc> @@ -76,19 +76,17 @@ namespace connectivity::hsqldb { m_aFlushListeners.disposeAndClear( EventObject( *this ) ); OHsqlConnection_BASE::disposing(); - OConnectionWrapper::disposing(); } OHsqlConnection::OHsqlConnection( const Reference< XDriver >& _rxDriver, const Reference< XConnection >& _xConnection ,const Reference< XComponentContext >& _rxContext ) - :OHsqlConnection_BASE( m_aMutex ) - ,m_aFlushListeners( m_aMutex ) + :m_aFlushListeners( m_aMutex ) ,m_xDriver( _rxDriver ) ,m_xContext( _rxContext ) ,m_bIni(true) ,m_bReadOnly(false) { - setDelegation(_xConnection,_rxContext,m_refCount); + setDelegation(_xConnection, _rxContext); } OHsqlConnection::~OHsqlConnection() @@ -100,9 +98,7 @@ namespace connectivity::hsqldb } } - IMPLEMENT_FORWARD_XINTERFACE2(OHsqlConnection,OHsqlConnection_BASE,OConnectionWrapper) - IMPLEMENT_SERVICE_INFO(OHsqlConnection, "com.sun.star.sdbc.drivers.hsqldb.OHsqlConnection", "com.sun.star.sdbc.Connection") - IMPLEMENT_FORWARD_XTYPEPROVIDER2(OHsqlConnection,OHsqlConnection_BASE,OConnectionWrapper) + IMPLEMENT_SERVICE_INFO(OHsqlConnection, u"com.sun.star.sdbc.drivers.hsqldb.OHsqlConnection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) ::osl::Mutex& OHsqlConnection::getMutex() const @@ -144,7 +140,7 @@ namespace connectivity::hsqldb if ( !m_bReadOnly ) { Reference< XStatement > xStmt( m_xConnection->createStatement(), css::uno::UNO_SET_THROW ); - xStmt->execute( "CHECKPOINT DEFRAG" ); + xStmt->execute( u"CHECKPOINT DEFRAG"_ustr ); } } catch(const Exception& ) @@ -281,8 +277,7 @@ namespace connectivity::hsqldb ::dbtools::qualifiedNameComponents( xMetaData, _rTableName, sCatalog, sSchema, sName, ::dbtools::EComposeRule::Complete ); // get the table information - OUStringBuffer sSQL; - sSQL.append( "SELECT HSQLDB_TYPE FROM INFORMATION_SCHEMA.SYSTEM_TABLES" ); + OUStringBuffer sSQL( "SELECT HSQLDB_TYPE FROM INFORMATION_SCHEMA.SYSTEM_TABLES" ); HTools::appendTableFilterCrit( sSQL, sCatalog, sSchema, sName, true ); sSQL.append( " AND TABLE_TYPE = 'TABLE'" ); @@ -317,11 +312,9 @@ namespace connectivity::hsqldb // ask the provider to obtain a graphic Sequence< PropertyValue > aMediaProperties{ comphelper::makePropertyValue( - "URL", OUString( - // load the graphic from the global graphic repository - "private:graphicrepository/" + u"URL"_ustr, u"private:graphicrepository/" // the relative path within the images.zip - LINKED_TEXT_TABLE_IMAGE_RESOURCE)) }; + LINKED_TEXT_TABLE_IMAGE_RESOURCE ""_ustr) }; xGraphic = xProvider->queryGraphic( aMediaProperties ); OSL_ENSURE( xGraphic.is(), "OHsqlConnection::impl_getTextTableIcon_nothrow: the provider did not give us a graphic object!" ); } diff --git a/connectivity/source/drivers/hsqldb/HDriver.cxx b/connectivity/source/drivers/hsqldb/HDriver.cxx index 962e574879cf..f43584d1f169 100644 --- a/connectivity/source/drivers/hsqldb/HDriver.cxx +++ b/connectivity/source/drivers/hsqldb/HDriver.cxx @@ -50,7 +50,9 @@ #include <strings.hrc> #include <resource/sharedresources.hxx> #include <i18nlangtag/languagetag.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> +#include <o3tl/string_view.hxx> +#include <vcl/svapp.hxx> #include <memory> @@ -68,9 +70,8 @@ namespace connectivity using namespace css::embed; using namespace css::io; using namespace css::util; - using namespace css::reflection; - constexpr OUStringLiteral IMPL_NAME = u"com.sun.star.sdbcx.comp.hsqldb.Driver"; + constexpr OUString IMPL_NAME = u"com.sun.star.sdbcx.comp.hsqldb.Driver"_ustr; @@ -102,7 +103,7 @@ namespace connectivity { for (const auto& rConnection : m_aConnections) { - Reference<XInterface > xTemp = rConnection.first.get(); + Reference<XConnection> xTemp(rConnection.xOrigConn); ::comphelper::disposeComponent(xTemp); } } @@ -111,7 +112,6 @@ namespace connectivity // not interested in } m_aConnections.clear(); - TWeakPairVector().swap(m_aConnections); cppu::WeakComponentImplHelperBase::disposing(); } @@ -121,7 +121,7 @@ namespace connectivity if ( !m_xDriver.is() ) { Reference<XDriverManager2> xDriverAccess = DriverManager::create( m_xContext ); - m_xDriver = xDriverAccess->getDriverByURL("jdbc:hsqldb:db"); + m_xDriver = xDriverAccess->getDriverByURL(u"jdbc:hsqldb:db"_ustr); } return m_xDriver; @@ -203,46 +203,43 @@ namespace connectivity // properties for accessing the embedded storage OUString sKey = StorageContainer::registerStorage( xStorage, sSystemPath ); - aProperties.put( "storage_key", sKey ); - aProperties.put( "storage_class_name", - OUString( "com.sun.star.sdbcx.comp.hsqldb.StorageAccess" ) ); - aProperties.put( "fileaccess_class_name", - OUString( "com.sun.star.sdbcx.comp.hsqldb.StorageFileAccess" ) ); + aProperties.put( u"storage_key"_ustr, sKey ); + aProperties.put( u"storage_class_name"_ustr, + u"com.sun.star.sdbcx.comp.hsqldb.StorageAccess"_ustr ); + aProperties.put( u"fileaccess_class_name"_ustr, + u"com.sun.star.sdbcx.comp.hsqldb.StorageFileAccess"_ustr ); // JDBC driver and driver's classpath - aProperties.put( "JavaDriverClass", - OUString( "org.hsqldb.jdbcDriver" ) ); - aProperties.put( "JavaDriverClassPath", - OUString( + aProperties.put( u"JavaDriverClass"_ustr, u"org.hsqldb.jdbcDriver"_ustr ); + aProperties.put( u"JavaDriverClassPath"_ustr, #ifdef SYSTEM_HSQLDB - HSQLDB_JAR + u"" HSQLDB_JAR #else - "vnd.sun.star.expand:$LO_JAVA_DIR/hsqldb.jar" + u"vnd.sun.star.expand:$LO_JAVA_DIR/hsqldb.jar" #endif - " vnd.sun.star.expand:$LO_JAVA_DIR/sdbc_hsqldb.jar" - ) ); + " vnd.sun.star.expand:$LO_JAVA_DIR/sdbc_hsqldb.jar"_ustr ); // auto increment handling - aProperties.put( "IsAutoRetrievingEnabled", true ); - aProperties.put( "AutoRetrievingStatement", - OUString( "CALL IDENTITY()" ) ); - aProperties.put( "IgnoreDriverPrivileges", true ); + aProperties.put( u"IsAutoRetrievingEnabled"_ustr, true ); + aProperties.put( u"AutoRetrievingStatement"_ustr, + u"CALL IDENTITY()"_ustr ); + aProperties.put( u"IgnoreDriverPrivileges"_ustr, true ); // don't want to expose HSQLDB's schema capabilities which exist since 1.8.0RC10 - aProperties.put( "default_schema", - OUString( "true" ) ); + aProperties.put( u"default_schema"_ustr, + u"true"_ustr ); // security: permitted Java classes NamedValue aPermittedClasses( - "hsqldb.method_class_names", - makeAny( lcl_getPermittedJavaMethods_nothrow( m_xContext ) ) + u"hsqldb.method_class_names"_ustr, + Any( lcl_getPermittedJavaMethods_nothrow( m_xContext ) ) ); - aProperties.put( "SystemProperties", Sequence< NamedValue >( &aPermittedClasses, 1 ) ); + aProperties.put( u"SystemProperties"_ustr, Sequence< NamedValue >( &aPermittedClasses, 1 ) ); OUString sMessage; try { - static const OUStringLiteral sProperties( u"properties" ); + static constexpr OUString sProperties( u"properties"_ustr ); if ( !bIsNewDatabase && xStorage->isStreamElement(sProperties) ) { Reference<XStream > xStream = xStorage->openStreamElement(sProperties,ElementModes::READ); @@ -251,15 +248,15 @@ namespace connectivity std::unique_ptr<SvStream> pStream( ::utl::UcbStreamHelper::CreateStream(xStream) ); if (pStream) { - OString sLine; + OStringBuffer sLine; OString sVersionString; while ( pStream->ReadLine(sLine) ) { if ( sLine.isEmpty() ) continue; sal_Int32 nIdx {0}; - const OString sIniKey = sLine.getToken(0, '=', nIdx); - const OString sValue = sLine.getToken(0, '=', nIdx); + const std::string_view sIniKey = o3tl::getToken(sLine, 0, '=', nIdx); + const OString sValue(o3tl::getToken(sLine, 0, '=', nIdx)); if( sIniKey == "hsqldb.compatible_version" ) { sVersionString = sValue; @@ -275,9 +272,9 @@ namespace connectivity if (!sVersionString.isEmpty()) { sal_Int32 nIdx {0}; - const sal_Int32 nMajor = sVersionString.getToken(0, '.', nIdx).toInt32(); - const sal_Int32 nMinor = sVersionString.getToken(0, '.', nIdx).toInt32(); - const sal_Int32 nMicro = sVersionString.getToken(0, '.', nIdx).toInt32(); + const sal_Int32 nMajor = o3tl::toInt32(o3tl::getToken(sVersionString, 0, '.', nIdx)); + const sal_Int32 nMinor = o3tl::toInt32(o3tl::getToken(sVersionString, 0, '.', nIdx)); + const sal_Int32 nMicro = o3tl::toInt32(o3tl::getToken(sVersionString, 0, '.', nIdx)); if ( nMajor > 1 || ( nMajor == 1 && nMinor > 8 ) || ( nMajor == 1 && nMinor == 8 && nMicro > 0 ) ) @@ -290,6 +287,37 @@ namespace connectivity } // if ( xStream.is() ) ::comphelper::disposeComponent(xStream); } + + // disallow any database/script files that contain a "SCRIPT[.*]" entry (this is belt and braces + // in that bundled hsqldb 1.8.0 is patched to also reject them) + // + // hsqldb 2.6.0 release notes have: added system role SCRIPT_OPS for export / import of database structure and data + // which seems to provide a builtin way to do this with contemporary hsqldb + static constexpr OUString sScript(u"script"_ustr); + if (!bIsNewDatabase && xStorage->isStreamElement(sScript)) + { + Reference<XStream > xStream = xStorage->openStreamElement(sScript, ElementModes::READ); + if (xStream.is()) + { + std::unique_ptr<SvStream> pStream(::utl::UcbStreamHelper::CreateStream(xStream)); + if (pStream) + { + OStringBuffer sLine; + while (pStream->ReadLine(sLine)) + { + OString sText = sLine.makeStringAndClear().trim(); + if (sText.startsWithIgnoreAsciiCase("SCRIPT")) + { + ::connectivity::SharedResources aResources; + sMessage = aResources.getResourceString(STR_COULD_NOT_LOAD_FILE).replaceFirst("$filename$", sSystemPath); + break; + } + } + } + } // if ( xStream.is() ) + ::comphelper::disposeComponent(xStream); + } + } catch(Exception&) { @@ -304,10 +332,10 @@ namespace connectivity if ( xProp.is() ) { sal_Int32 nMode = 0; - xProp->getPropertyValue("OpenMode") >>= nMode; + xProp->getPropertyValue(u"OpenMode"_ustr) >>= nMode; if ( (nMode & ElementModes::WRITE) != ElementModes::WRITE ) { - aProperties.put( "readonly", OUString( "true" ) ); + aProperties.put( u"readonly"_ustr, u"true"_ustr ); } } @@ -342,7 +370,7 @@ namespace connectivity xComp->addEventListener(this); // we want to close all connections when the office shuts down - static Reference< XTerminateListener> s_xTerminateListener = [&]() + static rtl::Reference< OConnectionController > s_xTerminateListener = [&]() { Reference< XDesktop2 > xDesktop = Desktop::create( m_xContext ); @@ -352,13 +380,12 @@ namespace connectivity }(); Reference< XComponent> xIfc = new OHsqlConnection( this, xOrig, m_xContext ); xConnection.set(xIfc,UNO_QUERY); - m_aConnections.push_back(TWeakPair(WeakReferenceHelper(xOrig),TWeakConnectionPair(sKey,TWeakRefPair(WeakReferenceHelper(xConnection),WeakReferenceHelper())))); + m_aConnections.push_back( { xOrig, sKey, xConnection, nullptr } ); Reference<XTransactionBroadcaster> xBroad(xStorage,UNO_QUERY); if ( xBroad.is() ) { - Reference<XTransactionListener> xListener(*this,UNO_QUERY); - xBroad->addTransactionListener(xListener); + xBroad->addTransactionListener(Reference<XTransactionListener>(this)); } } } @@ -396,24 +423,24 @@ namespace connectivity return { { - "Storage", - "Defines the storage where the database will be stored.", + u"Storage"_ustr, + u"Defines the storage where the database will be stored."_ustr, true, {}, {} }, { - "URL", - "Defines the url of the data source.", + u"URL"_ustr, + u"Defines the url of the data source."_ustr, true, {}, {} }, { - "AutoRetrievingStatement", - "Defines the statement which will be executed to retrieve auto increment values.", + u"AutoRetrievingStatement"_ustr, + u"Defines the statement which will be executed to retrieve auto increment values."_ustr, false, - "CALL IDENTITY()", + u"CALL IDENTITY()"_ustr, {} } }; @@ -437,18 +464,18 @@ namespace connectivity ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(ODriverDelegator_BASE::rBHelper.bDisposed); - Reference< XTablesSupplier > xTab; + rtl::Reference< OHCatalog > xTab; - TWeakPairVector::iterator i = std::find_if(m_aConnections.begin(), m_aConnections.end(), - [&connection](const TWeakPairVector::value_type& rConnection) { - return rConnection.second.second.first.get() == connection.get(); }); + auto i = std::find_if(m_aConnections.begin(), m_aConnections.end(), + [&connection](const TConnectionInfo& rConnection) { + return rConnection.xConn.get() == connection.get(); }); if (i != m_aConnections.end()) { - xTab.set(i->second.second.second,UNO_QUERY); + xTab = i->xCatalog.get(); if ( !xTab.is() ) { xTab = new OHCatalog(connection); - i->second.second.second = WeakReferenceHelper(xTab); + i->xCatalog = xTab.get(); } } @@ -482,33 +509,40 @@ namespace connectivity Sequence< OUString > SAL_CALL ODriverDelegator::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.Driver", "com.sun.star.sdbcx.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr, u"com.sun.star.sdbcx.Driver"_ustr }; } void SAL_CALL ODriverDelegator::createCatalog( const Sequence< PropertyValue >& /*info*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XCreateCatalog::createCatalog", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XCreateCatalog::createCatalog"_ustr, *this ); } - void ODriverDelegator::shutdownConnection(const TWeakPairVector::iterator& _aIter ) + void ODriverDelegator::shutdownConnection(const std::vector<TConnectionInfo>::iterator& _aIter ) { OSL_ENSURE(m_aConnections.end() != _aIter,"Iterator equals .end()"); bool bLastOne = true; try { - Reference<XConnection> _xConnection(_aIter->first.get(),UNO_QUERY); + Reference<XConnection> _xConnection(_aIter->xOrigConn); if ( _xConnection.is() ) { Reference<XStatement> xStmt = _xConnection->createStatement(); if ( xStmt.is() ) { - Reference<XResultSet> xRes = xStmt->executeQuery("SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS WHERE USER_NAME ='SA'"); + Reference<XResultSet> xRes = xStmt->executeQuery(u"SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS WHERE USER_NAME ='SA'"_ustr); Reference<XRow> xRow(xRes,UNO_QUERY); if ( xRow.is() && xRes->next() ) bLastOne = xRow->getInt(1) == 1; if ( bLastOne ) - xStmt->execute("SHUTDOWN"); + { + // during shutdown, we are running on the main thread, and if we call this, + // it might trigger dbaccess::DocumentEventNotifier_Impl::impl_notifyEvent_nothrow + // which is running on a different thread, and that will call other code that tries + // to take the solar mutex. + SolarMutexReleaser aReleaser; + xStmt->execute(u"SHUTDOWN"_ustr); + } } } } @@ -519,7 +553,7 @@ namespace connectivity { // Reference<XTransactionListener> xListener(*this,UNO_QUERY); // a shutdown should commit all changes to the db files - StorageContainer::revokeStorage(_aIter->second.first,nullptr); + StorageContainer::revokeStorage(_aIter->sKey,nullptr); } if ( !m_bInShutDownConnections ) m_aConnections.erase(_aIter); @@ -531,8 +565,8 @@ namespace connectivity Reference<XConnection> xCon(Source.Source,UNO_QUERY); if ( xCon.is() ) { - TWeakPairVector::iterator i = std::find_if(m_aConnections.begin(), m_aConnections.end(), - [&xCon](const TWeakPairVector::value_type& rConnection) { return rConnection.first.get() == xCon.get(); }); + auto i = std::find_if(m_aConnections.begin(), m_aConnections.end(), + [&xCon](const TConnectionInfo& rConnection) { return rConnection.xOrigConn.get() == xCon.get(); }); if (i != m_aConnections.end()) shutdownConnection(i); @@ -543,9 +577,9 @@ namespace connectivity if ( xStorage.is() ) { OUString sKey = StorageContainer::getRegisteredKey(xStorage); - TWeakPairVector::iterator i = std::find_if(m_aConnections.begin(),m_aConnections.end(), - [&sKey] (const TWeakPairVector::value_type& conn) { - return conn.second.first == sKey; + auto i = std::find_if(m_aConnections.begin(),m_aConnections.end(), + [&sKey] (const TConnectionInfo& conn) { + return conn.sKey == sKey; }); if ( i != m_aConnections.end() ) @@ -561,7 +595,7 @@ namespace connectivity { try { - Reference<XConnection> xCon(rConnection.first,UNO_QUERY); + Reference<XConnection> xCon(rConnection.xOrigConn); ::comphelper::disposeComponent(xCon); } catch(Exception&) @@ -578,7 +612,7 @@ namespace connectivity { try { - Reference<XFlushable> xCon(rConnection.second.second.first.get(),UNO_QUERY); + Reference<XFlushable> xCon(rConnection.xConn.get(),UNO_QUERY); if (xCon.is()) xCon->flush(); } @@ -598,9 +632,9 @@ namespace connectivity if ( sKey.isEmpty() ) return; - TWeakPairVector::const_iterator i = std::find_if(m_aConnections.begin(), m_aConnections.end(), - [&sKey] (const TWeakPairVector::value_type& conn) { - return conn.second.first == sKey; + auto i = std::find_if(m_aConnections.begin(), m_aConnections.end(), + [&sKey] (const TConnectionInfo& conn) { + return conn.sKey == sKey; }); OSL_ENSURE( i != m_aConnections.end(), "ODriverDelegator::preCommit: they're committing a storage which I do not know!" ); @@ -609,13 +643,13 @@ namespace connectivity try { - Reference<XConnection> xConnection(i->first,UNO_QUERY); + Reference<XConnection> xConnection(i->xOrigConn); if ( xConnection.is() ) { Reference< XStatement> xStmt = xConnection->createStatement(); OSL_ENSURE( xStmt.is(), "ODriverDelegator::preCommit: no statement!" ); if ( xStmt.is() ) - xStmt->execute( "SET WRITE_DELAY 0" ); + xStmt->execute( u"SET WRITE_DELAY 0"_ustr ); bool bPreviousAutoCommit = xConnection->getAutoCommit(); xConnection->setAutoCommit( false ); @@ -623,7 +657,7 @@ namespace connectivity xConnection->setAutoCommit( bPreviousAutoCommit ); if ( xStmt.is() ) - xStmt->execute( "SET WRITE_DELAY 60" ); + xStmt->execute( u"SET WRITE_DELAY 60"_ustr ); } } catch(Exception&) @@ -784,7 +818,7 @@ namespace connectivity OUString lcl_getSystemLocale( const Reference< XComponentContext >& _rxContext ) { - OUString sLocaleString = "en-US"; + OUString sLocaleString = u"en-US"_ustr; try { @@ -795,13 +829,13 @@ namespace connectivity // arguments for creating the config access Sequence<Any> aArguments(comphelper::InitAnyPropertySequence( { - {"nodepath", Any(OUString("/org.openoffice.Setup/L10N" ))}, // the path to the node to open + {"nodepath", Any(u"/org.openoffice.Setup/L10N"_ustr)}, // the path to the node to open {"depth", Any(sal_Int32(-1))}, // the depth: -1 means unlimited })); // create the access Reference< XPropertySet > xNode( xConfigProvider->createInstanceWithArguments( - "com.sun.star.configuration.ConfigurationAccess", + u"com.sun.star.configuration.ConfigurationAccess"_ustr, aArguments ), UNO_QUERY ); OSL_ENSURE( xNode.is(), "lcl_getSystemLocale: invalid access returned (should throw an exception instead)!" ); @@ -809,7 +843,7 @@ namespace connectivity // ask for the system locale setting if ( xNode.is() ) - xNode->getPropertyValue("ooSetupSystemLocale") >>= sLocaleString; + xNode->getPropertyValue(u"ooSetupSystemLocale"_ustr) >>= sLocaleString; } catch( const Exception& ) { @@ -833,8 +867,7 @@ namespace connectivity OSL_ENSURE( xStatement.is(), "ODriverDelegator::onConnectedNewDatabase: could not create a statement!" ); if ( xStatement.is() ) { - OUStringBuffer aStatement; - aStatement.append( "SET DATABASE COLLATION \"" ); + OUStringBuffer aStatement( "SET DATABASE COLLATION \"" ); aStatement.appendAscii( lcl_getCollationForLocale( lcl_getSystemLocale( m_xContext ) ) ); aStatement.append( "\"" ); diff --git a/connectivity/source/drivers/hsqldb/HStorageAccess.cxx b/connectivity/source/drivers/hsqldb/HStorageAccess.cxx index 09ab485d9fd7..3e874dbbeddc 100644 --- a/connectivity/source/drivers/hsqldb/HStorageAccess.cxx +++ b/connectivity/source/drivers/hsqldb/HStorageAccess.cxx @@ -22,17 +22,14 @@ #include <hsqldb/HStorageMap.hxx> #include "accesslog.hxx" #include <osl/diagnose.h> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <string.h> #include <algorithm> -using namespace ::com::sun::star::container; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::embed; using namespace ::com::sun::star::io; -using namespace ::com::sun::star::lang; using namespace ::connectivity::hsqldb; #define ThrowException(env, type, msg) { \ @@ -148,28 +145,28 @@ jint read_from_storage_stream( JNIEnv * env, jstring name, jstring key ) std::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key); Reference< XInputStream> xIn = pHelper ? pHelper->getInputStream() : Reference< XInputStream>(); OSL_ENSURE(xIn.is(),"Input stream is NULL!"); - if ( xIn.is() ) + if ( !xIn.is() ) + return -1; + + Sequence< ::sal_Int8 > aData(1); + sal_Int32 nBytesRead = -1; + try { - Sequence< ::sal_Int8 > aData(1); - sal_Int32 nBytesRead = -1; - try - { - nBytesRead = xIn->readBytes(aData,1); - } - catch(const Exception& e) - { - StorageContainer::throwJavaException(e,env); - return -1; + nBytesRead = xIn->readBytes(aData,1); + } + catch(const Exception& e) + { + StorageContainer::throwJavaException(e,env); + return -1; - } - if (nBytesRead <= 0) - { - return -1; - } - else - { - return static_cast<unsigned char>(aData[0]); - } + } + if (nBytesRead <= 0) + { + return -1; + } + else + { + return static_cast<unsigned char>(aData[0]); } return -1; } @@ -341,10 +338,15 @@ extern "C" SAL_JNI_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_Nativ #endif std::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key); - Reference< XSeekable> xSeek = pHelper ? pHelper->getSeek() : Reference< XSeekable>(); - OSL_ENSURE(xSeek.is(),"No Seekable stream!"); - if ( !xSeek.is() ) + OSL_ENSURE(pHelper, "No StreamHelper!"); + if (!pHelper) + return; + + Reference< XSeekable> xSeek = pHelper->getSeek(); + + OSL_ENSURE(xSeek.is(), "No Seekable stream!"); + if (!xSeek) return; #ifdef HSQLDB_DBG @@ -362,22 +364,22 @@ extern "C" SAL_JNI_EXPORT void JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_Nativ Reference< XOutputStream> xOut = pHelper->getOutputStream(); OSL_ENSURE(xOut.is(),"No output stream!"); - ::sal_Int64 diff = position - nLen; - sal_Int32 n; - while( diff != 0 ) + sal_Int64 diff = position - nLen, n; + while (diff != 0) { - if ( BUFFER_SIZE < diff ) + if (diff > BUFFER_SIZE) { - n = static_cast<sal_Int32>(BUFFER_SIZE); + n = BUFFER_SIZE; diff = diff - BUFFER_SIZE; } else { - n = static_cast<sal_Int32>(diff); + n = diff; diff = 0; } - Sequence< ::sal_Int8 > aData(n); - memset(aData.getArray(),0,n); + assert(n >= 0 && n <= SAL_MAX_INT32 && "this fits in sal_Int32"); + Sequence<sal_Int8> aData(n); + memset(aData.getArray(), 0, n); xOut->writeBytes(aData); #ifdef HSQLDB_DBG aDataLog.write( aData.getConstArray(), n ); diff --git a/connectivity/source/drivers/hsqldb/HStorageMap.cxx b/connectivity/source/drivers/hsqldb/HStorageMap.cxx index 63b5e0481c5c..822a655675d2 100644 --- a/connectivity/source/drivers/hsqldb/HStorageMap.cxx +++ b/connectivity/source/drivers/hsqldb/HStorageMap.cxx @@ -27,7 +27,7 @@ #include <sal/log.hxx> #include <uno/mapping.hxx> #include <algorithm> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> namespace connectivity::hsqldb { @@ -103,14 +103,14 @@ namespace connectivity::hsqldb { css::uno::Environment env(css::uno::Environment::getCurrent()); if (!(env.is() && storageEnvironment.is())) { - throw css::uno::RuntimeException("cannot get environments"); + throw css::uno::RuntimeException(u"cannot get environments"_ustr); } if (env.get() == storageEnvironment.get()) { return storage; } else { css::uno::Mapping map(storageEnvironment, env); if (!map.is()) { - throw css::uno::RuntimeException("cannot get mapping"); + throw css::uno::RuntimeException(u"cannot get mapping"_ustr); } css::uno::Reference<css::embed::XStorage> mapped; map.mapInterface( @@ -132,9 +132,9 @@ namespace connectivity::hsqldb return OUString::number(s_nCount++); } - OUString StorageContainer::removeURLPrefix(const OUString& _sURL,const OUString& _sFileURL) + OUString StorageContainer::removeURLPrefix(std::u16string_view _sURL, std::u16string_view _sFileURL) { - return _sURL.copy(_sFileURL.getLength()+1); + return OUString(_sURL.substr(_sFileURL.size()+1)); } OUString StorageContainer::removeOldURLPrefix(const OUString& _sURL) diff --git a/connectivity/source/drivers/hsqldb/HTable.cxx b/connectivity/source/drivers/hsqldb/HTable.cxx index 9a23b6052468..05338f21aef2 100644 --- a/connectivity/source/drivers/hsqldb/HTable.cxx +++ b/connectivity/source/drivers/hsqldb/HTable.cxx @@ -29,7 +29,7 @@ #include <hsqldb/HColumns.hxx> #include <TConnection.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> using namespace ::comphelper; @@ -115,19 +115,6 @@ sdbcx::OCollection* OHSQLTable::createIndexes(const ::std::vector< OUString>& _r return new OIndexesHelper(this,m_aMutex,_rNames); } -Sequence< sal_Int8 > OHSQLTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OHSQLTable::getSomething( const Sequence< sal_Int8 > & rId ) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OTable_TYPEDEF>{}); -} // XAlterTable void SAL_CALL OHSQLTable::alterColumnByName( const OUString& colName, const Reference< XPropertySet >& descriptor ) @@ -259,7 +246,7 @@ void OHSQLTable::alterColumnType(sal_Int32 nNewType,const OUString& _rColName, c rtl::Reference<OHSQLColumn> pColumn = new OHSQLColumn; ::comphelper::copyProperties(_xDescriptor,pColumn); - pColumn->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE),makeAny(nNewType)); + pColumn->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE),Any(nNewType)); sSql += ::dbtools::createStandardColumnPart(pColumn,getConnection()); executeStatement(sSql); @@ -289,7 +276,7 @@ void OHSQLTable::dropDefaultValue(const OUString& _rColName) OUString OHSQLTable::getAlterTableColumnPart() const { - OUString sSql( "ALTER TABLE " ); + OUString sSql( u"ALTER TABLE "_ustr ); OUString sComposedName( ::dbtools::composeTableName( getMetaData(), m_CatalogName, m_SchemaName, m_Name, true, ::dbtools::EComposeRule::InTableDefinitions ) ); sSql += sComposedName; @@ -351,7 +338,7 @@ void SAL_CALL OHSQLTable::rename( const OUString& newName ) if(!isNew()) { - OUString sSql = "ALTER "; + OUString sSql = u"ALTER "_ustr; if ( m_Type == "VIEW" ) sSql += " VIEW "; else diff --git a/connectivity/source/drivers/hsqldb/HTables.cxx b/connectivity/source/drivers/hsqldb/HTables.cxx index de818686b49d..dcb1ee1a33d9 100644 --- a/connectivity/source/drivers/hsqldb/HTables.cxx +++ b/connectivity/source/drivers/hsqldb/HTables.cxx @@ -37,43 +37,42 @@ using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace dbtools; -sdbcx::ObjectType OTables::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OTables::createObject(const OUString& _rName) { OUString sCatalog,sSchema,sTable; ::dbtools::qualifiedNameComponents(m_xMetaData,_rName,sCatalog,sSchema,sTable,::dbtools::EComposeRule::InDataManipulation); - Sequence< OUString > sTableTypes {"VIEW", "TABLE", "%"}; // this last one just to be sure to include anything else... + Sequence< OUString > sTableTypes {u"VIEW"_ustr, u"TABLE"_ustr, u"%"_ustr}; // this last one just to be sure to include anything else... Any aCatalog; if ( !sCatalog.isEmpty() ) aCatalog <<= sCatalog; Reference< XResultSet > xResult = m_xMetaData->getTables(aCatalog,sSchema,sTable,sTableTypes); - sdbcx::ObjectType xRet; - if ( xResult.is() ) + if ( !xResult.is() ) + return nullptr; + + rtl::Reference< OHSQLTable > xRet; + Reference< XRow > xRow(xResult,UNO_QUERY); + if ( xResult->next() ) // there can be only one table with this name { - Reference< XRow > xRow(xResult,UNO_QUERY); - if ( xResult->next() ) // there can be only one table with this name - { - sal_Int32 nPrivileges = ::dbtools::getTablePrivileges( m_xMetaData, sCatalog, sSchema, sTable ); - if ( m_xMetaData->isReadOnly() ) - nPrivileges &= ~( Privilege::INSERT | Privilege::UPDATE | Privilege::DELETE | Privilege::CREATE | Privilege::ALTER | Privilege::DROP ); - - // obtain privileges - xRet = new OHSQLTable( this - ,static_cast<OHCatalog&>(m_rParent).getConnection() - ,sTable - ,xRow->getString(4) - ,xRow->getString(5) - ,sSchema - ,sCatalog - ,nPrivileges); - } - ::comphelper::disposeComponent(xResult); + sal_Int32 nPrivileges = ::dbtools::getTablePrivileges( m_xMetaData, sCatalog, sSchema, sTable ); + if ( m_xMetaData->isReadOnly() ) + nPrivileges &= ~( Privilege::INSERT | Privilege::UPDATE | Privilege::DELETE | Privilege::CREATE | Privilege::ALTER | Privilege::DROP ); + + // obtain privileges + xRet = new OHSQLTable( this + ,static_cast<OHCatalog&>(m_rParent).getConnection() + ,sTable + ,xRow->getString(4) + ,xRow->getString(5) + ,sSchema + ,sCatalog + ,nPrivileges); } + ::comphelper::disposeComponent(xResult); return xRet; } @@ -95,7 +94,7 @@ Reference< XPropertySet > OTables::createDescriptor() } // XAppend -sdbcx::ObjectType OTables::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OTables::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { createTable(descriptor); return createObject( _rForName ); @@ -115,7 +114,7 @@ void OTables::dropObject(sal_Int32 _nPos,const OUString& _sElementName) OUString sCatalog,sSchema,sTable; ::dbtools::qualifiedNameComponents(m_xMetaData,_sElementName,sCatalog,sSchema,sTable,::dbtools::EComposeRule::InDataManipulation); - OUString aSql( "DROP " ); + OUString aSql( u"DROP "_ustr ); Reference<XPropertySet> xProp(xObject,UNO_QUERY); bool bIsView; @@ -160,13 +159,13 @@ void OTables::appendNew(const OUString& _rsNewTable) insertElement(_rsNewTable,nullptr); // notify our container listeners - ContainerEvent aEvent(static_cast<XContainer*>(this), makeAny(_rsNewTable), Any(), Any()); + ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_rsNewTable), Any(), Any()); OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners); while (aListenerLoop.hasMoreElements()) aListenerLoop.next()->elementInserted(aEvent); } -OUString OTables::getNameForObject(const sdbcx::ObjectType& _xObject) +OUString OTables::getNameForObject(const css::uno::Reference< css::beans::XPropertySet >& _xObject) { OSL_ENSURE(_xObject.is(),"OTables::getNameForObject: Object is NULL!"); return ::dbtools::composeTableName( m_xMetaData, _xObject, ::dbtools::EComposeRule::InDataManipulation, false ); diff --git a/connectivity/source/drivers/hsqldb/HTerminateListener.cxx b/connectivity/source/drivers/hsqldb/HTerminateListener.cxx index a9df5ccc9b9a..7c6b494488db 100644 --- a/connectivity/source/drivers/hsqldb/HTerminateListener.cxx +++ b/connectivity/source/drivers/hsqldb/HTerminateListener.cxx @@ -23,7 +23,6 @@ namespace connectivity { using namespace hsqldb; -using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; // XEventListener diff --git a/connectivity/source/drivers/hsqldb/HTerminateListener.hxx b/connectivity/source/drivers/hsqldb/HTerminateListener.hxx index baf66e90eb1e..265be80ef5b9 100644 --- a/connectivity/source/drivers/hsqldb/HTerminateListener.hxx +++ b/connectivity/source/drivers/hsqldb/HTerminateListener.hxx @@ -23,23 +23,23 @@ namespace connectivity::hsqldb +{ + class ODriverDelegator; + class OConnectionController : public ::cppu::WeakImplHelper< css::frame::XTerminateListener > { - class ODriverDelegator; - class OConnectionController : public ::cppu::WeakImplHelper< css::frame::XTerminateListener > - { - ODriverDelegator* m_pDriver; - protected: - virtual ~OConnectionController() override {m_pDriver = nullptr;} - public: - explicit OConnectionController(ODriverDelegator* _pDriver) : m_pDriver(_pDriver){} + ODriverDelegator* m_pDriver; + protected: + virtual ~OConnectionController() override {m_pDriver = nullptr;} + public: + explicit OConnectionController(ODriverDelegator* _pDriver) : m_pDriver(_pDriver){} - // XEventListener - virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + // XEventListener + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; - // XTerminateListener - virtual void SAL_CALL queryTermination( const css::lang::EventObject& aEvent ) override; - virtual void SAL_CALL notifyTermination( const css::lang::EventObject& aEvent ) override; - }; + // XTerminateListener + virtual void SAL_CALL queryTermination( const css::lang::EventObject& aEvent ) override; + virtual void SAL_CALL notifyTermination( const css::lang::EventObject& aEvent ) override; + }; } // namespace connectivity::hsqldb diff --git a/connectivity/source/drivers/hsqldb/HUser.cxx b/connectivity/source/drivers/hsqldb/HUser.cxx index 2ed0c06262ff..95cb68ea517f 100644 --- a/connectivity/source/drivers/hsqldb/HUser.cxx +++ b/connectivity/source/drivers/hsqldb/HUser.cxx @@ -27,6 +27,7 @@ #include <com/sun/star/sdbcx/PrivilegeObject.hpp> #include <TConnection.hxx> #include <strings.hrc> +#include <utility> using namespace connectivity; using namespace connectivity::hsqldb; @@ -37,16 +38,16 @@ using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -OHSQLUser::OHSQLUser( const css::uno::Reference< css::sdbc::XConnection >& _xConnection) : connectivity::sdbcx::OUser(true) - ,m_xConnection(_xConnection) +OHSQLUser::OHSQLUser( css::uno::Reference< css::sdbc::XConnection > _xConnection) : connectivity::sdbcx::OUser(true) + ,m_xConnection(std::move(_xConnection)) { construct(); } -OHSQLUser::OHSQLUser( const css::uno::Reference< css::sdbc::XConnection >& _xConnection, +OHSQLUser::OHSQLUser( css::uno::Reference< css::sdbc::XConnection > _xConnection, const OUString& Name ) : connectivity::sdbcx::OUser(Name,true) - ,m_xConnection(_xConnection) + ,m_xConnection(std::move(_xConnection)) { construct(); } @@ -113,7 +114,7 @@ void OHSQLUser::findPrivilegesAndGrantPrivileges(const OUString& objName, sal_In Any aCatalog; if ( !sCatalog.isEmpty() ) aCatalog <<= sCatalog; - xRes = xMeta->getColumnPrivileges(aCatalog,sSchema,sTable,"%"); + xRes = xMeta->getColumnPrivileges(aCatalog,sSchema,sTable,u"%"_ustr); } break; } @@ -266,7 +267,7 @@ void SAL_CALL OHSQLUser::changePassword( const OUString& /*oldPassword*/, const if( m_Name != xMeta->getUserName() ) { - ::dbtools::throwGenericSQLException("HSQLDB can only change password of the current user.", *this); + ::dbtools::throwGenericSQLException(u"HSQLDB can only change password of the current user."_ustr, *this); } OUString sAlterPwd = "SET PASSWORD " + diff --git a/connectivity/source/drivers/hsqldb/HUsers.cxx b/connectivity/source/drivers/hsqldb/HUsers.cxx index 9fe31e58eb01..2141a0045d58 100644 --- a/connectivity/source/drivers/hsqldb/HUsers.cxx +++ b/connectivity/source/drivers/hsqldb/HUsers.cxx @@ -23,6 +23,7 @@ #include <comphelper/types.hxx> #include <connectivity/dbtools.hxx> #include <TConnection.hxx> +#include <utility> using namespace ::comphelper; using namespace connectivity; @@ -30,22 +31,20 @@ using namespace connectivity::hsqldb; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OUsers::OUsers( ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, const ::std::vector< OUString> &_rVector, - const css::uno::Reference< css::sdbc::XConnection >& _xConnection, + css::uno::Reference< css::sdbc::XConnection > _xConnection, connectivity::sdbcx::IRefreshableUsers* _pParent) : sdbcx::OCollection(_rParent, true, _rMutex, _rVector) - ,m_xConnection(_xConnection) + ,m_xConnection(std::move(_xConnection)) ,m_pParent(_pParent) { } -sdbcx::ObjectType OUsers::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > OUsers::createObject(const OUString& _rName) { return new OHSQLUser(m_xConnection,_rName); } @@ -61,7 +60,7 @@ Reference< XPropertySet > OUsers::createDescriptor() } // XAppend -sdbcx::ObjectType OUsers::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > OUsers::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { OUString aQuote = m_xConnection->getMetaData()->getIdentifierQuoteString( ); OUString sPassword; @@ -84,7 +83,7 @@ sdbcx::ObjectType OUsers::appendObject( const OUString& _rForName, const Referen // XDrop void OUsers::dropObject(sal_Int32 /*nPos*/,const OUString& _sElementName) { - OUString aSql( "REVOKE ALL ON * FROM " ); + OUString aSql( u"REVOKE ALL ON * FROM "_ustr ); OUString aQuote = m_xConnection->getMetaData()->getIdentifierQuoteString( ); aSql += ::dbtools::quoteName(aQuote,_sElementName); diff --git a/connectivity/source/drivers/hsqldb/HView.cxx b/connectivity/source/drivers/hsqldb/HView.cxx index 29e5a4000a51..83946ee86f86 100644 --- a/connectivity/source/drivers/hsqldb/HView.cxx +++ b/connectivity/source/drivers/hsqldb/HView.cxx @@ -31,7 +31,7 @@ #include <com/sun/star/sdbc/SQLException.hpp> #include <cppuhelper/exc_hlp.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <unotools/sharedunocomponent.hxx> @@ -146,8 +146,8 @@ namespace connectivity::hsqldb OUString HView::impl_getCommand() const { - OUStringBuffer aCommand; - aCommand.append( "SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.SYSTEM_VIEWS " ); + OUStringBuffer aCommand( + "SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.SYSTEM_VIEWS " ); HTools::appendTableFilterCrit( aCommand, m_CatalogName, m_SchemaName, m_Name, false ); ::utl::SharedUNOComponent< XStatement > xStatement; xStatement.set( m_xConnection->createStatement(), UNO_QUERY_THROW ); Reference< XResultSet > xResult( xStatement->executeQuery( aCommand.makeStringAndClear() ), css::uno::UNO_SET_THROW ); diff --git a/connectivity/source/drivers/hsqldb/HViews.cxx b/connectivity/source/drivers/hsqldb/HViews.cxx index 1f4b807484e5..880b7bc4ce51 100644 --- a/connectivity/source/drivers/hsqldb/HViews.cxx +++ b/connectivity/source/drivers/hsqldb/HViews.cxx @@ -33,10 +33,7 @@ using namespace connectivity; using namespace connectivity::hsqldb; using namespace css::uno; using namespace css::beans; -using namespace css::sdbcx; using namespace css::sdbc; -using namespace css::container; -using namespace css::lang; using namespace dbtools; typedef connectivity::sdbcx::OCollection OCollection_TYPE; @@ -51,7 +48,7 @@ HViews::HViews( const Reference< XConnection >& _rxConnection, ::cppu::OWeakObje } -sdbcx::ObjectType HViews::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > HViews::createObject(const OUString& _rName) { OUString sCatalog,sSchema,sTable; ::dbtools::qualifiedNameComponents(m_xMetaData, @@ -82,7 +79,7 @@ Reference< XPropertySet > HViews::createDescriptor() } // XAppend -sdbcx::ObjectType HViews::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) +css::uno::Reference< css::beans::XPropertySet > HViews::appendObject( const OUString& _rForName, const Reference< XPropertySet >& descriptor ) { createView(descriptor); return createObject( _rForName ); @@ -98,7 +95,7 @@ void HViews::dropObject(sal_Int32 _nPos,const OUString& /*_sElementName*/) bool bIsNew = connectivity::sdbcx::ODescriptor::isNew( xObject ); if (!bIsNew) { - OUString aSql( "DROP VIEW" ); + OUString aSql( u"DROP VIEW"_ustr ); Reference<XPropertySet> xProp(xObject,UNO_QUERY); aSql += ::dbtools::composeTableName( m_xMetaData, xProp, ::dbtools::EComposeRule::InTableDefinitions, true ); diff --git a/connectivity/source/drivers/hsqldb/StorageFileAccess.cxx b/connectivity/source/drivers/hsqldb/StorageFileAccess.cxx index 65457ab1d129..bb07d6673fb1 100644 --- a/connectivity/source/drivers/hsqldb/StorageFileAccess.cxx +++ b/connectivity/source/drivers/hsqldb/StorageFileAccess.cxx @@ -24,8 +24,7 @@ #include <com/sun/star/embed/XStorage.hpp> #include <com/sun/star/lang/IllegalArgumentException.hpp> #include <hsqldb/HStorageMap.hxx> -#include <osl/diagnose.h> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> using namespace ::com::sun::star::container; using namespace ::com::sun::star::uno; @@ -44,42 +43,42 @@ extern "C" SAL_JNI_EXPORT jboolean JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_S { TStorages::mapped_type aStoragePair = StorageContainer::getRegisteredStorage(StorageContainer::jstring2ustring(env,key)); auto storage = aStoragePair.mapStorage(); - if ( storage.is() ) + if ( !storage ) + return JNI_FALSE; + + try { + OUString sName = StorageContainer::jstring2ustring(env,name); try { - OUString sName = StorageContainer::jstring2ustring(env,name); - try + OUString sOldName = StorageContainer::removeOldURLPrefix(sName); + if ( storage->isStreamElement(sOldName) ) { - OUString sOldName = StorageContainer::removeOldURLPrefix(sName); - if ( storage->isStreamElement(sOldName) ) + try + { + storage->renameElement(sOldName,StorageContainer::removeURLPrefix(sName,aStoragePair.url)); + } + catch(const Exception&) { - try - { - storage->renameElement(sOldName,StorageContainer::removeURLPrefix(sName,aStoragePair.url)); - } - catch(const Exception&) - { - } } } - catch(const NoSuchElementException&) - { - } - catch(const IllegalArgumentException&) - { - } - return storage->isStreamElement(StorageContainer::removeURLPrefix(sName,aStoragePair.url)); } catch(const NoSuchElementException&) { } - catch(const Exception&) + catch(const IllegalArgumentException&) { - TOOLS_WARN_EXCEPTION("connectivity.hsqldb", "forwarding"); - if (env->ExceptionCheck()) - env->ExceptionClear(); } + return storage->isStreamElement(StorageContainer::removeURLPrefix(sName,aStoragePair.url)); + } + catch(const NoSuchElementException&) + { + } + catch(const Exception&) + { + TOOLS_WARN_EXCEPTION("connectivity.hsqldb", "forwarding"); + if (env->ExceptionCheck()) + env->ExceptionClear(); } return JNI_FALSE; } diff --git a/connectivity/source/drivers/hsqldb/StorageNativeInputStream.cxx b/connectivity/source/drivers/hsqldb/StorageNativeInputStream.cxx index 4fcbbc5aa6cd..3336c7f78bb0 100644 --- a/connectivity/source/drivers/hsqldb/StorageNativeInputStream.cxx +++ b/connectivity/source/drivers/hsqldb/StorageNativeInputStream.cxx @@ -27,18 +27,16 @@ #include <hsqldb/HStorageMap.hxx> #include <osl/diagnose.h> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include "accesslog.hxx" #include <limits> -using namespace ::com::sun::star::container; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::document; using namespace ::com::sun::star::embed; using namespace ::com::sun::star::io; -using namespace ::com::sun::star::lang; using namespace ::connectivity::hsqldb; /*****************************************************************************/ @@ -136,9 +134,12 @@ extern "C" SAL_JNI_EXPORT jlong JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_Stor #endif if ( n < 0 ) + { ThrowException( env, "java/io/IOException", "n < 0"); + return 0; + } std::shared_ptr<StreamHelper> pHelper = StorageContainer::getRegisteredStream(env,name,key); OSL_ENSURE(pHelper,"No stream helper!"); @@ -155,10 +156,10 @@ extern "C" SAL_JNI_EXPORT jlong JNICALL Java_com_sun_star_sdbcx_comp_hsqldb_Stor try { do { - if (tmpLongVal >= std::numeric_limits<sal_Int64>::max() ) + if (tmpLongVal > std::numeric_limits<sal_Int32>::max() ) tmpIntVal = std::numeric_limits<sal_Int32>::max(); else // Casting is safe here. - tmpIntVal = static_cast<sal_Int32>(tmpLongVal); + tmpIntVal = static_cast<sal_Int32>(tmpLongVal & 0xFFFFFFFF); tmpLongVal -= tmpIntVal; diff --git a/connectivity/source/drivers/hsqldb/StorageNativeOutputStream.cxx b/connectivity/source/drivers/hsqldb/StorageNativeOutputStream.cxx index f766696e0d9b..bccbec20fcd2 100644 --- a/connectivity/source/drivers/hsqldb/StorageNativeOutputStream.cxx +++ b/connectivity/source/drivers/hsqldb/StorageNativeOutputStream.cxx @@ -30,12 +30,8 @@ #include <hsqldb/HStorageAccess.hxx> #include <hsqldb/HStorageMap.hxx> -using namespace ::com::sun::star::container; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::document; -using namespace ::com::sun::star::embed; using namespace ::com::sun::star::io; -using namespace ::com::sun::star::lang; using namespace ::connectivity::hsqldb; diff --git a/connectivity/source/drivers/jdbc/Blob.cxx b/connectivity/source/drivers/jdbc/Blob.cxx index 4531fc9b8724..c62c9ba5599b 100644 --- a/connectivity/source/drivers/jdbc/Blob.cxx +++ b/connectivity/source/drivers/jdbc/Blob.cxx @@ -132,13 +132,12 @@ sal_Int64 SAL_CALL java_sql_Blob::position( const css::uno::Sequence< sal_Int8 > sal_Int64 SAL_CALL java_sql_Blob::positionOfBlob( const css::uno::Reference< css::sdbc::XBlob >& /*pattern*/, sal_Int64 /*start*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XBlob::positionOfBlob", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XBlob::positionOfBlob"_ustr, *this ); // this was put here in CWS warnings01. The previous implementation was defective, as it did ignore // the pattern parameter. Since the effort for proper implementation is rather high - we would need // to translated pattern into a byte[] -, we defer this functionality for the moment (hey, it was // unusable, anyway) // #i57457# - return 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/jdbc/CallableStatement.cxx b/connectivity/source/drivers/jdbc/CallableStatement.cxx index 884de3d4ce10..6c1714e06352 100644 --- a/connectivity/source/drivers/jdbc/CallableStatement.cxx +++ b/connectivity/source/drivers/jdbc/CallableStatement.cxx @@ -33,13 +33,12 @@ using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -IMPLEMENT_SERVICE_INFO(java_sql_CallableStatement,"com.sun.star.sdbcx.ACallableStatement","com.sun.star.sdbc.CallableStatement"); +IMPLEMENT_SERVICE_INFO(java_sql_CallableStatement,u"com.sun.star.sdbcx.ACallableStatement"_ustr,u"com.sun.star.sdbc.CallableStatement"_ustr); //************ Class: java.sql.CallableStatement @@ -62,10 +61,10 @@ Any SAL_CALL java_sql_CallableStatement::queryInterface( const Type & rType ) css::uno::Sequence< css::uno::Type > SAL_CALL java_sql_CallableStatement::getTypes( ) { - ::cppu::OTypeCollection aTypes( cppu::UnoType<css::sdbc::XRow>::get(), - cppu::UnoType<css::sdbc::XOutParameters>::get()); + css::uno::Type aTypes[] { cppu::UnoType<css::sdbc::XRow>::get(), + cppu::UnoType<css::sdbc::XOutParameters>::get() }; - return ::comphelper::concatSequences(aTypes.getTypes(),java_sql_PreparedStatement::getTypes()); + return ::comphelper::concatSequences(java_sql_PreparedStatement::getTypes(), aTypes); } sal_Bool SAL_CALL java_sql_CallableStatement::wasNull( ) diff --git a/connectivity/source/drivers/jdbc/Clob.cxx b/connectivity/source/drivers/jdbc/Clob.cxx index 6108981aca89..e4ed16559555 100644 --- a/connectivity/source/drivers/jdbc/Clob.cxx +++ b/connectivity/source/drivers/jdbc/Clob.cxx @@ -119,14 +119,7 @@ sal_Int64 SAL_CALL java_sql_Clob::position( const OUString& searchstr, sal_Int32 sal_Int64 SAL_CALL java_sql_Clob::positionOfClob( const css::uno::Reference< css::sdbc::XClob >& /*pattern*/, sal_Int64 /*start*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XClob::positionOfClob", *this ); - // this was put here in CWS warnings01. The previous implementation was defective, as it did ignore - // the pattern parameter. Since the effort for proper implementation is rather high - we would need - // to translated pattern into a byte[] -, we defer this functionality for the moment (hey, it was - // unusable, anyway) - // 2005-11-15 / #i57457# / frank.schoenheit@sun.com - return 0; + ::dbtools::throwFeatureNotImplementedSQLException( u"XClob::positionOfClob"_ustr, *this ); } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx b/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx index bd2f8470a2a9..e2553f47c020 100644 --- a/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx +++ b/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx @@ -37,10 +37,7 @@ using namespace ::comphelper; using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; jclass java_sql_DatabaseMetaData::theClass = nullptr; @@ -449,7 +446,7 @@ Reference< XResultSet > SAL_CALL java_sql_DatabaseMetaData::getTablePrivileges( for (sal_Int32 i = 1 ; i <= nCount ; ++i) { sColumnName = xMeta->getColumnName(i); - for (size_t j = 0 ; j < SAL_N_ELEMENTS(sPrivs); ++j) + for (size_t j = 0 ; j < std::size(sPrivs); ++j) { if ( sPrivs[j] == sColumnName ) { @@ -612,8 +609,8 @@ Reference< XResultSet > java_sql_DatabaseMetaData::impl_callResultSetMethodWithS // log the call if ( m_aLogger.isLoggable( LogLevel::FINEST ) ) { - OUString sCatalogLog = bCatalog ? sCatalog : OUString( "null" ); - OUString sSchemaLog = bSchema ? _rSchemaPattern : OUString( "null" ); + OUString sCatalogLog = bCatalog ? sCatalog : u"null"_ustr; + OUString sSchemaLog = bSchema ? _rSchemaPattern : u"null"_ustr; if ( _pOptionalAdditionalString ) m_aLogger.log( LogLevel::FINEST, STR_LOG_META_DATA_METHOD_ARG4, _pMethodName, sCatalogLog, sSchemaLog, _rLeastPattern, *_pOptionalAdditionalString ); else diff --git a/connectivity/source/drivers/jdbc/DriverPropertyInfo.cxx b/connectivity/source/drivers/jdbc/DriverPropertyInfo.cxx index 3fb157fb2446..961fd45f5508 100644 --- a/connectivity/source/drivers/jdbc/DriverPropertyInfo.cxx +++ b/connectivity/source/drivers/jdbc/DriverPropertyInfo.cxx @@ -20,8 +20,6 @@ #include <java/sql/DriverPropertyInfo.hxx> using namespace connectivity; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; //************ Class: java.sql.Driver diff --git a/connectivity/source/drivers/jdbc/JConnection.cxx b/connectivity/source/drivers/jdbc/JConnection.cxx index 5553b1195d29..f99737c8ddfc 100644 --- a/connectivity/source/drivers/jdbc/JConnection.cxx +++ b/connectivity/source/drivers/jdbc/JConnection.cxx @@ -43,6 +43,7 @@ #include <unotools/confignode.hxx> #include <strings.hxx> +#include <utility> #include <vector> #include <memory> @@ -58,8 +59,8 @@ namespace { struct ClassMapEntry { ClassMapEntry( - OUString const & theClassPath, OUString const & theClassName): - classPath(theClassPath), className(theClassName), classLoader(nullptr), + OUString theClassPath, OUString theClassName): + classPath(std::move(theClassPath)), className(std::move(theClassName)), classLoader(nullptr), classObject(nullptr) {} OUString classPath; @@ -165,7 +166,7 @@ bool loadClass( // JVM that are not easily undone). If the pushed ClassMapEntry is // not used after all (return false, etc.) it will be pruned on next // call because its classLoader/classObject are null: - classMapData.map.push_back( ClassMapEntry( classPath, name ) ); + classMapData.map.emplace_back(classPath, name); i = std::prev(classMapData.map.end()); } @@ -238,7 +239,7 @@ bool loadClass( } -IMPLEMENT_SERVICE_INFO(java_sql_Connection,"com.sun.star.sdbcx.JConnection","com.sun.star.sdbc.Connection"); +IMPLEMENT_SERVICE_INFO(java_sql_Connection,u"com.sun.star.sdbcx.JConnection"_ustr,u"com.sun.star.sdbc.Connection"_ustr); //************ Class: java.sql.Connection @@ -405,7 +406,7 @@ void SAL_CALL java_sql_Connection::setTypeMap( const Reference< css::container:: ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setTypeMap", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setTypeMap"_ustr, *this ); } @@ -435,11 +436,10 @@ Reference< XStatement > SAL_CALL java_sql_Connection::createStatement( ) SDBThreadAttach t; rtl::Reference<java_sql_Statement> pStatement = new java_sql_Statement( t.pEnv, *this ); - Reference< XStatement > xStmt = pStatement; - m_aStatements.push_back( WeakReferenceHelper( xStmt ) ); + m_aStatements.emplace_back(Reference< XStatement >(pStatement)); m_aLogger.log( LogLevel::FINE, STR_LOG_CREATED_STATEMENT_ID, pStatement->getStatementObjectID() ); - return xStmt; + return pStatement; } Reference< XPreparedStatement > SAL_CALL java_sql_Connection::prepareStatement( const OUString& sql ) @@ -451,11 +451,10 @@ Reference< XPreparedStatement > SAL_CALL java_sql_Connection::prepareStatement( SDBThreadAttach t; rtl::Reference<java_sql_PreparedStatement> pStatement = new java_sql_PreparedStatement( t.pEnv, *this, sql ); - Reference< XPreparedStatement > xReturn( pStatement ); - m_aStatements.push_back(WeakReferenceHelper(xReturn)); + m_aStatements.emplace_back(Reference< XPreparedStatement >( pStatement )); m_aLogger.log( LogLevel::FINE, STR_LOG_PREPARED_STATEMENT_ID, pStatement->getStatementObjectID() ); - return xReturn; + return pStatement; } Reference< XPreparedStatement > SAL_CALL java_sql_Connection::prepareCall( const OUString& sql ) @@ -467,11 +466,10 @@ Reference< XPreparedStatement > SAL_CALL java_sql_Connection::prepareCall( const SDBThreadAttach t; rtl::Reference<java_sql_CallableStatement> pStatement = new java_sql_CallableStatement( t.pEnv, *this, sql ); - Reference< XPreparedStatement > xStmt( pStatement ); - m_aStatements.push_back(WeakReferenceHelper(xStmt)); + m_aStatements.emplace_back(Reference< XPreparedStatement >( pStatement )); m_aLogger.log( LogLevel::FINE, STR_LOG_PREPARED_CALL_ID, pStatement->getStatementObjectID() ); - return xStmt; + return pStatement; } OUString SAL_CALL java_sql_Connection::nativeSQL( const OUString& sql ) @@ -523,14 +521,10 @@ Any SAL_CALL java_sql_Connection::getWarnings( ) SQLException aAsException( java_sql_SQLWarning( warn_base, *this ) ); // translate to warning - SQLWarning aWarning; - aWarning.Context = aAsException.Context; - aWarning.Message = aAsException.Message; - aWarning.SQLState = aAsException.SQLState; - aWarning.ErrorCode = aAsException.ErrorCode; - aWarning.NextException = aAsException.NextException; - - return makeAny( aWarning ); + SQLWarning aWarning(aAsException.Message, aAsException.Context, aAsException.SQLState, + aAsException.ErrorCode, aAsException.NextException); + + return Any( aWarning ); } return Any(); @@ -705,7 +699,7 @@ OUString java_sql_Connection::impl_getJavaDriverClassPath_nothrow(const OUString if ( aNamesRoot.isValid() && aNamesRoot.hasByName( _sDriverClass ) ) { ::utl::OConfigurationNode aRegisterObj = aNamesRoot.openNode( _sDriverClass ); - OSL_VERIFY( aRegisterObj.getNodeValue( "Path" ) >>= sURL ); + OSL_VERIFY( aRegisterObj.getNodeValue( u"Path"_ustr ) >>= sURL ); } return sURL; } @@ -729,17 +723,17 @@ bool java_sql_Connection::construct(const OUString& url, Sequence< NamedValue > aSystemProperties; ::comphelper::NamedValueCollection aSettings( info ); - sDriverClass = aSettings.getOrDefault( "JavaDriverClass", sDriverClass ); - sDriverClassPath = aSettings.getOrDefault( "JavaDriverClassPath", sDriverClassPath); + sDriverClass = aSettings.getOrDefault( u"JavaDriverClass"_ustr, sDriverClass ); + sDriverClassPath = aSettings.getOrDefault( u"JavaDriverClassPath"_ustr, sDriverClassPath); if ( sDriverClassPath.isEmpty() ) sDriverClassPath = impl_getJavaDriverClassPath_nothrow(sDriverClass); - bAutoRetrievingEnabled = aSettings.getOrDefault( "IsAutoRetrievingEnabled", bAutoRetrievingEnabled ); - sGeneratedValueStatement = aSettings.getOrDefault( "AutoRetrievingStatement", sGeneratedValueStatement ); - m_bIgnoreDriverPrivileges = aSettings.getOrDefault( "IgnoreDriverPrivileges", m_bIgnoreDriverPrivileges ); - m_bIgnoreCurrency = aSettings.getOrDefault( "IgnoreCurrency", m_bIgnoreCurrency ); - aSystemProperties = aSettings.getOrDefault( "SystemProperties", aSystemProperties ); - m_aCatalogRestriction = aSettings.getOrDefault( "ImplicitCatalogRestriction", Any() ); - m_aSchemaRestriction = aSettings.getOrDefault( "ImplicitSchemaRestriction", Any() ); + bAutoRetrievingEnabled = aSettings.getOrDefault( u"IsAutoRetrievingEnabled"_ustr, bAutoRetrievingEnabled ); + sGeneratedValueStatement = aSettings.getOrDefault( u"AutoRetrievingStatement"_ustr, sGeneratedValueStatement ); + m_bIgnoreDriverPrivileges = aSettings.getOrDefault( u"IgnoreDriverPrivileges"_ustr, m_bIgnoreDriverPrivileges ); + m_bIgnoreCurrency = aSettings.getOrDefault( u"IgnoreCurrency"_ustr, m_bIgnoreCurrency ); + aSystemProperties = aSettings.getOrDefault( u"SystemProperties"_ustr, aSystemProperties ); + m_aCatalogRestriction = aSettings.getOrDefault( u"ImplicitCatalogRestriction"_ustr, Any() ); + m_aSchemaRestriction = aSettings.getOrDefault( u"ImplicitSchemaRestriction"_ustr, Any() ); loadDriverFromProperties( sDriverClass, sDriverClassPath, aSystemProperties ); diff --git a/connectivity/source/drivers/jdbc/JDriver.cxx b/connectivity/source/drivers/jdbc/JDriver.cxx index f294d30b4937..efbe25272bea 100644 --- a/connectivity/source/drivers/jdbc/JDriver.cxx +++ b/connectivity/source/drivers/jdbc/JDriver.cxx @@ -47,7 +47,7 @@ java_sql_Driver::~java_sql_Driver() OUString SAL_CALL java_sql_Driver::getImplementationName( ) { - return "com.sun.star.comp.sdbc.JDBCDriver"; + return u"com.sun.star.comp.sdbc.JDBCDriver"_ustr; // this name is referenced in the configuration and in the jdbc.xml // Please take care when changing it. } @@ -60,7 +60,7 @@ sal_Bool SAL_CALL java_sql_Driver::supportsService( const OUString& _rServiceNam Sequence< OUString > SAL_CALL java_sql_Driver::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr }; } Reference< XConnection > SAL_CALL java_sql_Driver::connect( const OUString& url, const @@ -68,12 +68,11 @@ Reference< XConnection > SAL_CALL java_sql_Driver::connect( const OUString& url, { m_aLogger.log( LogLevel::INFO, STR_LOG_DRIVER_CONNECTING_URL, url ); - Reference< XConnection > xOut; + rtl::Reference< java_sql_Connection > xOut; if ( acceptsURL(url ) ) { - rtl::Reference<java_sql_Connection> pConnection = new java_sql_Connection( *this ); - xOut = pConnection; - if ( !pConnection->construct(url,info) ) + xOut = new java_sql_Connection( *this ); + if ( !xOut->construct(url,info) ) xOut.clear(); // an error occurred and the java driver didn't throw an exception else m_aLogger.log( LogLevel::INFO, STR_LOG_DRIVER_SUCCESS ); @@ -108,97 +107,97 @@ Sequence< DriverPropertyInfo > SAL_CALL java_sql_Driver::getPropertyInfo( const { if ( acceptsURL(url) ) { - Sequence< OUString > aBooleanValues{ "false", "true" }; + Sequence< OUString > aBooleanValues{ u"false"_ustr, u"true"_ustr }; return { { - "JavaDriverClass" - ,"The JDBC driver class name." + u"JavaDriverClass"_ustr + ,u"The JDBC driver class name."_ustr ,true ,OUString() ,Sequence< OUString >() }, { - "JavaDriverClassPath" - ,"The class path where to look for the JDBC driver." + u"JavaDriverClassPath"_ustr + ,u"The class path where to look for the JDBC driver."_ustr ,true - , "" + , u""_ustr ,Sequence< OUString >() }, { - "SystemProperties" - ,"Additional properties to set at java.lang.System before loading the driver." + u"SystemProperties"_ustr + ,u"Additional properties to set at java.lang.System before loading the driver."_ustr ,true - , "" + , u""_ustr ,Sequence< OUString >() }, { - "ParameterNameSubstitution" - ,"Change named parameters with '?'." + u"ParameterNameSubstitution"_ustr + ,u"Change named parameters with '?'."_ustr ,false - ,"false" + ,u"false"_ustr ,aBooleanValues }, { - "IgnoreDriverPrivileges" - ,"Ignore the privileges from the database driver." + u"IgnoreDriverPrivileges"_ustr + ,u"Ignore the privileges from the database driver."_ustr ,false - , "false" + , u"false"_ustr ,aBooleanValues }, { - "IsAutoRetrievingEnabled" - ,"Retrieve generated values." + u"IsAutoRetrievingEnabled"_ustr + ,u"Retrieve generated values."_ustr ,false - ,"false" + ,u"false"_ustr ,aBooleanValues }, { - "AutoRetrievingStatement" - ,"Auto-increment statement." + u"AutoRetrievingStatement"_ustr + ,u"Auto-increment statement."_ustr ,false ,OUString() ,Sequence< OUString >() }, { - "GenerateASBeforeCorrelationName" - ,"Generate AS before table correlation names." + u"GenerateASBeforeCorrelationName"_ustr + ,u"Generate AS before table correlation names."_ustr ,false - ,"false" + ,u"false"_ustr ,aBooleanValues }, { - "IgnoreCurrency" - ,"Ignore the currency field from the ResultsetMetaData." + u"IgnoreCurrency"_ustr + ,u"Ignore the currency field from the ResultsetMetaData."_ustr ,false - ,"false" + ,u"false"_ustr ,aBooleanValues }, { - "EscapeDateTime" - ,"Escape date time format." + u"EscapeDateTime"_ustr + ,u"Escape date time format."_ustr ,false - ,"true" + ,u"true"_ustr ,aBooleanValues }, { - "TypeInfoSettings" - ,"Defines how the type info of the database metadata should be manipulated." + u"TypeInfoSettings"_ustr + ,u"Defines how the type info of the database metadata should be manipulated."_ustr ,false ,OUString() ,Sequence< OUString > () }, { - "ImplicitCatalogRestriction" - ,"The catalog which should be used in getTables calls, when the caller passed NULL." + u"ImplicitCatalogRestriction"_ustr + ,u"The catalog which should be used in getTables calls, when the caller passed NULL."_ustr ,false ,OUString( ) ,Sequence< OUString > () }, { - "ImplicitSchemaRestriction" - ,"The schema which should be used in getTables calls, when the caller passed NULL." + u"ImplicitSchemaRestriction"_ustr + ,u"The schema which should be used in getTables calls, when the caller passed NULL."_ustr ,false ,OUString( ) ,Sequence< OUString > () @@ -208,7 +207,6 @@ Sequence< DriverPropertyInfo > SAL_CALL java_sql_Driver::getPropertyInfo( const ::connectivity::SharedResources aResources; const OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); ::dbtools::throwGenericSQLException(sMessage ,*this); - return Sequence< DriverPropertyInfo >(); } sal_Int32 SAL_CALL java_sql_Driver::getMajorVersion( ) diff --git a/connectivity/source/drivers/jdbc/JStatement.cxx b/connectivity/source/drivers/jdbc/JStatement.cxx index df9d660f554c..da53ee7f50bb 100644 --- a/connectivity/source/drivers/jdbc/JStatement.cxx +++ b/connectivity/source/drivers/jdbc/JStatement.cxx @@ -31,7 +31,7 @@ #include <comphelper/sequence.hxx> #include <TConnection.hxx> #include <comphelper/types.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <com/sun/star/sdbc/ResultSetConcurrency.hpp> #include <com/sun/star/sdbc/ResultSetType.hpp> @@ -378,9 +378,9 @@ Any SAL_CALL java_sql_Statement_Base::getWarnings( ) if( out ) { java_sql_SQLWarning_BASE warn_base( t.pEnv, out ); - return makeAny( + return Any( static_cast< css::sdbc::SQLException >( - java_sql_SQLWarning(warn_base,*static_cast<cppu::OWeakObject*>(this)))); + java_sql_SQLWarning(warn_base,getXWeak()))); } return Any(); @@ -576,31 +576,71 @@ void java_sql_Statement_Base::setCursorName(const OUString &_par0) ::cppu::IPropertyArrayHelper* java_sql_Statement_Base::createArrayHelper( ) const { - Sequence< Property > aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), - PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), - PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), - PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), - PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), - PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), + PROPERTY_ID_ESCAPEPROCESSING, + cppu::UnoType<bool>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), + PROPERTY_ID_MAXFIELDSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), + PROPERTY_ID_MAXROWS, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), + PROPERTY_ID_QUERYTIMEOUT, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), + PROPERTY_ID_USEBOOKMARKS, + cppu::UnoType<bool>::get(), + 0 + } + } + }; } @@ -793,7 +833,7 @@ void java_sql_Statement::createStatement(JNIEnv* _pEnv) } -IMPLEMENT_SERVICE_INFO(java_sql_Statement,"com.sun.star.sdbcx.JStatement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(java_sql_Statement,u"com.sun.star.sdbcx.JStatement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); void SAL_CALL java_sql_Statement_Base::acquire() noexcept { diff --git a/connectivity/source/drivers/jdbc/Object.cxx b/connectivity/source/drivers/jdbc/Object.cxx index b2dd83168e5e..65d6680d745e 100644 --- a/connectivity/source/drivers/jdbc/Object.cxx +++ b/connectivity/source/drivers/jdbc/Object.cxx @@ -29,13 +29,9 @@ #include <comphelper/logging.hxx> #include <cppuhelper/exc_hlp.hxx> -#include <memory> - using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; diff --git a/connectivity/source/drivers/jdbc/PreparedStatement.cxx b/connectivity/source/drivers/jdbc/PreparedStatement.cxx index 33aadcbca840..65ff309c019c 100644 --- a/connectivity/source/drivers/jdbc/PreparedStatement.cxx +++ b/connectivity/source/drivers/jdbc/PreparedStatement.cxx @@ -40,7 +40,6 @@ using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; @@ -48,7 +47,7 @@ using namespace ::com::sun::star::lang; //************ Class: java.sql.PreparedStatement -IMPLEMENT_SERVICE_INFO(java_sql_PreparedStatement,"com.sun.star.sdbcx.JPreparedStatement","com.sun.star.sdbc.PreparedStatement"); +IMPLEMENT_SERVICE_INFO(java_sql_PreparedStatement,u"com.sun.star.sdbcx.JPreparedStatement"_ustr,u"com.sun.star.sdbc.PreparedStatement"_ustr); java_sql_PreparedStatement::java_sql_PreparedStatement( JNIEnv * pEnv, java_sql_Connection& _rCon, const OUString& sql ) : OStatement_BASE2( pEnv, _rCon ) @@ -296,25 +295,25 @@ void SAL_CALL java_sql_PreparedStatement::setNull( sal_Int32 parameterIndex, sal void SAL_CALL java_sql_PreparedStatement::setClob( sal_Int32 /*parameterIndex*/, const css::uno::Reference< css::sdbc::XClob >& /*x*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XParameters::setClob", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XParameters::setClob"_ustr, *this ); } void SAL_CALL java_sql_PreparedStatement::setBlob( sal_Int32 /*parameterIndex*/, const css::uno::Reference< css::sdbc::XBlob >& /*x*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XParameters::setBlob", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XParameters::setBlob"_ustr, *this ); } void SAL_CALL java_sql_PreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const css::uno::Reference< css::sdbc::XArray >& /*x*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XParameters::setArray", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XParameters::setArray"_ustr, *this ); } void SAL_CALL java_sql_PreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const css::uno::Reference< css::sdbc::XRef >& /*x*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XParameters::setRef", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XParameters::setRef"_ustr, *this ); } diff --git a/connectivity/source/drivers/jdbc/ResultSet.cxx b/connectivity/source/drivers/jdbc/ResultSet.cxx index 4c7ec72c54f7..e88fb9600138 100644 --- a/connectivity/source/drivers/jdbc/ResultSet.cxx +++ b/connectivity/source/drivers/jdbc/ResultSet.cxx @@ -58,7 +58,7 @@ using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -IMPLEMENT_SERVICE_INFO(java_sql_ResultSet,"com.sun.star.sdbcx.JResultSet","com.sun.star.sdbc.ResultSet"); +IMPLEMENT_SERVICE_INFO(java_sql_ResultSet,u"com.sun.star.sdbcx.JResultSet"_ustr,u"com.sun.star.sdbc.ResultSet"_ustr); //************ Class: java.sql.ResultSet @@ -74,7 +74,7 @@ java_sql_ResultSet::java_sql_ResultSet( JNIEnv * pEnv, jobject myObj, const java SDBThreadAttach::addRef(); osl_atomic_increment(&m_refCount); if ( pStmt ) - m_xStatement = *pStmt; + m_xStatement = pStmt; osl_atomic_decrement(&m_refCount); } @@ -104,7 +104,8 @@ void java_sql_ResultSet::disposing() ::osl::MutexGuard aGuard(m_aMutex); if( object ) { - SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java environment has been deleted!"); + SDBThreadAttach t; + assert(t.pEnv && "Java environment has been deleted!"); static jmethodID mID(nullptr); callVoidMethod_ThrowSQL("close", mID); clearObject(*t.pEnv); @@ -451,7 +452,7 @@ sal_Bool SAL_CALL java_sql_ResultSet::previous( ) Reference< XInterface > SAL_CALL java_sql_ResultSet::getStatement( ) { - return m_xStatement; + return cppu::getXWeak(m_xStatement.get()); } @@ -514,7 +515,7 @@ css::uno::Any SAL_CALL java_sql_ResultSet::getWarnings( ) if( out ) { java_sql_SQLWarning_BASE warn_base( t.pEnv, out ); - return makeAny( + return Any( static_cast< css::sdbc::SQLException >( java_sql_SQLWarning(warn_base,*this))); } @@ -730,7 +731,7 @@ void SAL_CALL java_sql_ResultSet::updateBinaryStream( sal_Int32 columnIndex, con catch(const Exception&) { Any anyEx = ::cppu::getCaughtException(); - ::dbtools::throwFeatureNotImplementedSQLException( "XRowUpdate::updateBinaryStream", *this, anyEx ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XRowUpdate::updateBinaryStream"_ustr, *this, anyEx ); } } @@ -762,7 +763,7 @@ void SAL_CALL java_sql_ResultSet::updateCharacterStream( sal_Int32 columnIndex, catch(const Exception&) { Any anyEx = ::cppu::getCaughtException(); - ::dbtools::throwFeatureNotImplementedSQLException( "XRowUpdate::updateCharacterStream", *this, anyEx ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XRowUpdate::updateCharacterStream"_ustr, *this, anyEx ); } } @@ -873,25 +874,41 @@ void java_sql_ResultSet::setFetchSize(sal_Int32 _par0) ::cppu::IPropertyArrayHelper* java_sql_ResultSet::createArrayHelper( ) const { - Sequence< Property > aProps(5); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY + } + } + }; } ::cppu::IPropertyArrayHelper & java_sql_ResultSet::getInfoHelper() diff --git a/connectivity/source/drivers/jdbc/ResultSetMetaData.cxx b/connectivity/source/drivers/jdbc/ResultSetMetaData.cxx index fdf5bfe69c29..b5827ea991e7 100644 --- a/connectivity/source/drivers/jdbc/ResultSetMetaData.cxx +++ b/connectivity/source/drivers/jdbc/ResultSetMetaData.cxx @@ -21,10 +21,7 @@ #include <java/sql/Connection.hxx> using namespace connectivity; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; diff --git a/connectivity/source/drivers/jdbc/SQLException.cxx b/connectivity/source/drivers/jdbc/SQLException.cxx index 55bf0996c941..49fa95c456d5 100644 --- a/connectivity/source/drivers/jdbc/SQLException.cxx +++ b/connectivity/source/drivers/jdbc/SQLException.cxx @@ -22,7 +22,6 @@ using namespace connectivity; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::lang; //************ Class: java.sql.SQLException @@ -31,7 +30,7 @@ java_sql_SQLException::java_sql_SQLException( const java_sql_SQLException_BASE& _rContext, _rException.getSQLState(), _rException.getErrorCode(), - makeAny(_rException.getNextException()) + Any(_rException.getNextException()) ) { } diff --git a/connectivity/source/drivers/jdbc/tools.cxx b/connectivity/source/drivers/jdbc/tools.cxx index 4a4d5069ea18..ad133ee5726d 100644 --- a/connectivity/source/drivers/jdbc/tools.cxx +++ b/connectivity/source/drivers/jdbc/tools.cxx @@ -32,7 +32,6 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; void java_util_Properties::setProperty(const OUString& key, const OUString& value) { @@ -182,7 +181,7 @@ jobject connectivity::convertTypeMapToJavaMap(const Reference< css::container::X { css::uno::Sequence< OUString > aNames = _rMap->getElementNames(); if ( aNames.hasElements() ) - ::dbtools::throwFeatureNotImplementedSQLException( "Type maps", nullptr ); + ::dbtools::throwFeatureNotImplementedSQLException( u"Type maps"_ustr, nullptr ); } return nullptr; } diff --git a/connectivity/source/drivers/macab/MacabAddressBook.cxx b/connectivity/source/drivers/macab/MacabAddressBook.cxx index a14b7abee9b9..7ade1ac0a830 100644 --- a/connectivity/source/drivers/macab/MacabAddressBook.cxx +++ b/connectivity/source/drivers/macab/MacabAddressBook.cxx @@ -82,6 +82,13 @@ MacabAddressBook::MacabAddressBook( ) m_xMacabRecords(nullptr), m_bRetrievedGroups(false) { + if(m_aAddressBook == nullptr) + { + // TODO: tell the user to reset the permission via "tccutil reset AddressBook" + // or the system preferences and try again, this time granting the access + throw RuntimeException( + "failed to access the macOS address book - permission not granted?" ); + } } @@ -106,8 +113,8 @@ MacabAddressBook::~MacabAddressBook() const OUString & MacabAddressBook::getDefaultTableName() { /* This string probably needs to be localized. */ - static const OUString aDefaultTableName - (OUString("Address Book")); + static constexpr OUString aDefaultTableName + (u"Address Book"_ustr); return aDefaultTableName; } diff --git a/connectivity/source/drivers/macab/MacabAddressBook.hxx b/connectivity/source/drivers/macab/MacabAddressBook.hxx index a23e0c1eb2e7..a12ba6c5be12 100644 --- a/connectivity/source/drivers/macab/MacabAddressBook.hxx +++ b/connectivity/source/drivers/macab/MacabAddressBook.hxx @@ -32,28 +32,28 @@ namespace connectivity::macab { - class MacabAddressBook - { - protected: - ABAddressBookRef m_aAddressBook; - MacabRecords *m_xMacabRecords; - std::vector<MacabGroup *> m_xMacabGroups; - bool m_bRetrievedGroups; - - public: - MacabAddressBook(); - ~MacabAddressBook(); - static const OUString & getDefaultTableName(); - - MacabRecords *getMacabRecords(); - std::vector<MacabGroup *> getMacabGroups(); - - MacabGroup *getMacabGroup(std::u16string_view _groupName); - MacabRecords *getMacabRecords(std::u16string_view _tableName); - - MacabGroup *getMacabGroupMatch(const OUString& _groupName); - MacabRecords *getMacabRecordsMatch(const OUString& _tableName); - }; + class MacabAddressBook + { + protected: + ABAddressBookRef m_aAddressBook; + MacabRecords *m_xMacabRecords; + std::vector<MacabGroup *> m_xMacabGroups; + bool m_bRetrievedGroups; + + public: + MacabAddressBook(); + ~MacabAddressBook(); + static const OUString & getDefaultTableName(); + + MacabRecords *getMacabRecords(); + std::vector<MacabGroup *> getMacabGroups(); + + MacabGroup *getMacabGroup(std::u16string_view _groupName); + MacabRecords *getMacabRecords(std::u16string_view _tableName); + + MacabGroup *getMacabGroupMatch(const OUString& _groupName); + MacabRecords *getMacabRecordsMatch(const OUString& _tableName); + }; } diff --git a/connectivity/source/drivers/macab/MacabCatalog.cxx b/connectivity/source/drivers/macab/MacabCatalog.cxx index 96ff62fd5b6a..d6485ab1c971 100644 --- a/connectivity/source/drivers/macab/MacabCatalog.cxx +++ b/connectivity/source/drivers/macab/MacabCatalog.cxx @@ -80,7 +80,7 @@ void MacabCatalog::refreshUsers() const OUString& MacabCatalog::getDot() { - static const OUString sDot = "."; + static constexpr OUString sDot = u"."_ustr; return sDot; } diff --git a/connectivity/source/drivers/macab/MacabCatalog.hxx b/connectivity/source/drivers/macab/MacabCatalog.hxx index 1757bb908851..8a12125b1284 100644 --- a/connectivity/source/drivers/macab/MacabCatalog.hxx +++ b/connectivity/source/drivers/macab/MacabCatalog.hxx @@ -23,29 +23,29 @@ namespace connectivity::macab { - class MacabConnection; + class MacabConnection; - class MacabCatalog : public connectivity::sdbcx::OCatalog - { - MacabConnection* m_pConnection; // used to get the metadata + class MacabCatalog : public connectivity::sdbcx::OCatalog + { + MacabConnection* m_pConnection; // used to get the metadata - public: - explicit MacabCatalog(MacabConnection* _pCon); + public: + explicit MacabCatalog(MacabConnection* _pCon); - MacabConnection* getConnection() const { return m_pConnection; } + MacabConnection* getConnection() const { return m_pConnection; } - static const OUString& getDot(); + static const OUString& getDot(); - // implementation of the pure virtual methods - virtual void refreshTables() override; - virtual void refreshViews() override; - virtual void refreshGroups() override; - virtual void refreshUsers() override; + // implementation of the pure virtual methods + virtual void refreshTables() override; + virtual void refreshViews() override; + virtual void refreshGroups() override; + virtual void refreshUsers() override; - // XTablesSupplier - virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTables( - ) override; - }; + // XTablesSupplier + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTables( + ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabColumns.cxx b/connectivity/source/drivers/macab/MacabColumns.cxx index 6a49ad1d066c..ef6c0a6d255f 100644 --- a/connectivity/source/drivers/macab/MacabColumns.cxx +++ b/connectivity/source/drivers/macab/MacabColumns.cxx @@ -36,7 +36,7 @@ using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -sdbcx::ObjectType MacabColumns::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > MacabColumns::createObject(const OUString& _rName) { const Any aCatalog; const OUString sCatalogName; @@ -45,7 +45,7 @@ sdbcx::ObjectType MacabColumns::createObject(const OUString& _rName) Reference< XResultSet > xResult = m_pTable->getConnection()->getMetaData()->getColumns( aCatalog, sSchemaName, sTableName, _rName); - sdbcx::ObjectType xRet; + css::uno::Reference< css::beans::XPropertySet > xRet; if (xResult.is()) { Reference< XRow > xRow(xResult,UNO_QUERY); diff --git a/connectivity/source/drivers/macab/MacabColumns.hxx b/connectivity/source/drivers/macab/MacabColumns.hxx index 7123af89d30a..1da4021734c3 100644 --- a/connectivity/source/drivers/macab/MacabColumns.hxx +++ b/connectivity/source/drivers/macab/MacabColumns.hxx @@ -24,19 +24,19 @@ namespace connectivity::macab { - class MacabColumns : public sdbcx::OCollection - { - protected: - MacabTable* m_pTable; + class MacabColumns : public sdbcx::OCollection + { + protected: + MacabTable* m_pTable; - virtual sdbcx::ObjectType createObject(const OUString& _rName) override; - virtual void impl_refresh() override; + virtual css::uno::Reference< css::beans::XPropertySet > createObject(const OUString& _rName) override; + virtual void impl_refresh() override; - public: - MacabColumns( MacabTable* _pTable, - ::osl::Mutex& _rMutex, - const ::std::vector< OUString> &_rVector); - }; + public: + MacabColumns( MacabTable* _pTable, + ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector); + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabConnection.hxx b/connectivity/source/drivers/macab/MacabConnection.hxx index b18d4778e2da..b9fa3c58e23e 100644 --- a/connectivity/source/drivers/macab/MacabConnection.hxx +++ b/connectivity/source/drivers/macab/MacabConnection.hxx @@ -19,10 +19,8 @@ #pragma once -#include <map> #include <connectivity/CommonTools.hxx> #include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/sdbc/SQLWarning.hpp> #include <com/sun/star/sdbc/XWarningsSupplier.hpp> #include <com/sun/star/sdbc/XConnection.hpp> #include <com/sun/star/sdbcx/XTablesSupplier.hpp> @@ -32,81 +30,79 @@ namespace connectivity::macab { - typedef ::cppu::WeakComponentImplHelper<css::sdbc::XConnection, - css::sdbc::XWarningsSupplier, - css::lang::XServiceInfo - > OMetaConnection_BASE; - - class MacabDriver; - class MacabAddressBook; - - typedef std::vector< css::uno::WeakReferenceHelper > OWeakRefArray; - - typedef connectivity::OMetaConnection MacabConnection_BASE; - - class MacabConnection : public MacabConnection_BASE - { - protected: - - // Data attributes - - MacabAddressBook* m_pAddressBook; // the address book - MacabDriver* m_pDriver; // pointer to the owning driver object - css::uno::Reference< css::sdbcx::XTablesSupplier> - m_xCatalog; // needed for the SQL interpreter - - private: - bool doIsClosed(); - - void doClose(); - - public: - /// @throws css::sdbc::SQLException - virtual void construct( const OUString& url,const css::uno::Sequence< css::beans::PropertyValue >& info); - - explicit MacabConnection(MacabDriver* _pDriver); - virtual ~MacabConnection() override; - - // OComponentHelper - virtual void SAL_CALL disposing() override; - - // XServiceInfo - DECLARE_SERVICE_INFO(); - - // XConnection - virtual css::uno::Reference< css::sdbc::XStatement > SAL_CALL createStatement( ) override; - virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const OUString& sql ) override; - virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareCall( const OUString& sql ) override; - virtual OUString SAL_CALL nativeSQL( const OUString& sql ) override; - virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) override; - virtual sal_Bool SAL_CALL getAutoCommit( ) override; - virtual void SAL_CALL commit( ) override; - virtual void SAL_CALL rollback( ) override; - virtual sal_Bool SAL_CALL isClosed( ) override; - virtual css::uno::Reference< css::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) override; - virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) override; - virtual sal_Bool SAL_CALL isReadOnly( ) override; - virtual void SAL_CALL setCatalog( const OUString& catalog ) override; - virtual OUString SAL_CALL getCatalog( ) override; - virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) override; - virtual sal_Int32 SAL_CALL getTransactionIsolation( ) override; - virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTypeMap( ) override; - virtual void SAL_CALL setTypeMap( const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; - - // XCloseable - virtual void SAL_CALL close( ) override; - - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - - // needed for the SQL interpreter - css::uno::Reference< css::sdbcx::XTablesSupplier > createCatalog(); - - // accessors - MacabDriver* getDriver() const { return m_pDriver;} - MacabAddressBook* getAddressBook() const; - }; + typedef ::cppu::WeakComponentImplHelper<css::sdbc::XConnection, + css::sdbc::XWarningsSupplier, + css::lang::XServiceInfo + > OMetaConnection_BASE; + + class MacabDriver; + class MacabAddressBook; + + typedef connectivity::OMetaConnection MacabConnection_BASE; + + class MacabConnection : public MacabConnection_BASE + { + protected: + + // Data attributes + + MacabAddressBook* m_pAddressBook; // the address book + MacabDriver* m_pDriver; // pointer to the owning driver object + css::uno::Reference< css::sdbcx::XTablesSupplier> + m_xCatalog; // needed for the SQL interpreter + + private: + bool doIsClosed(); + + void doClose(); + + public: + /// @throws css::sdbc::SQLException + virtual void construct( const OUString& url,const css::uno::Sequence< css::beans::PropertyValue >& info); + + explicit MacabConnection(MacabDriver* _pDriver); + virtual ~MacabConnection() override; + + // OComponentHelper + virtual void SAL_CALL disposing() override; + + // XServiceInfo + DECLARE_SERVICE_INFO(); + + // XConnection + virtual css::uno::Reference< css::sdbc::XStatement > SAL_CALL createStatement( ) override; + virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const OUString& sql ) override; + virtual css::uno::Reference< css::sdbc::XPreparedStatement > SAL_CALL prepareCall( const OUString& sql ) override; + virtual OUString SAL_CALL nativeSQL( const OUString& sql ) override; + virtual void SAL_CALL setAutoCommit( sal_Bool autoCommit ) override; + virtual sal_Bool SAL_CALL getAutoCommit( ) override; + virtual void SAL_CALL commit( ) override; + virtual void SAL_CALL rollback( ) override; + virtual sal_Bool SAL_CALL isClosed( ) override; + virtual css::uno::Reference< css::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) override; + virtual void SAL_CALL setReadOnly( sal_Bool readOnly ) override; + virtual sal_Bool SAL_CALL isReadOnly( ) override; + virtual void SAL_CALL setCatalog( const OUString& catalog ) override; + virtual OUString SAL_CALL getCatalog( ) override; + virtual void SAL_CALL setTransactionIsolation( sal_Int32 level ) override; + virtual sal_Int32 SAL_CALL getTransactionIsolation( ) override; + virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getTypeMap( ) override; + virtual void SAL_CALL setTypeMap( const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; + + // XCloseable + virtual void SAL_CALL close( ) override; + + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + + // needed for the SQL interpreter + css::uno::Reference< css::sdbcx::XTablesSupplier > createCatalog(); + + // accessors + MacabDriver* getDriver() const { return m_pDriver;} + MacabAddressBook* getAddressBook() const; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabDatabaseMetaData.cxx b/connectivity/source/drivers/macab/MacabDatabaseMetaData.cxx index 5c55fa60d54b..b0b04fc08f21 100644 --- a/connectivity/source/drivers/macab/MacabDatabaseMetaData.cxx +++ b/connectivity/source/drivers/macab/MacabDatabaseMetaData.cxx @@ -30,6 +30,7 @@ #include <com/sun/star/sdbc/ColumnSearch.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> #include <com/sun/star/sdbc/ResultSetType.hpp> +#include <com/sun/star/sdbc/SQLException.hpp> #include <com/sun/star/sdbc/TransactionIsolation.hpp> #include <rtl/ref.hxx> @@ -922,7 +923,7 @@ Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getTables( // check whether we have tables in the requested types // for the moment, we answer only the "TABLE" table type // when no types are given at all, we return all the tables - static constexpr OUStringLiteral aTable = u"TABLE"; + static constexpr OUString aTable = u"TABLE"_ustr; bool bTableFound = false; const OUString* p = types.getConstArray(), * pEnd = p + types.getLength(); @@ -957,7 +958,7 @@ Reference< XResultSet > SAL_CALL MacabDatabaseMetaData::getTables( aRow[1] = ODatabaseMetaDataResultSet::getEmptyValue(); aRow[2] = ODatabaseMetaDataResultSet::getEmptyValue(); aRow[3] = new ORowSetValueDecorator(xRecords->getName()); - aRow[4] = new ORowSetValueDecorator(OUString(aTable)); + aRow[4] = new ORowSetValueDecorator(aTable); aRow[5] = ODatabaseMetaDataResultSet::getEmptyValue(); tmp.push_back(aRow); diff --git a/connectivity/source/drivers/macab/MacabDatabaseMetaData.hxx b/connectivity/source/drivers/macab/MacabDatabaseMetaData.hxx index 662be1c018ce..d5d127fa1025 100644 --- a/connectivity/source/drivers/macab/MacabDatabaseMetaData.hxx +++ b/connectivity/source/drivers/macab/MacabDatabaseMetaData.hxx @@ -26,170 +26,170 @@ namespace connectivity::macab { - class MacabDatabaseMetaData : public ::cppu::WeakImplHelper< css::sdbc::XDatabaseMetaData> - { - rtl::Reference< MacabConnection > m_xConnection; - bool m_bUseCatalog; + class MacabDatabaseMetaData : public ::cppu::WeakImplHelper< css::sdbc::XDatabaseMetaData> + { + rtl::Reference< MacabConnection > m_xConnection; + bool m_bUseCatalog; - public: + public: - MacabConnection* getOwnConnection() const { return m_xConnection.get(); } + MacabConnection* getOwnConnection() const { return m_xConnection.get(); } - explicit MacabDatabaseMetaData(MacabConnection* _pCon); - virtual ~MacabDatabaseMetaData() override; + explicit MacabDatabaseMetaData(MacabConnection* _pCon); + virtual ~MacabDatabaseMetaData() override; - // this interface is really BIG - // XDatabaseMetaData - virtual sal_Bool SAL_CALL allProceduresAreCallable( ) override; - virtual sal_Bool SAL_CALL allTablesAreSelectable( ) override; - virtual OUString SAL_CALL getURL( ) override; - virtual OUString SAL_CALL getUserName( ) override; - virtual sal_Bool SAL_CALL isReadOnly( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedLow( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) override; - virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) override; - virtual OUString SAL_CALL getDatabaseProductName( ) override; - virtual OUString SAL_CALL getDatabaseProductVersion( ) override; - virtual OUString SAL_CALL getDriverName( ) override; - virtual OUString SAL_CALL getDriverVersion( ) override; - virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) override; - virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) override; - virtual sal_Bool SAL_CALL usesLocalFiles( ) override; - virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) override; - virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) override; - virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) override; - virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) override; - virtual OUString SAL_CALL getIdentifierQuoteString( ) override; - virtual OUString SAL_CALL getSQLKeywords( ) override; - virtual OUString SAL_CALL getNumericFunctions( ) override; - virtual OUString SAL_CALL getStringFunctions( ) override; - virtual OUString SAL_CALL getSystemFunctions( ) override; - virtual OUString SAL_CALL getTimeDateFunctions( ) override; - virtual OUString SAL_CALL getSearchStringEscape( ) override; - virtual OUString SAL_CALL getExtraNameCharacters( ) override; - virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) override; - virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) override; - virtual sal_Bool SAL_CALL supportsColumnAliasing( ) override; - virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) override; - virtual sal_Bool SAL_CALL supportsTypeConversion( ) override; - virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) override; - virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) override; - virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) override; - virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) override; - virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) override; - virtual sal_Bool SAL_CALL supportsGroupBy( ) override; - virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) override; - virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) override; - virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) override; - virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) override; - virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) override; - virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) override; - virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) override; - virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) override; - virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) override; - virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) override; - virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) override; - virtual sal_Bool SAL_CALL supportsOuterJoins( ) override; - virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) override; - virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) override; - virtual OUString SAL_CALL getSchemaTerm( ) override; - virtual OUString SAL_CALL getProcedureTerm( ) override; - virtual OUString SAL_CALL getCatalogTerm( ) override; - virtual sal_Bool SAL_CALL isCatalogAtStart( ) override; - virtual OUString SAL_CALL getCatalogSeparator( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) override; - virtual sal_Bool SAL_CALL supportsPositionedDelete( ) override; - virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) override; - virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) override; - virtual sal_Bool SAL_CALL supportsStoredProcedures( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) override; - virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) override; - virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) override; - virtual sal_Bool SAL_CALL supportsUnion( ) override; - virtual sal_Bool SAL_CALL supportsUnionAll( ) override; - virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) override; - virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) override; - virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) override; - virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) override; - virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) override; - virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) override; - virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) override; - virtual sal_Int32 SAL_CALL getMaxConnections( ) override; - virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxIndexLength( ) override; - virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxRowSize( ) override; - virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) override; - virtual sal_Int32 SAL_CALL getMaxStatementLength( ) override; - virtual sal_Int32 SAL_CALL getMaxStatements( ) override; - virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) override; - virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) override; - virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) override; - virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) override; - virtual sal_Bool SAL_CALL supportsTransactions( ) override; - virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) override; - virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) override; - virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) override; - virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) override; - virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedures( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedureColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern, const OUString& columnNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const css::uno::Sequence< OUString >& types ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getSchemas( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCatalogs( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const css::uno::Any& catalog, const OUString& schema, const OUString& table, const OUString& columnNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTablePrivileges( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Int32 scope, sal_Bool nullable ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getVersionColumns( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getImportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getExportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCrossReference( const css::uno::Any& primaryCatalog, const OUString& primarySchema, const OUString& primaryTable, const css::uno::Any& foreignCatalog, const OUString& foreignSchema, const OUString& foreignTable ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTypeInfo( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getIndexInfo( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Bool unique, sal_Bool approximate ) override; - virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) override; - virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) override; - virtual sal_Bool SAL_CALL supportsBatchUpdates( ) override; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& typeNamePattern, const css::uno::Sequence< sal_Int32 >& types ) override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; - }; + // this interface is really BIG + // XDatabaseMetaData + virtual sal_Bool SAL_CALL allProceduresAreCallable( ) override; + virtual sal_Bool SAL_CALL allTablesAreSelectable( ) override; + virtual OUString SAL_CALL getURL( ) override; + virtual OUString SAL_CALL getUserName( ) override; + virtual sal_Bool SAL_CALL isReadOnly( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedHigh( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedLow( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedAtStart( ) override; + virtual sal_Bool SAL_CALL nullsAreSortedAtEnd( ) override; + virtual OUString SAL_CALL getDatabaseProductName( ) override; + virtual OUString SAL_CALL getDatabaseProductVersion( ) override; + virtual OUString SAL_CALL getDriverName( ) override; + virtual OUString SAL_CALL getDriverVersion( ) override; + virtual sal_Int32 SAL_CALL getDriverMajorVersion( ) override; + virtual sal_Int32 SAL_CALL getDriverMinorVersion( ) override; + virtual sal_Bool SAL_CALL usesLocalFiles( ) override; + virtual sal_Bool SAL_CALL usesLocalFilePerTable( ) override; + virtual sal_Bool SAL_CALL supportsMixedCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesUpperCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesLowerCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesMixedCaseIdentifiers( ) override; + virtual sal_Bool SAL_CALL supportsMixedCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesUpperCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesLowerCaseQuotedIdentifiers( ) override; + virtual sal_Bool SAL_CALL storesMixedCaseQuotedIdentifiers( ) override; + virtual OUString SAL_CALL getIdentifierQuoteString( ) override; + virtual OUString SAL_CALL getSQLKeywords( ) override; + virtual OUString SAL_CALL getNumericFunctions( ) override; + virtual OUString SAL_CALL getStringFunctions( ) override; + virtual OUString SAL_CALL getSystemFunctions( ) override; + virtual OUString SAL_CALL getTimeDateFunctions( ) override; + virtual OUString SAL_CALL getSearchStringEscape( ) override; + virtual OUString SAL_CALL getExtraNameCharacters( ) override; + virtual sal_Bool SAL_CALL supportsAlterTableWithAddColumn( ) override; + virtual sal_Bool SAL_CALL supportsAlterTableWithDropColumn( ) override; + virtual sal_Bool SAL_CALL supportsColumnAliasing( ) override; + virtual sal_Bool SAL_CALL nullPlusNonNullIsNull( ) override; + virtual sal_Bool SAL_CALL supportsTypeConversion( ) override; + virtual sal_Bool SAL_CALL supportsConvert( sal_Int32 fromType, sal_Int32 toType ) override; + virtual sal_Bool SAL_CALL supportsTableCorrelationNames( ) override; + virtual sal_Bool SAL_CALL supportsDifferentTableCorrelationNames( ) override; + virtual sal_Bool SAL_CALL supportsExpressionsInOrderBy( ) override; + virtual sal_Bool SAL_CALL supportsOrderByUnrelated( ) override; + virtual sal_Bool SAL_CALL supportsGroupBy( ) override; + virtual sal_Bool SAL_CALL supportsGroupByUnrelated( ) override; + virtual sal_Bool SAL_CALL supportsGroupByBeyondSelect( ) override; + virtual sal_Bool SAL_CALL supportsLikeEscapeClause( ) override; + virtual sal_Bool SAL_CALL supportsMultipleResultSets( ) override; + virtual sal_Bool SAL_CALL supportsMultipleTransactions( ) override; + virtual sal_Bool SAL_CALL supportsNonNullableColumns( ) override; + virtual sal_Bool SAL_CALL supportsMinimumSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsCoreSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsExtendedSQLGrammar( ) override; + virtual sal_Bool SAL_CALL supportsANSI92EntryLevelSQL( ) override; + virtual sal_Bool SAL_CALL supportsANSI92IntermediateSQL( ) override; + virtual sal_Bool SAL_CALL supportsANSI92FullSQL( ) override; + virtual sal_Bool SAL_CALL supportsIntegrityEnhancementFacility( ) override; + virtual sal_Bool SAL_CALL supportsOuterJoins( ) override; + virtual sal_Bool SAL_CALL supportsFullOuterJoins( ) override; + virtual sal_Bool SAL_CALL supportsLimitedOuterJoins( ) override; + virtual OUString SAL_CALL getSchemaTerm( ) override; + virtual OUString SAL_CALL getProcedureTerm( ) override; + virtual OUString SAL_CALL getCatalogTerm( ) override; + virtual sal_Bool SAL_CALL isCatalogAtStart( ) override; + virtual OUString SAL_CALL getCatalogSeparator( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInDataManipulation( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInProcedureCalls( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInTableDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInIndexDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsSchemasInPrivilegeDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInDataManipulation( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInProcedureCalls( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInTableDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInIndexDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsCatalogsInPrivilegeDefinitions( ) override; + virtual sal_Bool SAL_CALL supportsPositionedDelete( ) override; + virtual sal_Bool SAL_CALL supportsPositionedUpdate( ) override; + virtual sal_Bool SAL_CALL supportsSelectForUpdate( ) override; + virtual sal_Bool SAL_CALL supportsStoredProcedures( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInComparisons( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInExists( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInIns( ) override; + virtual sal_Bool SAL_CALL supportsSubqueriesInQuantifieds( ) override; + virtual sal_Bool SAL_CALL supportsCorrelatedSubqueries( ) override; + virtual sal_Bool SAL_CALL supportsUnion( ) override; + virtual sal_Bool SAL_CALL supportsUnionAll( ) override; + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossCommit( ) override; + virtual sal_Bool SAL_CALL supportsOpenCursorsAcrossRollback( ) override; + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossCommit( ) override; + virtual sal_Bool SAL_CALL supportsOpenStatementsAcrossRollback( ) override; + virtual sal_Int32 SAL_CALL getMaxBinaryLiteralLength( ) override; + virtual sal_Int32 SAL_CALL getMaxCharLiteralLength( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInGroupBy( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInIndex( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInOrderBy( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInSelect( ) override; + virtual sal_Int32 SAL_CALL getMaxColumnsInTable( ) override; + virtual sal_Int32 SAL_CALL getMaxConnections( ) override; + virtual sal_Int32 SAL_CALL getMaxCursorNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxIndexLength( ) override; + virtual sal_Int32 SAL_CALL getMaxSchemaNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxProcedureNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxCatalogNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxRowSize( ) override; + virtual sal_Bool SAL_CALL doesMaxRowSizeIncludeBlobs( ) override; + virtual sal_Int32 SAL_CALL getMaxStatementLength( ) override; + virtual sal_Int32 SAL_CALL getMaxStatements( ) override; + virtual sal_Int32 SAL_CALL getMaxTableNameLength( ) override; + virtual sal_Int32 SAL_CALL getMaxTablesInSelect( ) override; + virtual sal_Int32 SAL_CALL getMaxUserNameLength( ) override; + virtual sal_Int32 SAL_CALL getDefaultTransactionIsolation( ) override; + virtual sal_Bool SAL_CALL supportsTransactions( ) override; + virtual sal_Bool SAL_CALL supportsTransactionIsolationLevel( sal_Int32 level ) override; + virtual sal_Bool SAL_CALL supportsDataDefinitionAndDataManipulationTransactions( ) override; + virtual sal_Bool SAL_CALL supportsDataManipulationTransactionsOnly( ) override; + virtual sal_Bool SAL_CALL dataDefinitionCausesTransactionCommit( ) override; + virtual sal_Bool SAL_CALL dataDefinitionIgnoredInTransactions( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedures( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getProcedureColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& procedureNamePattern, const OUString& columnNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTables( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const css::uno::Sequence< OUString >& types ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getSchemas( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCatalogs( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTableTypes( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumns( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getColumnPrivileges( const css::uno::Any& catalog, const OUString& schema, const OUString& table, const OUString& columnNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTablePrivileges( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getBestRowIdentifier( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Int32 scope, sal_Bool nullable ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getVersionColumns( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getPrimaryKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getImportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getExportedKeys( const css::uno::Any& catalog, const OUString& schema, const OUString& table ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getCrossReference( const css::uno::Any& primaryCatalog, const OUString& primarySchema, const OUString& primaryTable, const css::uno::Any& foreignCatalog, const OUString& foreignSchema, const OUString& foreignTable ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getTypeInfo( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getIndexInfo( const css::uno::Any& catalog, const OUString& schema, const OUString& table, sal_Bool unique, sal_Bool approximate ) override; + virtual sal_Bool SAL_CALL supportsResultSetType( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) override; + virtual sal_Bool SAL_CALL ownUpdatesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL ownDeletesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL ownInsertsAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersUpdatesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersDeletesAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL othersInsertsAreVisible( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL updatesAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL deletesAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL insertsAreDetected( sal_Int32 setType ) override; + virtual sal_Bool SAL_CALL supportsBatchUpdates( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL getUDTs( const css::uno::Any& catalog, const OUString& schemaPattern, const OUString& typeNamePattern, const css::uno::Sequence< sal_Int32 >& types ) override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabDriver.cxx b/connectivity/source/drivers/macab/MacabDriver.cxx index 4667c690a8b1..04caae0609a9 100644 --- a/connectivity/source/drivers/macab/MacabDriver.cxx +++ b/connectivity/source/drivers/macab/MacabDriver.cxx @@ -25,7 +25,7 @@ #include <com/sun/star/lang/NullPointerException.hpp> #include <com/sun/star/frame/Desktop.hpp> #include <sal/log.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <strings.hrc> #include <cppuhelper/supportsservice.hxx> @@ -115,7 +115,7 @@ bool MacabImplModule::impl_loadModule() OSL_ENSURE( !m_hConnectorModule && !m_pConnectionFactoryFunc, "MacabImplModule::impl_loadModule: inconsistence: inconsistency (never attempted load before, but some values already set)!"); - const OUString sModuleName( SAL_MODULENAME( "macabdrv1" ) ); + static constexpr OUString sModuleName( u"" SAL_MODULENAME( "macabdrv1" ) ""_ustr ); m_hConnectorModule = osl_loadModuleRelative( &thisModule, sModuleName.pData, SAL_LOADMODULE_NOW ); // LAZY! #i61335# OSL_ENSURE( m_hConnectorModule, "MacabImplModule::impl_loadModule: could not load the implementation library!" ); if ( !m_hConnectorModule ) diff --git a/connectivity/source/drivers/macab/MacabDriver.hxx b/connectivity/source/drivers/macab/MacabDriver.hxx index f75391dedb46..f12db3514acd 100644 --- a/connectivity/source/drivers/macab/MacabDriver.hxx +++ b/connectivity/source/drivers/macab/MacabDriver.hxx @@ -21,7 +21,6 @@ #include <com/sun/star/sdbc/XDriver.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/frame/XTerminateListener.hpp> #include <com/sun/star/uno/XComponentContext.hpp> #include <cppuhelper/compbase.hxx> @@ -34,128 +33,128 @@ namespace connectivity::macab { - class MacabConnection; - class MacabDriver; + class MacabConnection; + class MacabDriver; - typedef void* (SAL_CALL * ConnectionFactoryFunction)( void* _pDriver ); - - typedef std::vector< css::uno::WeakReferenceHelper > OWeakRefArray; + typedef void* (SAL_CALL * ConnectionFactoryFunction)( void* _pDriver ); + + typedef std::vector< css::uno::WeakReferenceHelper > OWeakRefArray; - // = MacabImplModule - - class MacabImplModule - { - private: - /// Did we already attempt to load the module and to retrieve the symbols? - bool m_bAttemptedLoadModule; - oslModule m_hConnectorModule; - ConnectionFactoryFunction m_pConnectionFactoryFunc; + // = MacabImplModule + + class MacabImplModule + { + private: + /// Did we already attempt to load the module and to retrieve the symbols? + bool m_bAttemptedLoadModule; + oslModule m_hConnectorModule; + ConnectionFactoryFunction m_pConnectionFactoryFunc; - public: - MacabImplModule(); + public: + MacabImplModule(); - /** determines whether there is a mac OS present in the environment - */ - bool isMacOSPresent(); + /** determines whether there is a mac OS present in the environment + */ + bool isMacOSPresent(); - /** initializes the implementation module. + /** initializes the implementation module. - @throws css::uno::RuntimeException - if the module could be loaded, but required symbols are missing - @throws css::sdbc::SQLException - if no Mac OS was found at all - */ - void init(); + @throws css::uno::RuntimeException + if the module could be loaded, but required symbols are missing + @throws css::sdbc::SQLException + if no Mac OS was found at all + */ + void init(); - /** shuts down the impl module - */ - void shutdown(); + /** shuts down the impl module + */ + void shutdown(); - /** creates a new connection - @precond - <member>init</member> has been called before - @throws css::uno::RuntimeException - if no connection object could be created (which is a severe error, normally impossible) - */ - MacabConnection* createConnection( MacabDriver* _pDriver ) const; + /** creates a new connection + @precond + <member>init</member> has been called before + @throws css::uno::RuntimeException + if no connection object could be created (which is a severe error, normally impossible) + */ + MacabConnection* createConnection( MacabDriver* _pDriver ) const; - private: - /** loads the implementation module and retrieves the needed symbols + private: + /** loads the implementation module and retrieves the needed symbols - Save against being called multiple times. + Save against being called multiple times. - @return <TRUE/> if the module could be loaded successfully. + @return <TRUE/> if the module could be loaded successfully. - @throws css::uno::RuntimeException - if the module could be loaded, but required symbols are missing - */ - bool impl_loadModule(); + @throws css::uno::RuntimeException + if the module could be loaded, but required symbols are missing + */ + bool impl_loadModule(); - /** unloads the implementation module, and resets all function pointers to <NULL/> - @precond m_hConnectorModule is not <NULL/> - */ - void impl_unloadModule(); - }; + /** unloads the implementation module, and resets all function pointers to <NULL/> + @precond m_hConnectorModule is not <NULL/> + */ + void impl_unloadModule(); + }; - // = MacabDriver + // = MacabDriver - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XDriver, - css::lang::XServiceInfo, - css::frame::XTerminateListener > MacabDriver_BASE; - class MacabDriver : public MacabDriver_BASE - { - protected: - ::osl::Mutex m_aMutex; // mutex is need to control member access - OWeakRefArray m_xConnections; // vector containing a list of all the - // MacabConnection objects for this Driver - css::uno::Reference< css::uno::XComponentContext > - m_xContext; // the multi-service factory - MacabImplModule m_aImplModule; + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XDriver, + css::lang::XServiceInfo, + css::frame::XTerminateListener > MacabDriver_BASE; + class MacabDriver : public MacabDriver_BASE + { + protected: + ::osl::Mutex m_aMutex; // mutex is need to control member access + OWeakRefArray m_xConnections; // vector containing a list of all the + // MacabConnection objects for this Driver + css::uno::Reference< css::uno::XComponentContext > + m_xContext; // the multi-service factory + MacabImplModule m_aImplModule; - public: - css::uno::Reference< css::uno::XComponentContext > const & - getComponentContext() const { return m_xContext; } + public: + css::uno::Reference< css::uno::XComponentContext > const & + getComponentContext() const { return m_xContext; } - /** returns the path of our configuration settings - */ - static OUString impl_getConfigurationSettingsPath(); + /** returns the path of our configuration settings + */ + static OUString impl_getConfigurationSettingsPath(); - explicit MacabDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext); - protected: + explicit MacabDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext); + protected: - // OComponentHelper - virtual void SAL_CALL disposing() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; - // XServiceInfo - virtual OUString SAL_CALL getImplementationName( ) override; - virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; - virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; - // XDriver - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL connect( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; - virtual sal_Bool SAL_CALL acceptsURL( const OUString& url ) override; - virtual css::uno::Sequence< css::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; - virtual sal_Int32 SAL_CALL getMajorVersion() override; - virtual sal_Int32 SAL_CALL getMinorVersion() override; - - // XTerminateListener - virtual void SAL_CALL queryTermination( const css::lang::EventObject& Event ) override; - virtual void SAL_CALL notifyTermination( const css::lang::EventObject& Event ) override; - - // XEventListener - virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; - - private: - /** shuts down the library which contains the real implementations - - This method is safe against being called multiple times - - @precond our mutex is locked - */ - void impl_shutdownImplementationModule(); - }; + // XDriver + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL connect( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; + virtual sal_Bool SAL_CALL acceptsURL( const OUString& url ) override; + virtual css::uno::Sequence< css::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const OUString& url, const css::uno::Sequence< css::beans::PropertyValue >& info ) override; + virtual sal_Int32 SAL_CALL getMajorVersion() override; + virtual sal_Int32 SAL_CALL getMinorVersion() override; + + // XTerminateListener + virtual void SAL_CALL queryTermination( const css::lang::EventObject& Event ) override; + virtual void SAL_CALL notifyTermination( const css::lang::EventObject& Event ) override; + + // XEventListener + virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) override; + + private: + /** shuts down the library which contains the real implementations + + This method is safe against being called multiple times + + @precond our mutex is locked + */ + void impl_shutdownImplementationModule(); + }; } diff --git a/connectivity/source/drivers/macab/MacabGroup.hxx b/connectivity/source/drivers/macab/MacabGroup.hxx index ddcd47b46423..a6379dda2a57 100644 --- a/connectivity/source/drivers/macab/MacabGroup.hxx +++ b/connectivity/source/drivers/macab/MacabGroup.hxx @@ -29,10 +29,10 @@ namespace connectivity::macab { - class MacabGroup: public MacabRecords { - public: - MacabGroup(const ABAddressBookRef _addressBook, const MacabRecords *_allRecords, const ABGroupRef _xGroup); - }; + class MacabGroup: public MacabRecords { + public: + MacabGroup(const ABAddressBookRef _addressBook, const MacabRecords *_allRecords, const ABGroupRef _xGroup); + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabHeader.cxx b/connectivity/source/drivers/macab/MacabHeader.cxx index 46f0c177d3fc..da270dd05ac8 100644 --- a/connectivity/source/drivers/macab/MacabHeader.cxx +++ b/connectivity/source/drivers/macab/MacabHeader.cxx @@ -290,10 +290,6 @@ MacabHeader::iterator::iterator () } -MacabHeader::iterator::~iterator () -{ -} - MacabHeader::iterator& MacabHeader::iterator::operator= (MacabHeader *_record) { id = 0; diff --git a/connectivity/source/drivers/macab/MacabHeader.hxx b/connectivity/source/drivers/macab/MacabHeader.hxx index a230d237ab72..2c110990e985 100644 --- a/connectivity/source/drivers/macab/MacabHeader.hxx +++ b/connectivity/source/drivers/macab/MacabHeader.hxx @@ -27,36 +27,35 @@ namespace connectivity::macab { - class MacabHeader: public MacabRecord{ - protected: - macabfield **sortRecord(sal_Int32 _start, sal_Int32 _length); - public: - MacabHeader(); - MacabHeader(const sal_Int32 _size, macabfield **_fields); - virtual ~MacabHeader() override; - void operator+= (const MacabHeader *r); - OUString getString(const sal_Int32 i) const; - void sortRecord(); - sal_Int32 getColumnNumber(std::u16string_view s) const; - - static sal_Int32 compareFields(const macabfield *_field1, const macabfield *_field2); - - MacabHeader *begin(); - sal_Int32 end() const; - class iterator{ - protected: - sal_Int32 id; - MacabHeader *record; - public: - iterator& operator= (MacabHeader *_record); - iterator(); - ~iterator(); - void operator++ (); - bool operator!= (const sal_Int32 i) const; - bool operator== (const sal_Int32 i) const; - macabfield *operator* () const; - }; - }; + class MacabHeader: public MacabRecord{ + protected: + macabfield **sortRecord(sal_Int32 _start, sal_Int32 _length); + public: + MacabHeader(); + MacabHeader(const sal_Int32 _size, macabfield **_fields); + virtual ~MacabHeader() override; + void operator+= (const MacabHeader *r); + OUString getString(const sal_Int32 i) const; + void sortRecord(); + sal_Int32 getColumnNumber(std::u16string_view s) const; + + static sal_Int32 compareFields(const macabfield *_field1, const macabfield *_field2); + + MacabHeader *begin(); + sal_Int32 end() const; + class iterator{ + protected: + sal_Int32 id; + MacabHeader *record; + public: + iterator& operator= (MacabHeader *_record); + iterator(); + void operator++ (); + bool operator!= (const sal_Int32 i) const; + bool operator== (const sal_Int32 i) const; + macabfield *operator* () const; + }; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabPreparedStatement.hxx b/connectivity/source/drivers/macab/MacabPreparedStatement.hxx index 6e649bf647f3..1a759800b509 100644 --- a/connectivity/source/drivers/macab/MacabPreparedStatement.hxx +++ b/connectivity/source/drivers/macab/MacabPreparedStatement.hxx @@ -28,84 +28,84 @@ namespace connectivity::macab { - typedef ::cppu::ImplInheritanceHelper< MacabCommonStatement, - css::sdbc::XPreparedStatement, - css::sdbc::XParameters, - css::sdbc::XResultSetMetaDataSupplier, - css::lang::XServiceInfo> MacabPreparedStatement_BASE; + typedef ::cppu::ImplInheritanceHelper< MacabCommonStatement, + css::sdbc::XPreparedStatement, + css::sdbc::XParameters, + css::sdbc::XResultSetMetaDataSupplier, + css::lang::XServiceInfo> MacabPreparedStatement_BASE; - class MacabPreparedStatement : public MacabPreparedStatement_BASE - { - protected: - OUString m_sSqlStatement; - ::rtl::Reference< MacabResultSetMetaData > - m_xMetaData; - bool m_bPrepared; - mutable sal_Int32 m_nParameterIndex; - OValueRow m_aParameterRow; + class MacabPreparedStatement : public MacabPreparedStatement_BASE + { + protected: + OUString m_sSqlStatement; + ::rtl::Reference< MacabResultSetMetaData > + m_xMetaData; + bool m_bPrepared; + mutable sal_Int32 m_nParameterIndex; + OValueRow m_aParameterRow; - /// @throws css::sdbc::SQLException - void checkAndResizeParameters(sal_Int32 nParams); - /// @throws css::sdbc::SQLException - void setMacabFields() const; + /// @throws css::sdbc::SQLException + void checkAndResizeParameters(sal_Int32 nParams); + /// @throws css::sdbc::SQLException + void setMacabFields() const; - protected: - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const css::uno::Any& rValue) override; + protected: + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; - virtual void resetParameters() const override; - virtual void getNextParameter(OUString &rParameter) const override; - virtual ~MacabPreparedStatement() override; + virtual void resetParameters() const override; + virtual void getNextParameter(OUString &rParameter) const override; + virtual ~MacabPreparedStatement() override; - public: - DECLARE_SERVICE_INFO(); - MacabPreparedStatement(MacabConnection* _pConnection, const OUString& sql); + public: + DECLARE_SERVICE_INFO(); + MacabPreparedStatement(MacabConnection* _pConnection, const OUString& sql); - // OComponentHelper - virtual void SAL_CALL disposing() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; - // XPreparedStatement - using MacabCommonStatement::executeQuery; - using MacabCommonStatement::executeUpdate; - using MacabCommonStatement::execute; + // XPreparedStatement + using MacabCommonStatement::executeQuery; + using MacabCommonStatement::executeUpdate; + using MacabCommonStatement::execute; - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( ) override; - virtual sal_Int32 SAL_CALL executeUpdate( ) override; - virtual sal_Bool SAL_CALL execute( ) override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( ) override; + virtual sal_Int32 SAL_CALL executeUpdate( ) override; + virtual sal_Bool SAL_CALL execute( ) override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( ) override; - // XParameters - virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) override; - virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const OUString& typeName ) override; - virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) override; - virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) override; - virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) override; - virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) override; - virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) override; - virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) override; - virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) override; - virtual void SAL_CALL setString( sal_Int32 parameterIndex, const OUString& x ) override; - virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const css::uno::Sequence< sal_Int8 >& x ) override; - virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const css::util::Date& x ) override; - virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const css::util::Time& x ) override; - virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const css::util::DateTime& x ) override; - virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const css::uno::Any& x ) override; - virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const css::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) override; - virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XRef >& x ) override; - virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XBlob >& x ) override; - virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XClob >& x ) override; - virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XArray >& x ) override; - virtual void SAL_CALL clearParameters( ) override; + // XParameters + virtual void SAL_CALL setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) override; + virtual void SAL_CALL setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const OUString& typeName ) override; + virtual void SAL_CALL setBoolean( sal_Int32 parameterIndex, sal_Bool x ) override; + virtual void SAL_CALL setByte( sal_Int32 parameterIndex, sal_Int8 x ) override; + virtual void SAL_CALL setShort( sal_Int32 parameterIndex, sal_Int16 x ) override; + virtual void SAL_CALL setInt( sal_Int32 parameterIndex, sal_Int32 x ) override; + virtual void SAL_CALL setLong( sal_Int32 parameterIndex, sal_Int64 x ) override; + virtual void SAL_CALL setFloat( sal_Int32 parameterIndex, float x ) override; + virtual void SAL_CALL setDouble( sal_Int32 parameterIndex, double x ) override; + virtual void SAL_CALL setString( sal_Int32 parameterIndex, const OUString& x ) override; + virtual void SAL_CALL setBytes( sal_Int32 parameterIndex, const css::uno::Sequence< sal_Int8 >& x ) override; + virtual void SAL_CALL setDate( sal_Int32 parameterIndex, const css::util::Date& x ) override; + virtual void SAL_CALL setTime( sal_Int32 parameterIndex, const css::util::Time& x ) override; + virtual void SAL_CALL setTimestamp( sal_Int32 parameterIndex, const css::util::DateTime& x ) override; + virtual void SAL_CALL setBinaryStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL setCharacterStream( sal_Int32 parameterIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL setObject( sal_Int32 parameterIndex, const css::uno::Any& x ) override; + virtual void SAL_CALL setObjectWithInfo( sal_Int32 parameterIndex, const css::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) override; + virtual void SAL_CALL setRef( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XRef >& x ) override; + virtual void SAL_CALL setBlob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XBlob >& x ) override; + virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XClob >& x ) override; + virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const css::uno::Reference< css::sdbc::XArray >& x ) override; + virtual void SAL_CALL clearParameters( ) override; - // XCloseable - virtual void SAL_CALL close( ) override; + // XCloseable + virtual void SAL_CALL close( ) override; - // XResultSetMetaDataSupplier - virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; - }; + // XResultSetMetaDataSupplier + virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabRecord.hxx b/connectivity/source/drivers/macab/MacabRecord.hxx index 5184eefc8ab4..93d41ee92c35 100644 --- a/connectivity/source/drivers/macab/MacabRecord.hxx +++ b/connectivity/source/drivers/macab/MacabRecord.hxx @@ -34,38 +34,38 @@ namespace connectivity::macab { - /* a MacabRecord is at root a list of macabfields (which is just - * something to hold both a CFTypeRef (a CoreFoundation object) and - * its Address Book type. - */ - struct macabfield - { - CFTypeRef value; - ABPropertyType type; - }; + /* a MacabRecord is at root a list of macabfields (which is just + * something to hold both a CFTypeRef (a CoreFoundation object) and + * its Address Book type. + */ + struct macabfield + { + CFTypeRef value; + ABPropertyType type; + }; - class MacabRecord{ - protected: - sal_Int32 size; - std::unique_ptr<macabfield *[]> fields; - protected: - void releaseFields(); - public: - MacabRecord(); - explicit MacabRecord(const sal_Int32 _size); - virtual ~MacabRecord(); - void insertAtColumn (CFTypeRef _value, ABPropertyType _type, const sal_Int32 _column); - bool contains(const macabfield *_field) const; - bool contains(const CFTypeRef _value) const; - sal_Int32 getSize() const; - macabfield *copy(const sal_Int32 i) const; - macabfield *get(const sal_Int32 i) const; + class MacabRecord{ + protected: + sal_Int32 size; + std::unique_ptr<macabfield *[]> fields; + protected: + void releaseFields(); + public: + MacabRecord(); + explicit MacabRecord(const sal_Int32 _size); + virtual ~MacabRecord(); + void insertAtColumn (CFTypeRef _value, ABPropertyType _type, const sal_Int32 _column); + bool contains(const macabfield *_field) const; + bool contains(const CFTypeRef _value) const; + sal_Int32 getSize() const; + macabfield *copy(const sal_Int32 i) const; + macabfield *get(const sal_Int32 i) const; - static sal_Int32 compareFields(const macabfield *_field1, const macabfield *_field2); - static macabfield *createMacabField(const OUString& _newFieldString, const ABPropertyType _abtype); - static OUString fieldToString(const macabfield *_aField); + static sal_Int32 compareFields(const macabfield *_field1, const macabfield *_field2); + static macabfield *createMacabField(const OUString& _newFieldString, const ABPropertyType _abtype); + static OUString fieldToString(const macabfield *_aField); - }; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabRecords.cxx b/connectivity/source/drivers/macab/MacabRecords.cxx index 4c2d4aed8fa1..07d462425e65 100644 --- a/connectivity/source/drivers/macab/MacabRecords.cxx +++ b/connectivity/source/drivers/macab/MacabRecords.cxx @@ -344,7 +344,7 @@ MacabHeader *MacabRecords::createHeaderForRecordType(const CFArrayRef _records, /* While searching through the properties for required properties, these * sal_Bools will keep track of what we have found. */ - bool bFoundRequiredProperties[requiredProperties.size()]; + auto const bFoundRequiredProperties = std::make_unique<bool[]>(requiredProperties.size()); /* We have three MacabHeaders: headerDataForProperty is where we @@ -1099,11 +1099,6 @@ MacabRecords::iterator::iterator () } -MacabRecords::iterator::~iterator () -{ -} - - MacabRecords::iterator& MacabRecords::iterator::operator= (MacabRecords *_records) { id = 0; diff --git a/connectivity/source/drivers/macab/MacabRecords.hxx b/connectivity/source/drivers/macab/MacabRecords.hxx index 004d10b1b6d2..f38705a12e86 100644 --- a/connectivity/source/drivers/macab/MacabRecords.hxx +++ b/connectivity/source/drivers/macab/MacabRecords.hxx @@ -35,92 +35,91 @@ namespace connectivity::macab { - /* This struct is for converting CF types to AB types (Core Foundation - * types to Address Book types). - */ - struct lcl_CFType { - CFTypeID cf; - sal_Int32 ab; - }; - - class MacabRecords{ - protected: - /* MacabRecords is, at its core, a table of macabfields, in the - * form of a header and a list of objects of type MacabRecord. - * It also has a unique name that refers to the name of the table. - */ - sal_Int32 recordsSize; - sal_Int32 currentRecord; - CFStringRef recordType; - MacabHeader *header; - MacabRecord **records; - ABAddressBookRef addressBook; - OUString m_sName; - - /* For converting CF types to AB types */ - std::vector<lcl_CFType> lcl_CFTypes; - - /* For required properties */ - std::vector<CFStringRef> requiredProperties; - - private: - /* All of the private methods are for creating a MacabHeader or a - * MacabRecord. They are used by the initialize method that goes - * about filling a MacabRecords using all of the records in the - * macOS Address Book. - */ - void bootstrap_CF_types(); - void bootstrap_requiredProperties(); - MacabHeader *createHeaderForProperty(const ABRecordRef _record, const CFStringRef _propertyName, const CFStringRef _recordType, const bool _isPropertyRequired) const; - MacabHeader *createHeaderForProperty(const ABPropertyType _propertyType, const CFTypeRef _propertyValue, const CFStringRef _propertyName) const; - ABPropertyType getABTypeFromCFType(const CFTypeID cf_type ) const; - void insertPropertyIntoMacabRecord(MacabRecord *_abrecord, const MacabHeader *_header, const OUString& _propertyName, const CFTypeRef _propertyValue) const; - void insertPropertyIntoMacabRecord(const ABPropertyType _propertyType, MacabRecord *_abrecord, const MacabHeader *_header, const OUString& _propertyName, const CFTypeRef _propertyValue) const; - public: - MacabRecords(const ABAddressBookRef _addressBook, MacabHeader *_header, MacabRecord **_records, sal_Int32 _numRecords); - explicit MacabRecords(const MacabRecords *_copy); - explicit MacabRecords(const ABAddressBookRef _addressBook); - ~MacabRecords(); - - void initialize(); - - void setHeader(MacabHeader *_header); - MacabHeader *getHeader() const; - - void setName(const OUString& _sName); - OUString const & getName() const; - - MacabRecord *insertRecord(MacabRecord *_newRecord, const sal_Int32 _location); - void insertRecord(MacabRecord *_newRecord); - MacabRecord *getRecord(const sal_Int32 _location) const; - void swap(const sal_Int32 _id1, const sal_Int32 _id2); - - macabfield *getField(const sal_Int32 _recordNumber, const sal_Int32 _columnNumber) const; - macabfield *getField(const sal_Int32 _recordNumber, std::u16string_view _columnName) const; - sal_Int32 getFieldNumber(std::u16string_view _columnName) const; - - sal_Int32 size() const; - - MacabHeader *createHeaderForRecordType(const CFArrayRef _records, const CFStringRef _recordType) const; - MacabRecord *createMacabRecord(const ABRecordRef _abrecord, const MacabHeader *_header, const CFStringRef _recordType) const; - - MacabRecords *begin(); - sal_Int32 end() const; - class iterator{ - protected: - MacabRecords *records; - public: - sal_Int32 id; - iterator& operator= (MacabRecords *_records); - iterator(); - ~iterator(); - void operator++ (); - bool operator!= (const sal_Int32 i) const; - bool operator== (const sal_Int32 i) const; - MacabRecord *operator* () const; - }; - - }; + /* This struct is for converting CF types to AB types (Core Foundation + * types to Address Book types). + */ + struct lcl_CFType { + CFTypeID cf; + sal_Int32 ab; + }; + + class MacabRecords{ + protected: + /* MacabRecords is, at its core, a table of macabfields, in the + * form of a header and a list of objects of type MacabRecord. + * It also has a unique name that refers to the name of the table. + */ + sal_Int32 recordsSize; + sal_Int32 currentRecord; + CFStringRef recordType; + MacabHeader *header; + MacabRecord **records; + ABAddressBookRef addressBook; + OUString m_sName; + + /* For converting CF types to AB types */ + std::vector<lcl_CFType> lcl_CFTypes; + + /* For required properties */ + std::vector<CFStringRef> requiredProperties; + + private: + /* All of the private methods are for creating a MacabHeader or a + * MacabRecord. They are used by the initialize method that goes + * about filling a MacabRecords using all of the records in the + * macOS Address Book. + */ + void bootstrap_CF_types(); + void bootstrap_requiredProperties(); + MacabHeader *createHeaderForProperty(const ABRecordRef _record, const CFStringRef _propertyName, const CFStringRef _recordType, const bool _isPropertyRequired) const; + MacabHeader *createHeaderForProperty(const ABPropertyType _propertyType, const CFTypeRef _propertyValue, const CFStringRef _propertyName) const; + ABPropertyType getABTypeFromCFType(const CFTypeID cf_type ) const; + void insertPropertyIntoMacabRecord(MacabRecord *_abrecord, const MacabHeader *_header, const OUString& _propertyName, const CFTypeRef _propertyValue) const; + void insertPropertyIntoMacabRecord(const ABPropertyType _propertyType, MacabRecord *_abrecord, const MacabHeader *_header, const OUString& _propertyName, const CFTypeRef _propertyValue) const; + public: + MacabRecords(const ABAddressBookRef _addressBook, MacabHeader *_header, MacabRecord **_records, sal_Int32 _numRecords); + explicit MacabRecords(const MacabRecords *_copy); + explicit MacabRecords(const ABAddressBookRef _addressBook); + ~MacabRecords(); + + void initialize(); + + void setHeader(MacabHeader *_header); + MacabHeader *getHeader() const; + + void setName(const OUString& _sName); + OUString const & getName() const; + + MacabRecord *insertRecord(MacabRecord *_newRecord, const sal_Int32 _location); + void insertRecord(MacabRecord *_newRecord); + MacabRecord *getRecord(const sal_Int32 _location) const; + void swap(const sal_Int32 _id1, const sal_Int32 _id2); + + macabfield *getField(const sal_Int32 _recordNumber, const sal_Int32 _columnNumber) const; + macabfield *getField(const sal_Int32 _recordNumber, std::u16string_view _columnName) const; + sal_Int32 getFieldNumber(std::u16string_view _columnName) const; + + sal_Int32 size() const; + + MacabHeader *createHeaderForRecordType(const CFArrayRef _records, const CFStringRef _recordType) const; + MacabRecord *createMacabRecord(const ABRecordRef _abrecord, const MacabHeader *_header, const CFStringRef _recordType) const; + + MacabRecords *begin(); + sal_Int32 end() const; + class iterator{ + protected: + MacabRecords *records; + public: + sal_Int32 id; + iterator& operator= (MacabRecords *_records); + iterator(); + void operator++ (); + bool operator!= (const sal_Int32 i) const; + bool operator== (const sal_Int32 i) const; + MacabRecord *operator* () const; + }; + + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabResultSet.cxx b/connectivity/source/drivers/macab/MacabResultSet.cxx index ecb4ea79e417..e8784ba3a8a8 100644 --- a/connectivity/source/drivers/macab/MacabResultSet.cxx +++ b/connectivity/source/drivers/macab/MacabResultSet.cxx @@ -394,8 +394,7 @@ Date SAL_CALL MacabResultSet::getDate(sal_Int32) ::dbtools::throwFunctionNotSupportedSQLException("getDate", nullptr); - Date aRet; - return aRet; + return Date(); } Time SAL_CALL MacabResultSet::getTime(sal_Int32) @@ -405,8 +404,7 @@ Time SAL_CALL MacabResultSet::getTime(sal_Int32) ::dbtools::throwFunctionNotSupportedSQLException("getTime", nullptr); - css::util::Time nRet; - return nRet; + return css::util::Time(); } DateTime SAL_CALL MacabResultSet::getTimestamp(sal_Int32 columnIndex) @@ -885,7 +883,7 @@ Any SAL_CALL MacabResultSet::getBookmark() { if(uidField->type == kABStringProperty) { - return makeAny(CFStringToOUString( static_cast<CFStringRef>(uidField->value) )); + return Any(CFStringToOUString( static_cast<CFStringRef>(uidField->value) )); } } } @@ -981,28 +979,47 @@ Sequence< sal_Int32 > SAL_CALL MacabResultSet::deleteRows(const Sequence< Any IPropertyArrayHelper* MacabResultSet::createArrayHelper() const { - Sequence< Property > aProps(6); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), - PROPERTY_ID_ISBOOKMARKABLE, cppu::UnoType<bool>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - return new OPropertyArrayHelper(aProps); + return new OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), + PROPERTY_ID_ISBOOKMARKABLE, + cppu::UnoType<bool>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY + } + } + }; } IPropertyArrayHelper & MacabResultSet::getInfoHelper() diff --git a/connectivity/source/drivers/macab/MacabResultSet.hxx b/connectivity/source/drivers/macab/MacabResultSet.hxx index 306ef562d3b4..c3c949afc414 100644 --- a/connectivity/source/drivers/macab/MacabResultSet.hxx +++ b/connectivity/source/drivers/macab/MacabResultSet.hxx @@ -33,181 +33,181 @@ namespace connectivity::macab { - /* - ** MacabResultSet - */ - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XResultSet, - css::sdbc::XRow, - css::sdbc::XResultSetMetaDataSupplier, - css::util::XCancellable, - css::sdbc::XWarningsSupplier, - css::sdbc::XResultSetUpdate, - css::sdbc::XRowUpdate, - css::sdbcx::XRowLocate, - css::sdbcx::XDeleteRows, - css::sdbc::XCloseable, - css::sdbc::XColumnLocate, - css::lang::XServiceInfo> MacabResultSet_BASE; - class MacabRecords; - - class MacabResultSet : public cppu::BaseMutex, - public MacabResultSet_BASE, - public ::cppu::OPropertySetHelper, - public comphelper::OPropertyArrayUsageHelper<MacabResultSet> + /* + ** MacabResultSet + */ + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XResultSet, + css::sdbc::XRow, + css::sdbc::XResultSetMetaDataSupplier, + css::util::XCancellable, + css::sdbc::XWarningsSupplier, + css::sdbc::XResultSetUpdate, + css::sdbc::XRowUpdate, + css::sdbcx::XRowLocate, + css::sdbcx::XDeleteRows, + css::sdbc::XCloseable, + css::sdbc::XColumnLocate, + css::lang::XServiceInfo> MacabResultSet_BASE; + class MacabRecords; + + class MacabResultSet : public cppu::BaseMutex, + public MacabResultSet_BASE, + public ::cppu::OPropertySetHelper, + public comphelper::OPropertyArrayUsageHelper<MacabResultSet> + { + protected: + ::rtl::Reference< MacabCommonStatement > m_xStatement; // the statement that has created this result set + ::rtl::Reference< MacabResultSetMetaData > m_xMetaData; // the description of the columns in this result set + MacabRecords * m_aMacabRecords; // address book entries matching the query + sal_Int32 m_nRowPos; // the current row within the result set + bool m_bWasNull; // last entry retrieved from this result set was NULL + OUString m_sTableName; + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const override; + + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + + virtual sal_Bool SAL_CALL convertFastPropertyValue( + css::uno::Any & rConvertedValue, + css::uno::Any & rOldValue, + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + virtual void SAL_CALL getFastPropertyValue( + css::uno::Any& rValue, + sal_Int32 nHandle) const override; + + // you can't delete objects of this type + virtual ~MacabResultSet() override; + + public: + DECLARE_SERVICE_INFO(); + + explicit MacabResultSet(MacabCommonStatement *pStmt); + + css::uno::Reference< css::uno::XInterface > operator *() { - protected: - ::rtl::Reference< MacabCommonStatement > m_xStatement; // the statement that has created this result set - ::rtl::Reference< MacabResultSetMetaData > m_xMetaData; // the description of the columns in this result set - MacabRecords * m_aMacabRecords; // address book entries matching the query - sal_Int32 m_nRowPos; // the current row within the result set - bool m_bWasNull; // last entry retrieved from this result set was NULL - OUString m_sTableName; - - // OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const override; - - // OPropertySetHelper - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; - - virtual sal_Bool SAL_CALL convertFastPropertyValue( - css::uno::Any & rConvertedValue, - css::uno::Any & rOldValue, - sal_Int32 nHandle, - const css::uno::Any& rValue) override; - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const css::uno::Any& rValue) override; - virtual void SAL_CALL getFastPropertyValue( - css::uno::Any& rValue, - sal_Int32 nHandle) const override; - - // you can't delete objects of this type - virtual ~MacabResultSet() override; - - public: - DECLARE_SERVICE_INFO(); - - explicit MacabResultSet(MacabCommonStatement *pStmt); - - css::uno::Reference< css::uno::XInterface > operator *() - { - return css::uno::Reference< css::uno::XInterface >(*static_cast<MacabResultSet_BASE*>(this)); - } - - void allMacabRecords(); - void someMacabRecords(const class MacabCondition *pCondition); - void sortMacabRecords(const class MacabOrder *pOrder); - void setTableName(const OUString& _sTableName); - - // ::cppu::OComponentHelper - virtual void SAL_CALL disposing() override; - - // XInterface - virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; - virtual void SAL_CALL acquire() noexcept override; - virtual void SAL_CALL release() noexcept override; - - // XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; - - // XPropertySet - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; - - // XResultSet - virtual sal_Bool SAL_CALL isBeforeFirst( ) override; - virtual sal_Bool SAL_CALL isAfterLast( ) override; - virtual sal_Bool SAL_CALL isFirst( ) override; - virtual sal_Bool SAL_CALL isLast( ) override; - virtual void SAL_CALL beforeFirst( ) override; - virtual void SAL_CALL afterLast( ) override; - virtual sal_Bool SAL_CALL first( ) override; - virtual sal_Bool SAL_CALL last( ) override; - virtual sal_Int32 SAL_CALL getRow( ) override; - virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) override; - virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) override; - virtual sal_Bool SAL_CALL next( ) override; - virtual sal_Bool SAL_CALL previous( ) override; - virtual void SAL_CALL refreshRow( ) override; - virtual sal_Bool SAL_CALL rowUpdated( ) override; - virtual sal_Bool SAL_CALL rowInserted( ) override; - virtual sal_Bool SAL_CALL rowDeleted( ) override; - virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getStatement( ) override; - - // XRow - virtual sal_Bool SAL_CALL wasNull( ) override; - virtual OUString SAL_CALL getString( sal_Int32 columnIndex ) override; - virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) override; - virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) override; - virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) override; - virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) override; - virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) override; - virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) override; - virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) override; - virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) override; - virtual css::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) override; - virtual css::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) override; - virtual css::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) override; - virtual css::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; - virtual css::uno::Reference< css::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) override; - virtual css::uno::Reference< css::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) override; - - // XResultSetMetaDataSupplier - virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; - - // XCancellable - virtual void SAL_CALL cancel( ) override; - - // XCloseable - virtual void SAL_CALL close( ) override; - - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( ) override; - virtual void SAL_CALL clearWarnings( ) override; - - // XResultSetUpdate - virtual void SAL_CALL insertRow( ) override; - virtual void SAL_CALL updateRow( ) override; - virtual void SAL_CALL deleteRow( ) override; - virtual void SAL_CALL cancelRowUpdates( ) override; - virtual void SAL_CALL moveToInsertRow( ) override; - virtual void SAL_CALL moveToCurrentRow( ) override; - // XRowUpdate - virtual void SAL_CALL updateNull( sal_Int32 columnIndex ) override; - virtual void SAL_CALL updateBoolean( sal_Int32 columnIndex, sal_Bool x ) override; - virtual void SAL_CALL updateByte( sal_Int32 columnIndex, sal_Int8 x ) override; - virtual void SAL_CALL updateShort( sal_Int32 columnIndex, sal_Int16 x ) override; - virtual void SAL_CALL updateInt( sal_Int32 columnIndex, sal_Int32 x ) override; - virtual void SAL_CALL updateLong( sal_Int32 columnIndex, sal_Int64 x ) override; - virtual void SAL_CALL updateFloat( sal_Int32 columnIndex, float x ) override; - virtual void SAL_CALL updateDouble( sal_Int32 columnIndex, double x ) override; - virtual void SAL_CALL updateString( sal_Int32 columnIndex, const OUString& x ) override; - virtual void SAL_CALL updateBytes( sal_Int32 columnIndex, const css::uno::Sequence< sal_Int8 >& x ) override; - virtual void SAL_CALL updateDate( sal_Int32 columnIndex, const css::util::Date& x ) override; - virtual void SAL_CALL updateTime( sal_Int32 columnIndex, const css::util::Time& x ) override; - virtual void SAL_CALL updateTimestamp( sal_Int32 columnIndex, const css::util::DateTime& x ) override; - virtual void SAL_CALL updateBinaryStream( sal_Int32 columnIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL updateCharacterStream( sal_Int32 columnIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; - virtual void SAL_CALL updateObject( sal_Int32 columnIndex, const css::uno::Any& x ) override; - virtual void SAL_CALL updateNumericObject( sal_Int32 columnIndex, const css::uno::Any& x, sal_Int32 scale ) override; - - // XColumnLocate - virtual sal_Int32 SAL_CALL findColumn( const OUString& columnName ) override; - - // XRowLocate - virtual css::uno::Any SAL_CALL getBookmark( ) override; - virtual sal_Bool SAL_CALL moveToBookmark( const css::uno::Any& bookmark ) override; - virtual sal_Bool SAL_CALL moveRelativeToBookmark( const css::uno::Any& bookmark, sal_Int32 rows ) override; - virtual sal_Int32 SAL_CALL compareBookmarks( const css::uno::Any& firstItem, const css::uno::Any& secondItem ) override; - virtual sal_Bool SAL_CALL hasOrderedBookmarks( ) override; - virtual sal_Int32 SAL_CALL hashBookmark( const css::uno::Any& bookmark ) override; - - // XDeleteRows - virtual css::uno::Sequence< sal_Int32 > SAL_CALL deleteRows( const css::uno::Sequence< css::uno::Any >& rows ) override; - }; + return css::uno::Reference< css::uno::XInterface >(*static_cast<MacabResultSet_BASE*>(this)); + } + + void allMacabRecords(); + void someMacabRecords(const class MacabCondition *pCondition); + void sortMacabRecords(const class MacabOrder *pOrder); + void setTableName(const OUString& _sTableName); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing() override; + + // XInterface + virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type & rType ) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + // XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) override; + + // XResultSet + virtual sal_Bool SAL_CALL isBeforeFirst( ) override; + virtual sal_Bool SAL_CALL isAfterLast( ) override; + virtual sal_Bool SAL_CALL isFirst( ) override; + virtual sal_Bool SAL_CALL isLast( ) override; + virtual void SAL_CALL beforeFirst( ) override; + virtual void SAL_CALL afterLast( ) override; + virtual sal_Bool SAL_CALL first( ) override; + virtual sal_Bool SAL_CALL last( ) override; + virtual sal_Int32 SAL_CALL getRow( ) override; + virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) override; + virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) override; + virtual sal_Bool SAL_CALL next( ) override; + virtual sal_Bool SAL_CALL previous( ) override; + virtual void SAL_CALL refreshRow( ) override; + virtual sal_Bool SAL_CALL rowUpdated( ) override; + virtual sal_Bool SAL_CALL rowInserted( ) override; + virtual sal_Bool SAL_CALL rowDeleted( ) override; + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getStatement( ) override; + + // XRow + virtual sal_Bool SAL_CALL wasNull( ) override; + virtual OUString SAL_CALL getString( sal_Int32 columnIndex ) override; + virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) override; + virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) override; + virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) override; + virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) override; + virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) override; + virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) override; + virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) override; + virtual css::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) override; + virtual css::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) override; + virtual css::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) override; + virtual css::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const css::uno::Reference< css::container::XNameAccess >& typeMap ) override; + virtual css::uno::Reference< css::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) override; + virtual css::uno::Reference< css::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) override; + + // XResultSetMetaDataSupplier + virtual css::uno::Reference< css::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) override; + + // XCancellable + virtual void SAL_CALL cancel( ) override; + + // XCloseable + virtual void SAL_CALL close( ) override; + + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( ) override; + virtual void SAL_CALL clearWarnings( ) override; + + // XResultSetUpdate + virtual void SAL_CALL insertRow( ) override; + virtual void SAL_CALL updateRow( ) override; + virtual void SAL_CALL deleteRow( ) override; + virtual void SAL_CALL cancelRowUpdates( ) override; + virtual void SAL_CALL moveToInsertRow( ) override; + virtual void SAL_CALL moveToCurrentRow( ) override; + // XRowUpdate + virtual void SAL_CALL updateNull( sal_Int32 columnIndex ) override; + virtual void SAL_CALL updateBoolean( sal_Int32 columnIndex, sal_Bool x ) override; + virtual void SAL_CALL updateByte( sal_Int32 columnIndex, sal_Int8 x ) override; + virtual void SAL_CALL updateShort( sal_Int32 columnIndex, sal_Int16 x ) override; + virtual void SAL_CALL updateInt( sal_Int32 columnIndex, sal_Int32 x ) override; + virtual void SAL_CALL updateLong( sal_Int32 columnIndex, sal_Int64 x ) override; + virtual void SAL_CALL updateFloat( sal_Int32 columnIndex, float x ) override; + virtual void SAL_CALL updateDouble( sal_Int32 columnIndex, double x ) override; + virtual void SAL_CALL updateString( sal_Int32 columnIndex, const OUString& x ) override; + virtual void SAL_CALL updateBytes( sal_Int32 columnIndex, const css::uno::Sequence< sal_Int8 >& x ) override; + virtual void SAL_CALL updateDate( sal_Int32 columnIndex, const css::util::Date& x ) override; + virtual void SAL_CALL updateTime( sal_Int32 columnIndex, const css::util::Time& x ) override; + virtual void SAL_CALL updateTimestamp( sal_Int32 columnIndex, const css::util::DateTime& x ) override; + virtual void SAL_CALL updateBinaryStream( sal_Int32 columnIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL updateCharacterStream( sal_Int32 columnIndex, const css::uno::Reference< css::io::XInputStream >& x, sal_Int32 length ) override; + virtual void SAL_CALL updateObject( sal_Int32 columnIndex, const css::uno::Any& x ) override; + virtual void SAL_CALL updateNumericObject( sal_Int32 columnIndex, const css::uno::Any& x, sal_Int32 scale ) override; + + // XColumnLocate + virtual sal_Int32 SAL_CALL findColumn( const OUString& columnName ) override; + + // XRowLocate + virtual css::uno::Any SAL_CALL getBookmark( ) override; + virtual sal_Bool SAL_CALL moveToBookmark( const css::uno::Any& bookmark ) override; + virtual sal_Bool SAL_CALL moveRelativeToBookmark( const css::uno::Any& bookmark, sal_Int32 rows ) override; + virtual sal_Int32 SAL_CALL compareBookmarks( const css::uno::Any& firstItem, const css::uno::Any& secondItem ) override; + virtual sal_Bool SAL_CALL hasOrderedBookmarks( ) override; + virtual sal_Int32 SAL_CALL hashBookmark( const css::uno::Any& bookmark ) override; + + // XDeleteRows + virtual css::uno::Sequence< sal_Int32 > SAL_CALL deleteRows( const css::uno::Sequence< css::uno::Any >& rows ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabResultSetMetaData.cxx b/connectivity/source/drivers/macab/MacabResultSetMetaData.cxx index d0ed7298f92b..e08d92cfceb6 100644 --- a/connectivity/source/drivers/macab/MacabResultSetMetaData.cxx +++ b/connectivity/source/drivers/macab/MacabResultSetMetaData.cxx @@ -23,6 +23,7 @@ #include "MacabRecords.hxx" #include "MacabAddressBook.hxx" #include "macabutilities.hxx" +#include <connectivity/dbexception.hxx> #include <strings.hrc> using namespace connectivity::macab; diff --git a/connectivity/source/drivers/macab/MacabResultSetMetaData.hxx b/connectivity/source/drivers/macab/MacabResultSetMetaData.hxx index a7afdf4a094a..16dc1d34ea8d 100644 --- a/connectivity/source/drivers/macab/MacabResultSetMetaData.hxx +++ b/connectivity/source/drivers/macab/MacabResultSetMetaData.hxx @@ -23,59 +23,58 @@ #include <connectivity/CommonTools.hxx> #include <com/sun/star/sdbc/XResultSetMetaData.hpp> #include <cppuhelper/implbase.hxx> -#include <connectivity/dbexception.hxx> #include <rtl/ref.hxx> namespace connectivity::macab { - /* - ** MacabResultSetMetaData - */ - class MacabResultSetMetaData : public ::cppu::WeakImplHelper< css::sdbc::XResultSetMetaData> - { - MacabConnection* m_pConnection; - OUString m_sTableName; - std::vector<sal_Int32> m_aMacabFields; // for each selected column, contains the number - // of the corresponding AddressBook field + /* + ** MacabResultSetMetaData + */ + class MacabResultSetMetaData : public ::cppu::WeakImplHelper< css::sdbc::XResultSetMetaData> + { + MacabConnection* m_pConnection; + OUString m_sTableName; + std::vector<sal_Int32> m_aMacabFields; // for each selected column, contains the number + // of the corresponding AddressBook field - protected: - virtual ~MacabResultSetMetaData() override; + protected: + virtual ~MacabResultSetMetaData() override; - public: - MacabResultSetMetaData(MacabConnection* _pConnection, OUString const & _sTableName); + public: + MacabResultSetMetaData(MacabConnection* _pConnection, OUString const & _sTableName); - // avoid ambiguous cast error from the compiler - operator css::uno::Reference< css::sdbc::XResultSetMetaData > () noexcept - { return this; } + // avoid ambiguous cast error from the compiler + operator css::uno::Reference< css::sdbc::XResultSetMetaData > () noexcept + { return this; } - /// @throws css::sdbc::SQLException - void setMacabFields( - const ::rtl::Reference<connectivity::OSQLColumns> &xColumns); - sal_uInt32 fieldAtColumn(sal_Int32 columnIndex) const - { return m_aMacabFields[columnIndex - 1]; } + /// @throws css::sdbc::SQLException + void setMacabFields( + const ::rtl::Reference<connectivity::OSQLColumns> &xColumns); + sal_uInt32 fieldAtColumn(sal_Int32 columnIndex) const + { return m_aMacabFields[columnIndex - 1]; } - virtual sal_Int32 SAL_CALL getColumnCount( ) override; - virtual sal_Bool SAL_CALL isAutoIncrement( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isCaseSensitive( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isSearchable( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isCurrency( sal_Int32 column ) override; - virtual sal_Int32 SAL_CALL isNullable( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isSigned( sal_Int32 column ) override; - virtual sal_Int32 SAL_CALL getColumnDisplaySize( sal_Int32 column ) override; - virtual OUString SAL_CALL getColumnLabel( sal_Int32 column ) override; - virtual OUString SAL_CALL getColumnName( sal_Int32 column ) override; - virtual OUString SAL_CALL getSchemaName( sal_Int32 column ) override; - virtual sal_Int32 SAL_CALL getPrecision( sal_Int32 column ) override; - virtual sal_Int32 SAL_CALL getScale( sal_Int32 column ) override; - virtual OUString SAL_CALL getTableName( sal_Int32 column ) override; - virtual OUString SAL_CALL getCatalogName( sal_Int32 column ) override; - virtual sal_Int32 SAL_CALL getColumnType( sal_Int32 column ) override; - virtual OUString SAL_CALL getColumnTypeName( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isReadOnly( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isWritable( sal_Int32 column ) override; - virtual sal_Bool SAL_CALL isDefinitelyWritable( sal_Int32 column ) override; - virtual OUString SAL_CALL getColumnServiceName( sal_Int32 column ) override; - }; + virtual sal_Int32 SAL_CALL getColumnCount( ) override; + virtual sal_Bool SAL_CALL isAutoIncrement( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isCaseSensitive( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isSearchable( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isCurrency( sal_Int32 column ) override; + virtual sal_Int32 SAL_CALL isNullable( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isSigned( sal_Int32 column ) override; + virtual sal_Int32 SAL_CALL getColumnDisplaySize( sal_Int32 column ) override; + virtual OUString SAL_CALL getColumnLabel( sal_Int32 column ) override; + virtual OUString SAL_CALL getColumnName( sal_Int32 column ) override; + virtual OUString SAL_CALL getSchemaName( sal_Int32 column ) override; + virtual sal_Int32 SAL_CALL getPrecision( sal_Int32 column ) override; + virtual sal_Int32 SAL_CALL getScale( sal_Int32 column ) override; + virtual OUString SAL_CALL getTableName( sal_Int32 column ) override; + virtual OUString SAL_CALL getCatalogName( sal_Int32 column ) override; + virtual sal_Int32 SAL_CALL getColumnType( sal_Int32 column ) override; + virtual OUString SAL_CALL getColumnTypeName( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isReadOnly( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isWritable( sal_Int32 column ) override; + virtual sal_Bool SAL_CALL isDefinitelyWritable( sal_Int32 column ) override; + virtual OUString SAL_CALL getColumnServiceName( sal_Int32 column ) override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabStatement.cxx b/connectivity/source/drivers/macab/MacabStatement.cxx index 6c8a02cd7391..95b922ce6bc7 100644 --- a/connectivity/source/drivers/macab/MacabStatement.cxx +++ b/connectivity/source/drivers/macab/MacabStatement.cxx @@ -472,7 +472,7 @@ Any SAL_CALL MacabCommonStatement::getWarnings( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(rBHelper.bDisposed); - return makeAny(m_aLastWarning); + return Any(m_aLastWarning); } void SAL_CALL MacabCommonStatement::clearWarnings( ) @@ -487,31 +487,71 @@ void SAL_CALL MacabCommonStatement::clearWarnings( ) { // this properties are defined by the service statement // they must be in alphabetic order - Sequence< Property > aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), - PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), - PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), - PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), - PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), - PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), + PROPERTY_ID_ESCAPEPROCESSING, + cppu::UnoType<bool>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), + PROPERTY_ID_MAXFIELDSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), + PROPERTY_ID_MAXROWS, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), + PROPERTY_ID_QUERYTIMEOUT, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), + PROPERTY_ID_USEBOOKMARKS, + cppu::UnoType<bool>::get(), + 0 + } + } + }; } ::cppu::IPropertyArrayHelper & MacabCommonStatement::getInfoHelper() diff --git a/connectivity/source/drivers/macab/MacabStatement.hxx b/connectivity/source/drivers/macab/MacabStatement.hxx index 6b0c53c234ad..8c72bd55974b 100644 --- a/connectivity/source/drivers/macab/MacabStatement.hxx +++ b/connectivity/source/drivers/macab/MacabStatement.hxx @@ -24,6 +24,7 @@ #include <connectivity/sqliterator.hxx> #include <connectivity/sqlparse.hxx> #include <com/sun/star/sdbc/XStatement.hpp> +#include <com/sun/star/sdbc/SQLWarning.hpp> #include <com/sun/star/util/XCancellable.hpp> #include <cppuhelper/compbase.hxx> #include <cppuhelper/implbase.hxx> @@ -32,137 +33,137 @@ namespace connectivity::macab { - typedef ::cppu::WeakComponentImplHelper< css::sdbc::XStatement, - css::sdbc::XWarningsSupplier, - css::util::XCancellable, - css::sdbc::XCloseable> MacabCommonStatement_BASE; - - - // Class MacabCommonStatement - // is a base class for the normal statement and for the prepared statement - - class MacabCommonStatement : public cppu::BaseMutex, - public MacabCommonStatement_BASE, - public ::cppu::OPropertySetHelper, - public comphelper::OPropertyArrayUsageHelper<MacabCommonStatement> - - { - css::sdbc::SQLWarning m_aLastWarning; - - protected: - connectivity::OSQLParser m_aParser; - connectivity::OSQLParseTreeIterator m_aSQLIterator; - connectivity::OSQLParseNode* m_pParseTree; - MacabConnection* m_pConnection; // The owning Connection object - MacabHeader* m_pHeader; // The header of the address book on which to run queries (provided by m_pConnection) - css::uno::WeakReference< css::sdbc::XResultSet> m_xResultSet; // The last ResultSet created - - - protected: - /// @throws css::sdbc::SQLException - class MacabCondition *analyseWhereClause( - const OSQLParseNode *pParseNode) const; - /// @throws css::sdbc::SQLException - class MacabOrder *analyseOrderByClause( - const OSQLParseNode *pParseNode) const; - OUString getTableName( ) const; - /// @throws css::sdbc::SQLException - void setMacabFields(class MacabResultSet *pResult) const; - /// @throws css::sdbc::SQLException - void selectRecords(MacabResultSet *pResult) const; - /// @throws css::sdbc::SQLException - void sortRecords(MacabResultSet *pResult) const; - - // OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; - - // OPropertySetHelper - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; - virtual sal_Bool SAL_CALL convertFastPropertyValue( - css::uno::Any & rConvertedValue, - css::uno::Any & rOldValue, - sal_Int32 nHandle, - const css::uno::Any& rValue) override; - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const css::uno::Any& rValue) override; - virtual void SAL_CALL getFastPropertyValue( - css::uno::Any& rValue, - sal_Int32 nHandle) const override; - - /// @throws css::sdbc::SQLException - virtual void resetParameters() const; - /// @throws css::sdbc::SQLException - virtual void getNextParameter(OUString &rParameter) const; - virtual ~MacabCommonStatement() override; - - public: - using MacabCommonStatement_BASE::rBHelper; - - explicit MacabCommonStatement(MacabConnection *_pConnection); - using MacabCommonStatement_BASE::operator css::uno::Reference< css::uno::XInterface >; - - // OComponentHelper - using MacabCommonStatement_BASE::disposing; - - // XInterface - virtual void SAL_CALL release() noexcept override; - virtual void SAL_CALL acquire() noexcept override; - virtual css::uno::Any SAL_CALL queryInterface( - const css::uno::Type & rType - ) override; - - // XTypeProvider - virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( - ) override; - - // XPropertySet - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( - ) override; - - // XStatement - virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( - const OUString& sql ) override; - virtual sal_Int32 SAL_CALL executeUpdate( - const OUString& sql ) override; - virtual sal_Bool SAL_CALL execute( - const OUString& sql ) override; - virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( - ) override; - - // XWarningsSupplier - virtual css::uno::Any SAL_CALL getWarnings( - ) override; - virtual void SAL_CALL clearWarnings( - ) override; - - // XCancellable - virtual void SAL_CALL cancel( - ) override; - - // XCloseable - virtual void SAL_CALL close( - ) override; - - // other methods - MacabConnection* getOwnConnection() const { return m_pConnection; } - }; - - - // Class MacabStatement - - typedef ::cppu::ImplInheritanceHelper< - MacabCommonStatement, css::lang::XServiceInfo > MacabStatement_BASE; - - class MacabStatement : public MacabStatement_BASE - { - protected: - virtual ~MacabStatement() override { } - - public: - explicit MacabStatement(MacabConnection* _pConnection); - DECLARE_SERVICE_INFO(); - }; + typedef ::cppu::WeakComponentImplHelper< css::sdbc::XStatement, + css::sdbc::XWarningsSupplier, + css::util::XCancellable, + css::sdbc::XCloseable> MacabCommonStatement_BASE; + + + // Class MacabCommonStatement + // is a base class for the normal statement and for the prepared statement + + class MacabCommonStatement : public cppu::BaseMutex, + public MacabCommonStatement_BASE, + public ::cppu::OPropertySetHelper, + public comphelper::OPropertyArrayUsageHelper<MacabCommonStatement> + + { + css::sdbc::SQLWarning m_aLastWarning; + + protected: + connectivity::OSQLParser m_aParser; + connectivity::OSQLParseTreeIterator m_aSQLIterator; + connectivity::OSQLParseNode* m_pParseTree; + MacabConnection* m_pConnection; // The owning Connection object + MacabHeader* m_pHeader; // The header of the address book on which to run queries (provided by m_pConnection) + css::uno::WeakReference< css::sdbc::XResultSet> m_xResultSet; // The last ResultSet created + + + protected: + /// @throws css::sdbc::SQLException + class MacabCondition *analyseWhereClause( + const OSQLParseNode *pParseNode) const; + /// @throws css::sdbc::SQLException + class MacabOrder *analyseOrderByClause( + const OSQLParseNode *pParseNode) const; + OUString getTableName( ) const; + /// @throws css::sdbc::SQLException + void setMacabFields(class MacabResultSet *pResult) const; + /// @throws css::sdbc::SQLException + void selectRecords(MacabResultSet *pResult) const; + /// @throws css::sdbc::SQLException + void sortRecords(MacabResultSet *pResult) const; + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; + + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper() override; + virtual sal_Bool SAL_CALL convertFastPropertyValue( + css::uno::Any & rConvertedValue, + css::uno::Any & rOldValue, + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const css::uno::Any& rValue) override; + virtual void SAL_CALL getFastPropertyValue( + css::uno::Any& rValue, + sal_Int32 nHandle) const override; + + /// @throws css::sdbc::SQLException + virtual void resetParameters() const; + /// @throws css::sdbc::SQLException + virtual void getNextParameter(OUString &rParameter) const; + virtual ~MacabCommonStatement() override; + + public: + using MacabCommonStatement_BASE::rBHelper; + + explicit MacabCommonStatement(MacabConnection *_pConnection); + using MacabCommonStatement_BASE::operator css::uno::Reference< css::uno::XInterface >; + + // OComponentHelper + using MacabCommonStatement_BASE::disposing; + + // XInterface + virtual void SAL_CALL release() noexcept override; + virtual void SAL_CALL acquire() noexcept override; + virtual css::uno::Any SAL_CALL queryInterface( + const css::uno::Type & rType + ) override; + + // XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( + ) override; + + // XPropertySet + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( + ) override; + + // XStatement + virtual css::uno::Reference< css::sdbc::XResultSet > SAL_CALL executeQuery( + const OUString& sql ) override; + virtual sal_Int32 SAL_CALL executeUpdate( + const OUString& sql ) override; + virtual sal_Bool SAL_CALL execute( + const OUString& sql ) override; + virtual css::uno::Reference< css::sdbc::XConnection > SAL_CALL getConnection( + ) override; + + // XWarningsSupplier + virtual css::uno::Any SAL_CALL getWarnings( + ) override; + virtual void SAL_CALL clearWarnings( + ) override; + + // XCancellable + virtual void SAL_CALL cancel( + ) override; + + // XCloseable + virtual void SAL_CALL close( + ) override; + + // other methods + MacabConnection* getOwnConnection() const { return m_pConnection; } + }; + + + // Class MacabStatement + + typedef ::cppu::ImplInheritanceHelper< + MacabCommonStatement, css::lang::XServiceInfo > MacabStatement_BASE; + + class MacabStatement : public MacabStatement_BASE + { + protected: + virtual ~MacabStatement() override { } + + public: + explicit MacabStatement(MacabConnection* _pConnection); + DECLARE_SERVICE_INFO(); + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabTable.hxx b/connectivity/source/drivers/macab/MacabTable.hxx index 897d589cc697..ac57c49c7f0c 100644 --- a/connectivity/source/drivers/macab/MacabTable.hxx +++ b/connectivity/source/drivers/macab/MacabTable.hxx @@ -24,31 +24,31 @@ namespace connectivity::macab { - typedef connectivity::sdbcx::OTable MacabTable_TYPEDEF; - - class MacabTable : public MacabTable_TYPEDEF - { - css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData; - MacabConnection* m_pConnection; - - public: - MacabTable( sdbcx::OCollection* _pTables, MacabConnection* _pConnection); - MacabTable( sdbcx::OCollection* _pTables, - MacabConnection* _pConnection, - const OUString& Name, - const OUString& Type, - const OUString& Description = OUString(), - const OUString& SchemaName = OUString(), - const OUString& CatalogName = OUString() - ); - - MacabConnection* getConnection() { return m_pConnection;} - - virtual void refreshColumns() override; - - OUString const & getTableName() const { return m_Name; } - OUString const & getSchema() const { return m_SchemaName; } - }; + typedef connectivity::sdbcx::OTable MacabTable_TYPEDEF; + + class MacabTable : public MacabTable_TYPEDEF + { + css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData; + MacabConnection* m_pConnection; + + public: + MacabTable( sdbcx::OCollection* _pTables, MacabConnection* _pConnection); + MacabTable( sdbcx::OCollection* _pTables, + MacabConnection* _pConnection, + const OUString& Name, + const OUString& Type, + const OUString& Description = OUString(), + const OUString& SchemaName = OUString(), + const OUString& CatalogName = OUString() + ); + + MacabConnection* getConnection() { return m_pConnection;} + + virtual void refreshColumns() override; + + OUString const & getTableName() const { return m_Name; } + OUString const & getSchema() const { return m_SchemaName; } + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/MacabTables.cxx b/connectivity/source/drivers/macab/MacabTables.cxx index e7149d2646c1..e7aba053a48a 100644 --- a/connectivity/source/drivers/macab/MacabTables.cxx +++ b/connectivity/source/drivers/macab/MacabTables.cxx @@ -36,7 +36,7 @@ using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -sdbcx::ObjectType MacabTables::createObject(const OUString& _rName) +css::uno::Reference< css::beans::XPropertySet > MacabTables::createObject(const OUString& _rName) { OUString aName,aSchema; aSchema = "%"; @@ -46,7 +46,7 @@ sdbcx::ObjectType MacabTables::createObject(const OUString& _rName) Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), aSchema, aName, aTypes); - sdbcx::ObjectType xRet; + css::uno::Reference< css::beans::XPropertySet > xRet; if (xResult.is()) { Reference< XRow > xRow(xResult, UNO_QUERY); diff --git a/connectivity/source/drivers/macab/MacabTables.hxx b/connectivity/source/drivers/macab/MacabTables.hxx index 0b0d841b7a43..d9ccad86da13 100644 --- a/connectivity/source/drivers/macab/MacabTables.hxx +++ b/connectivity/source/drivers/macab/MacabTables.hxx @@ -24,26 +24,26 @@ namespace connectivity::macab { - class MacabTables : public sdbcx::OCollection - { - css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData; + class MacabTables : public sdbcx::OCollection + { + css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData; - protected: - virtual sdbcx::ObjectType createObject(const OUString& _rName) override; - virtual void impl_refresh() override; + protected: + virtual css::uno::Reference< css::beans::XPropertySet > createObject(const OUString& _rName) override; + virtual void impl_refresh() override; - public: - MacabTables( - const css::uno::Reference< css::sdbc::XDatabaseMetaData >& _rMetaData, - ::cppu::OWeakObject& _rParent, - ::osl::Mutex& _rMutex, - const ::std::vector< OUString> &_rVector) - : sdbcx::OCollection(_rParent,true,_rMutex,_rVector), - m_xMetaData(_rMetaData) - { } + public: + MacabTables( + const css::uno::Reference< css::sdbc::XDatabaseMetaData >& _rMetaData, + ::cppu::OWeakObject& _rParent, + ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector) + : sdbcx::OCollection(_rParent,true,_rMutex,_rVector), + m_xMetaData(_rMetaData) + { } - virtual void disposing() override; - }; + virtual void disposing() override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/macaborder.hxx b/connectivity/source/drivers/macab/macaborder.hxx index e5eb6c987ce2..36151cb76ea6 100644 --- a/connectivity/source/drivers/macab/macaborder.hxx +++ b/connectivity/source/drivers/macab/macaborder.hxx @@ -29,36 +29,36 @@ namespace connectivity::macab { - class MacabOrder - { - public: - virtual ~MacabOrder(); + class MacabOrder + { + public: + virtual ~MacabOrder(); - virtual sal_Int32 compare(const MacabRecord *record1, const MacabRecord *record2) const = 0; - }; + virtual sal_Int32 compare(const MacabRecord *record1, const MacabRecord *record2) const = 0; + }; - class MacabSimpleOrder : public MacabOrder - { - sal_Int32 m_nFieldNumber; - bool m_bAscending; + class MacabSimpleOrder : public MacabOrder + { + sal_Int32 m_nFieldNumber; + bool m_bAscending; - public: - MacabSimpleOrder(MacabHeader const *header, std::u16string_view sColumnName, bool bAscending); + public: + MacabSimpleOrder(MacabHeader const *header, std::u16string_view sColumnName, bool bAscending); - virtual sal_Int32 compare(const MacabRecord *record1, const MacabRecord *record2) const override; - }; + virtual sal_Int32 compare(const MacabRecord *record1, const MacabRecord *record2) const override; + }; - class MacabComplexOrder : public MacabOrder - { - std::vector<std::unique_ptr<MacabOrder>> m_aOrders; + class MacabComplexOrder : public MacabOrder + { + std::vector<std::unique_ptr<MacabOrder>> m_aOrders; - public: - MacabComplexOrder(); - virtual ~MacabComplexOrder() override; + public: + MacabComplexOrder(); + virtual ~MacabComplexOrder() override; - void addOrder(MacabOrder *pOrder); - virtual sal_Int32 compare(const MacabRecord *record1, const MacabRecord *record2) const override; - }; + void addOrder(MacabOrder *pOrder); + virtual sal_Int32 compare(const MacabRecord *record1, const MacabRecord *record2) const override; + }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/macab/macabutilities.hxx b/connectivity/source/drivers/macab/macabutilities.hxx index cfe46f37f286..f89553c9ea27 100644 --- a/connectivity/source/drivers/macab/macabutilities.hxx +++ b/connectivity/source/drivers/macab/macabutilities.hxx @@ -19,6 +19,10 @@ #pragma once +#include <sal/config.h> + +#include <memory> + #include <com/sun/star/util/DateTime.hpp> #include <com/sun/star/sdbc/DataType.hpp> #include <unotools/resmgr.hxx> @@ -32,107 +36,107 @@ namespace connectivity::macab { - inline OUString CFStringToOUString(const CFStringRef sOrig) - { - /* Copied all-but directly from code by Florian Heckl in - * cws_src680_aquafilepicker01 - * File was: fpicker/source/aqua/CFStringUtilities - * I only removed commented debugging lines and changed variable - * names. - */ - if (nullptr == sOrig) { - return OUString(); - } + inline OUString CFStringToOUString(const CFStringRef sOrig) + { + /* Copied all-but directly from code by Florian Heckl in + * cws_src680_aquafilepicker01 + * File was: fpicker/source/aqua/CFStringUtilities + * I only removed commented debugging lines and changed variable + * names. + */ + if (nullptr == sOrig) { + return OUString(); + } - CFRetain(sOrig); - CFIndex nStringLength = CFStringGetLength(sOrig); + CFRetain(sOrig); + CFIndex nStringLength = CFStringGetLength(sOrig); - UniChar unichars[nStringLength+1]; + auto const unichars = std::make_unique<UniChar[]>(nStringLength+1); - //'close' the string buffer correctly - unichars[nStringLength] = '\0'; + //'close' the string buffer correctly + unichars[nStringLength] = '\0'; - CFStringGetCharacters (sOrig, CFRangeMake(0,nStringLength), unichars); - CFRelease(sOrig); + CFStringGetCharacters (sOrig, CFRangeMake(0,nStringLength), unichars.get()); + CFRelease(sOrig); - return OUString(reinterpret_cast<sal_Unicode *>(unichars)); - } + return OUString(reinterpret_cast<sal_Unicode *>(unichars.get())); + } - inline CFStringRef OUStringToCFString(const OUString& aString) - { - /* Copied directly from code by Florian Heckl in - * cws_src680_aquafilepicker01 - * File was: fpicker/source/aqua/CFStringUtilities - */ + inline CFStringRef OUStringToCFString(const OUString& aString) + { + /* Copied directly from code by Florian Heckl in + * cws_src680_aquafilepicker01 + * File was: fpicker/source/aqua/CFStringUtilities + */ - CFStringRef ref = CFStringCreateWithCharacters(kCFAllocatorDefault, reinterpret_cast<UniChar const *>(aString.getStr()), aString.getLength()); + CFStringRef ref = CFStringCreateWithCharacters(kCFAllocatorDefault, reinterpret_cast<UniChar const *>(aString.getStr()), aString.getLength()); - return ref; - } + return ref; + } - inline css::util::DateTime CFDateToDateTime(const CFDateRef _cfDate) + inline css::util::DateTime CFDateToDateTime(const CFDateRef _cfDate) + { + /* Carbon can give us the time since 2001 of any CFDateRef, + * and it also stores the time since 1970 as a constant, + * basically allowing us to get the unixtime of any + * CFDateRef. From there, it is just a matter of choosing what + * we want to do with it. + */ + css::util::DateTime nRet; + double timeSince2001 = CFDateGetAbsoluteTime(_cfDate); + time_t unixtime = timeSince2001+kCFAbsoluteTimeIntervalSince1970; + struct tm *ptm = localtime(&unixtime); + nRet.Year = ptm->tm_year+1900; + nRet.Month = ptm->tm_mon+1; + nRet.Day = ptm->tm_mday; + nRet.Hours = ptm->tm_hour; + nRet.Minutes = ptm->tm_min; + nRet.Seconds = ptm->tm_sec; + nRet.NanoSeconds = 0; + return nRet; + } + + + inline OUString fixLabel(const OUString& _originalLabel) + { + /* Get the length, and make sure that there is actually a string + * here. + */ + if(_originalLabel.startsWith("_$!<")) { - /* Carbon can give us the time since 2001 of any CFDateRef, - * and it also stores the time since 1970 as a constant, - * basically allowing us to get the unixtime of any - * CFDateRef. From there, it is just a matter of choosing what - * we want to do with it. - */ - css::util::DateTime nRet; - double timeSince2001 = CFDateGetAbsoluteTime(_cfDate); - time_t unixtime = timeSince2001+kCFAbsoluteTimeIntervalSince1970; - struct tm *ptm = localtime(&unixtime); - nRet.Year = ptm->tm_year+1900; - nRet.Month = ptm->tm_mon+1; - nRet.Day = ptm->tm_mday; - nRet.Hours = ptm->tm_hour; - nRet.Minutes = ptm->tm_min; - nRet.Seconds = ptm->tm_sec; - nRet.NanoSeconds = 0; - return nRet; + return _originalLabel.copy(4,_originalLabel.getLength()-8); } - - inline OUString fixLabel(const OUString& _originalLabel) - { - /* Get the length, and make sure that there is actually a string - * here. - */ - if(_originalLabel.startsWith("_$!<")) - { - return _originalLabel.copy(4,_originalLabel.getLength()-8); - } - - return _originalLabel; - } + return _originalLabel; + } - inline sal_Int32 ABTypeToDataType(const ABPropertyType _abType) + inline sal_Int32 ABTypeToDataType(const ABPropertyType _abType) + { + sal_Int32 dataType; + switch(_abType) { - sal_Int32 dataType; - switch(_abType) - { - case kABStringProperty: - dataType = css::sdbc::DataType::CHAR; - break; - case kABDateProperty: - dataType = css::sdbc::DataType::TIMESTAMP; - break; - case kABIntegerProperty: - dataType = css::sdbc::DataType::INTEGER; - break; - case kABRealProperty: - dataType = css::sdbc::DataType::FLOAT; - break; - default: - dataType = -1; - } - return dataType; + case kABStringProperty: + dataType = css::sdbc::DataType::CHAR; + break; + case kABDateProperty: + dataType = css::sdbc::DataType::TIMESTAMP; + break; + case kABIntegerProperty: + dataType = css::sdbc::DataType::INTEGER; + break; + case kABRealProperty: + dataType = css::sdbc::DataType::FLOAT; + break; + default: + dataType = -1; } + return dataType; + } - void impl_throwError(TranslateId pErrorId); + void impl_throwError(TranslateId pErrorId); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx b/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx index faa2063b27b8..37cfb087a70f 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx @@ -32,8 +32,6 @@ using namespace connectivity::mozab; using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::Sequence; -using ::com::sun::star::lang::XSingleServiceFactory; -using ::com::sun::star::lang::XMultiServiceFactory; MozillaBootstrap::MozillaBootstrap() : OMozillaBootstrap_BASE(m_aMutex) @@ -54,7 +52,7 @@ void MozillaBootstrap::disposing() OUString SAL_CALL MozillaBootstrap::getImplementationName( ) { - return "com.sun.star.comp.mozilla.MozillaBootstrap"; + return u"com.sun.star.comp.mozilla.MozillaBootstrap"_ustr; } sal_Bool SAL_CALL MozillaBootstrap::supportsService( const OUString& _rServiceName ) @@ -66,7 +64,7 @@ Sequence< OUString > SAL_CALL MozillaBootstrap::getSupportedServiceNames( ) { // which service is supported // for more information @see com.sun.star.mozilla.MozillaBootstrap - return { "com.sun.star.mozilla.MozillaBootstrap" }; + return { u"com.sun.star.mozilla.MozillaBootstrap"_ustr }; } diff --git a/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.hxx b/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.hxx index e01a2bb9612c..7c040554137a 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.hxx +++ b/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.hxx @@ -29,49 +29,48 @@ namespace connectivity::mozab { - typedef ::cppu::WeakComponentImplHelper< css::mozilla::XMozillaBootstrap, - css::lang::XServiceInfo > OMozillaBootstrap_BASE; - class ProfileAccess; - class ProfileManager; - class MozillaBootstrap : public OMozillaBootstrap_BASE - { - private: - ::osl::Mutex m_aMutex; // mutex is need to control member access - virtual ~MozillaBootstrap() override; - std::unique_ptr<ProfileAccess> m_ProfileAccess; - public: + typedef ::cppu::WeakComponentImplHelper< css::mozilla::XMozillaBootstrap, + css::lang::XServiceInfo > OMozillaBootstrap_BASE; + class ProfileAccess; + class MozillaBootstrap : public OMozillaBootstrap_BASE + { + private: + ::osl::Mutex m_aMutex; // mutex is need to control member access + virtual ~MozillaBootstrap() override; + std::unique_ptr<ProfileAccess> m_ProfileAccess; + public: - MozillaBootstrap(); + MozillaBootstrap(); - // OComponentHelper - virtual void SAL_CALL disposing() override; + // OComponentHelper + virtual void SAL_CALL disposing() override; - // XServiceInfo - virtual OUString SAL_CALL getImplementationName( ) override; - virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; - virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; + // XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) override; + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) override; - // XMozillaBootstrap + // XMozillaBootstrap - // XProfileDiscover - virtual ::sal_Int32 SAL_CALL getProfileCount( css::mozilla::MozillaProductType product) override; - virtual ::sal_Int32 SAL_CALL getProfileList( css::mozilla::MozillaProductType product, css::uno::Sequence< OUString >& list ) override; - virtual OUString SAL_CALL getDefaultProfile( css::mozilla::MozillaProductType product ) override; - virtual OUString SAL_CALL getProfilePath( css::mozilla::MozillaProductType product, const OUString& profileName ) override; - virtual sal_Bool SAL_CALL isProfileLocked( css::mozilla::MozillaProductType product, const OUString& profileName ) override; - virtual sal_Bool SAL_CALL getProfileExists( css::mozilla::MozillaProductType product, const OUString& profileName ) override; + // XProfileDiscover + virtual ::sal_Int32 SAL_CALL getProfileCount( css::mozilla::MozillaProductType product) override; + virtual ::sal_Int32 SAL_CALL getProfileList( css::mozilla::MozillaProductType product, css::uno::Sequence< OUString >& list ) override; + virtual OUString SAL_CALL getDefaultProfile( css::mozilla::MozillaProductType product ) override; + virtual OUString SAL_CALL getProfilePath( css::mozilla::MozillaProductType product, const OUString& profileName ) override; + virtual sal_Bool SAL_CALL isProfileLocked( css::mozilla::MozillaProductType product, const OUString& profileName ) override; + virtual sal_Bool SAL_CALL getProfileExists( css::mozilla::MozillaProductType product, const OUString& profileName ) override; - // XProfileManager - virtual ::sal_Int32 SAL_CALL bootupProfile( css::mozilla::MozillaProductType product, const OUString& profileName ) override; - virtual ::sal_Int32 SAL_CALL shutdownProfile( ) override; - virtual css::mozilla::MozillaProductType SAL_CALL getCurrentProduct( ) override; - virtual OUString SAL_CALL getCurrentProfile( ) override; - virtual sal_Bool SAL_CALL isCurrentProfileLocked( ) override; - virtual OUString SAL_CALL setCurrentProfile( css::mozilla::MozillaProductType product, const OUString& profileName ) override; + // XProfileManager + virtual ::sal_Int32 SAL_CALL bootupProfile( css::mozilla::MozillaProductType product, const OUString& profileName ) override; + virtual ::sal_Int32 SAL_CALL shutdownProfile( ) override; + virtual css::mozilla::MozillaProductType SAL_CALL getCurrentProduct( ) override; + virtual OUString SAL_CALL getCurrentProfile( ) override; + virtual sal_Bool SAL_CALL isCurrentProfileLocked( ) override; + virtual OUString SAL_CALL setCurrentProfile( css::mozilla::MozillaProductType product, const OUString& profileName ) override; - // XProxyRunner - virtual ::sal_Int32 SAL_CALL Run( const css::uno::Reference< css::mozilla::XCodeProxy >& aCode ) override; - }; + // XProxyRunner + virtual ::sal_Int32 SAL_CALL Run( const css::uno::Reference< css::mozilla::XCodeProxy >& aCode ) override; + }; } diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSFolders.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSFolders.cxx index 71c70c641b30..8b8bf0939a5b 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSFolders.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSFolders.cxx @@ -148,10 +148,10 @@ namespace } -OUString getRegistryDir(MozillaProductType product) +const OUString & getRegistryDir(MozillaProductType product) { if (product == MozillaProductType_Default) - return OUString(); + return EMPTY_OUSTRING; return lcl_guessProfileRoot( product ); } diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSFolders.hxx b/connectivity/source/drivers/mozab/bootstrap/MNSFolders.hxx index 90674a0f4e62..f61b808223a9 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSFolders.hxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSFolders.hxx @@ -23,6 +23,6 @@ #include <rtl/ustring.hxx> -OUString getRegistryDir(css::mozilla::MozillaProductType product); +const OUString& getRegistryDir(css::mozilla::MozillaProductType product); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSINIParser.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSINIParser.cxx index ae775b6fca01..98a1b6ff64bc 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSINIParser.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSINIParser.cxx @@ -22,6 +22,7 @@ #include <osl/file.h> #include <rtl/byteseq.hxx> #include <sal/log.hxx> +#include <o3tl/string_view.hxx> IniParser::IniParser(OUString const & rIniName) { @@ -47,7 +48,7 @@ IniParser::IniParser(OUString const & rIniName) sal_uInt64 nSize = 0; osl_getFileSize(handle, &nSize); - OUString sectionName( "no name section" ); + OUString sectionName( u"no name section"_ustr ); while (true) { sal_uInt64 nPos; @@ -62,9 +63,9 @@ IniParser::IniParser(OUString const & rIniName) ini_Section *aSection = &mAllSection[sectionName]; struct ini_NameValue nameValue; nameValue.sName = OStringToOUString( - line.copy(0,nIndex).trim(), RTL_TEXTENCODING_ASCII_US ); + o3tl::trim(line.subView(0,nIndex)), RTL_TEXTENCODING_ASCII_US ); nameValue.sValue = OStringToOUString( - line.copy(nIndex+1).trim(), RTL_TEXTENCODING_UTF8 ); + o3tl::trim(line.subView(nIndex+1)), RTL_TEXTENCODING_UTF8 ); aSection->vVector.push_back(nameValue); @@ -76,7 +77,7 @@ IniParser::IniParser(OUString const & rIniName) if ( nIndexEnd > nIndexStart && nIndexStart >=0) { sectionName = OStringToOUString( - line.copy(nIndexStart + 1,nIndexEnd - nIndexStart -1).trim(), RTL_TEXTENCODING_ASCII_US ); + o3tl::trim(line.subView(nIndexStart + 1,nIndexEnd - nIndexStart -1)), RTL_TEXTENCODING_ASCII_US ); if (sectionName.isEmpty()) sectionName = "no name section"; } diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx index 18d95cdbdb81..804c8ccc66d8 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx @@ -18,6 +18,8 @@ */ +#include <utility> + #include "MNSProfileDiscover.hxx" #include "MNSFolders.hxx" #include "MNSINIParser.hxx" @@ -28,10 +30,10 @@ namespace connectivity::mozab { } - ProfileStruct::ProfileStruct(const OUString& aProfileName, - const OUString& aProfilePath) - : profileName(aProfileName) - , profilePath(aProfilePath) + ProfileStruct::ProfileStruct(OUString aProfileName, + OUString aProfilePath) + : profileName(std::move(aProfileName)) + , profilePath(std::move(aProfilePath)) { } diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.hxx b/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.hxx index a5f271183b27..5c60dc87e544 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.hxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.hxx @@ -32,47 +32,47 @@ namespace connectivity::mozab { class ProfileStruct; } typedef std::map<OUString, ::connectivity::mozab::ProfileStruct> ProfileList; namespace connectivity::mozab +{ + class ProfileStruct { - class ProfileStruct - { - public: - ProfileStruct(); - ProfileStruct(const OUString& aProfileName, const OUString &aProfilePath); - const OUString& getProfileName() const { return profileName;} - const OUString& getProfilePath() const; - private: - OUString profileName; - OUString profilePath; - }; + public: + ProfileStruct(); + ProfileStruct(OUString aProfileName, OUString aProfilePath); + const OUString& getProfileName() const { return profileName;} + const OUString& getProfilePath() const; + private: + OUString profileName; + OUString profilePath; + }; - class ProductStruct - { - public: - OUString mCurrentProfileName; - ProfileList mProfileList; - }; + class ProductStruct + { + public: + OUString mCurrentProfileName; + ProfileList mProfileList; + }; - //Used to query profiles information - class ProfileAccess final - { - public: - ~ProfileAccess(); - ProfileAccess(); - /// @throws css::uno::RuntimeException - OUString getProfilePath( css::mozilla::MozillaProductType product, const OUString& profileName ); - /// @throws css::uno::RuntimeException - ::sal_Int32 getProfileCount( css::mozilla::MozillaProductType product ); - /// @throws css::uno::RuntimeException - ::sal_Int32 getProfileList( css::mozilla::MozillaProductType product, css::uno::Sequence< OUString >& list ); - /// @throws css::uno::RuntimeException - OUString getDefaultProfile( css::mozilla::MozillaProductType product ); - /// @throws css::uno::RuntimeException - bool getProfileExists( css::mozilla::MozillaProductType product, const OUString& profileName ); - private: - ProductStruct m_ProductProfileList[4]; - void LoadProductsInfo(); - void LoadXPToolkitProfiles(MozillaProductType product); - }; + //Used to query profiles information + class ProfileAccess final + { + public: + ~ProfileAccess(); + ProfileAccess(); + /// @throws css::uno::RuntimeException + OUString getProfilePath( css::mozilla::MozillaProductType product, const OUString& profileName ); + /// @throws css::uno::RuntimeException + ::sal_Int32 getProfileCount( css::mozilla::MozillaProductType product ); + /// @throws css::uno::RuntimeException + ::sal_Int32 getProfileList( css::mozilla::MozillaProductType product, css::uno::Sequence< OUString >& list ); + /// @throws css::uno::RuntimeException + OUString getDefaultProfile( css::mozilla::MozillaProductType product ); + /// @throws css::uno::RuntimeException + bool getProfileExists( css::mozilla::MozillaProductType product, const OUString& profileName ); + private: + ProductStruct m_ProductProfileList[4]; + void LoadProductsInfo(); + void LoadXPToolkitProfiles(MozillaProductType product); + }; } diff --git a/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx b/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx index 9c0afb55abd5..7f4b0232e0c8 100644 --- a/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YCatalog.cxx @@ -29,11 +29,8 @@ using namespace connectivity; using namespace connectivity::mysql; using namespace connectivity::sdbcx; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OMySQLCatalog::OMySQLCatalog(const Reference<XConnection>& _xConnection) : OCatalog(_xConnection) @@ -44,7 +41,8 @@ OMySQLCatalog::OMySQLCatalog(const Reference<XConnection>& _xConnection) void OMySQLCatalog::refreshObjects(const Sequence<OUString>& _sKindOfObject, ::std::vector<OUString>& _rNames) { - Reference<XResultSet> xResult = m_xMetaData->getTables(Any(), "%", "%", _sKindOfObject); + Reference<XResultSet> xResult + = m_xMetaData->getTables(Any(), u"%"_ustr, u"%"_ustr, _sKindOfObject); fillNames(xResult, _rNames); } @@ -53,7 +51,7 @@ void OMySQLCatalog::refreshTables() ::std::vector<OUString> aVector; Sequence<OUString> sTableTypes{ - "VIEW", "TABLE", "%" + u"VIEW"_ustr, u"TABLE"_ustr, u"%"_ustr }; // this last one just to be sure to include anything else... refreshObjects(sTableTypes, aVector); @@ -66,7 +64,7 @@ void OMySQLCatalog::refreshTables() void OMySQLCatalog::refreshViews() { - Sequence<OUString> aTypes{ "VIEW" }; + Sequence<OUString> aTypes{ u"VIEW"_ustr }; // let's simply assume the server is new enough to support views. Current drivers // as of this writing might not return the proper information in getTableTypes, so @@ -88,7 +86,7 @@ void OMySQLCatalog::refreshUsers() ::std::vector<OUString> aVector; Reference<XStatement> xStmt = m_xConnection->createStatement(); Reference<XResultSet> xResult = xStmt->executeQuery( - "SELECT grantee FROM information_schema.user_privileges GROUP BY grantee"); + u"SELECT grantee FROM information_schema.user_privileges GROUP BY grantee"_ustr); if (xResult.is()) { Reference<XRow> xRow(xResult, UNO_QUERY); diff --git a/connectivity/source/drivers/mysql_jdbc/YColumns.cxx b/connectivity/source/drivers/mysql_jdbc/YColumns.cxx index 54beb77ca061..8861037e9a0d 100644 --- a/connectivity/source/drivers/mysql_jdbc/YColumns.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YColumns.cxx @@ -26,10 +26,6 @@ using namespace connectivity::sdbcx; using namespace connectivity; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OMySQLColumns::OMySQLColumns(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, const ::std::vector<OUString>& _rVector) @@ -66,7 +62,7 @@ void OMySQLColumn::construct() Sequence<OUString> SAL_CALL OMySQLColumn::getSupportedServiceNames() { - return { "com.sun.star.sdbcx.Column" }; + return { u"com.sun.star.sdbcx.Column"_ustr }; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysql_jdbc/YDriver.cxx b/connectivity/source/drivers/mysql_jdbc/YDriver.cxx index 7ee501d42e81..2707ddf7f8e8 100644 --- a/connectivity/source/drivers/mysql_jdbc/YDriver.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YDriver.cxx @@ -49,8 +49,8 @@ namespace { OUString getJavaDriverClass(css::uno::Sequence<css::beans::PropertyValue> const& info) { - return comphelper::NamedValueCollection(info).getOrDefault("JavaDriverClass", - OUString("com.mysql.jdbc.Driver")); + return comphelper::NamedValueCollection::getOrDefault(info, u"JavaDriverClass", + u"com.mysql.jdbc.Driver"_ustr); } } @@ -80,11 +80,10 @@ void ODriverDelegator::disposing() for (auto const& connection : m_aConnections) { - Reference<XInterface> xTemp = connection.first.get(); + Reference<XConnection> xTemp(connection.xConn); ::comphelper::disposeComponent(xTemp); } m_aConnections.clear(); - TWeakPairVector().swap(m_aConnections); ODriverDelegator_BASE::disposing(); } @@ -115,9 +114,9 @@ T_DRIVERTYPE lcl_getDriverType(std::u16string_view _sUrl) return eRet; } -OUString transformUrl(const OUString& _sUrl) +OUString transformUrl(std::u16string_view _sUrl) { - OUString sNewUrl = _sUrl.copy(11); + OUString sNewUrl(_sUrl.substr(11)); if (isOdbcUrl(_sUrl)) sNewUrl = "sdbc:" + sNewUrl; else if (isNativeUrl(_sUrl)) @@ -158,36 +157,30 @@ Sequence<PropertyValue> lcl_convertProperties(T_DRIVERTYPE _eType, if (_eType == T_DRIVERTYPE::Odbc) { - aProps.push_back(PropertyValue("Silent", 0, makeAny(true), PropertyState_DIRECT_VALUE)); - aProps.push_back(PropertyValue("PreventGetVersionColumns", 0, makeAny(true), - PropertyState_DIRECT_VALUE)); + aProps.emplace_back("Silent", 0, Any(true), PropertyState_DIRECT_VALUE); + aProps.emplace_back("PreventGetVersionColumns", 0, Any(true), PropertyState_DIRECT_VALUE); } else if (_eType == T_DRIVERTYPE::Jdbc) { if (!jdc) { - aProps.push_back(PropertyValue("JavaDriverClass", 0, - makeAny(OUString("com.mysql.jdbc.Driver")), - PropertyState_DIRECT_VALUE)); + aProps.emplace_back("JavaDriverClass", 0, Any(u"com.mysql.jdbc.Driver"_ustr), + PropertyState_DIRECT_VALUE); } } else { - aProps.push_back( - PropertyValue("PublicConnectionURL", 0, makeAny(_sUrl), PropertyState_DIRECT_VALUE)); + aProps.emplace_back("PublicConnectionURL", 0, Any(_sUrl), PropertyState_DIRECT_VALUE); } - aProps.push_back( - PropertyValue("IsAutoRetrievingEnabled", 0, makeAny(true), PropertyState_DIRECT_VALUE)); - aProps.push_back(PropertyValue("AutoRetrievingStatement", 0, - makeAny(OUString("SELECT LAST_INSERT_ID()")), - PropertyState_DIRECT_VALUE)); - aProps.push_back( - PropertyValue("ParameterNameSubstitution", 0, makeAny(true), PropertyState_DIRECT_VALUE)); + aProps.emplace_back("IsAutoRetrievingEnabled", 0, Any(true), PropertyState_DIRECT_VALUE); + aProps.emplace_back("AutoRetrievingStatement", 0, Any(u"SELECT LAST_INSERT_ID()"_ustr), + PropertyState_DIRECT_VALUE); + aProps.emplace_back("ParameterNameSubstitution", 0, Any(true), PropertyState_DIRECT_VALUE); return Sequence<PropertyValue>(aProps.data(), aProps.size()); } } -Reference<XDriver> ODriverDelegator::loadDriver(const OUString& url, +Reference<XDriver> ODriverDelegator::loadDriver(std::u16string_view url, const Sequence<PropertyValue>& info) { Reference<XDriver> xDriver; @@ -232,8 +225,8 @@ Reference<XConnection> SAL_CALL ODriverDelegator::connect(const OUString& url, Sequence<PropertyValue> aConvertedProperties = lcl_convertProperties(eType, info, url); if (eType == T_DRIVERTYPE::Jdbc) { - ::comphelper::NamedValueCollection aSettings(info); - OUString sIanaName = aSettings.getOrDefault("CharSet", OUString()); + OUString sIanaName = ::comphelper::NamedValueCollection::getOrDefault( + info, u"CharSet", OUString()); if (!sIanaName.isEmpty()) { ::dbtools::OCharsetMap aLookupIanaName; @@ -244,7 +237,7 @@ Reference<XConnection> SAL_CALL ODriverDelegator::connect(const OUString& url, OUString sAdd; if (RTL_TEXTENCODING_UTF8 == (*aLookup).getEncoding()) { - static constexpr OUStringLiteral s_sCharSetOp = u"useUnicode=true&"; + static constexpr OUString s_sCharSetOp = u"useUnicode=true&"_ustr; if (!sCuttedUrl.matchIgnoreAsciiCase(s_sCharSetOp)) { sAdd = s_sCharSetOp; @@ -266,9 +259,7 @@ Reference<XConnection> SAL_CALL ODriverDelegator::connect(const OUString& url, auto pMetaConnection = comphelper::getFromUnoTunnel<OMetaConnection>(xConnection); if (pMetaConnection) pMetaConnection->setURL(url); - m_aConnections.push_back( - TWeakPair(WeakReferenceHelper(xConnection), - TWeakConnectionPair(WeakReferenceHelper(), pMetaConnection))); + m_aConnections.push_back({ xConnection, nullptr, pMetaConnection }); } } } @@ -290,28 +281,27 @@ ODriverDelegator::getPropertyInfo(const OUString& url, const Sequence<PropertyVa if (!acceptsURL(url)) return Sequence<DriverPropertyInfo>(); - Sequence<OUString> aBoolean{ "0", "1" }; + Sequence<OUString> aBoolean{ u"0"_ustr, u"1"_ustr }; std::vector<DriverPropertyInfo> aDriverInfo{ - { "CharSet", "CharSet of the database.", false, {}, {} }, - { "SuppressVersionColumns", "Display version columns (when available).", false, "0", - aBoolean } + { u"CharSet"_ustr, u"CharSet of the database."_ustr, false, {}, {} }, + { u"SuppressVersionColumns"_ustr, u"Display version columns (when available)."_ustr, false, + u"0"_ustr, aBoolean } }; const T_DRIVERTYPE eType = lcl_getDriverType(url); if (eType == T_DRIVERTYPE::Jdbc) { - aDriverInfo.push_back(DriverPropertyInfo("JavaDriverClass", "The JDBC driver class name.", - true, getJavaDriverClass(info), - Sequence<OUString>())); + aDriverInfo.emplace_back("JavaDriverClass", "The JDBC driver class name.", true, + getJavaDriverClass(info), Sequence<OUString>()); } else if (eType == T_DRIVERTYPE::Native) { - aDriverInfo.push_back(DriverPropertyInfo( - "LocalSocket", "The file path of a socket to connect to a local MySQL server.", false, - OUString(), Sequence<OUString>())); - aDriverInfo.push_back(DriverPropertyInfo( - "NamedPipe", "The name of a pipe to connect to a local MySQL server.", false, - OUString(), Sequence<OUString>())); + aDriverInfo.emplace_back("LocalSocket", + "The file path of a socket to connect to a local MySQL server.", + false, OUString(), Sequence<OUString>()); + aDriverInfo.emplace_back("NamedPipe", + "The name of a pipe to connect to a local MySQL server.", false, + OUString(), Sequence<OUString>()); } return Sequence<DriverPropertyInfo>(aDriverInfo.data(), aDriverInfo.size()); @@ -327,40 +317,38 @@ ODriverDelegator::getDataDefinitionByConnection(const Reference<XConnection>& co ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(ODriverDelegator_BASE::rBHelper.bDisposed); - Reference<XTablesSupplier> xTab; + rtl::Reference<OMySQLCatalog> xTab; auto pConnection = comphelper::getFromUnoTunnel<OMetaConnection>(connection); if (pConnection) { - TWeakPairVector::iterator i - = std::find_if(m_aConnections.begin(), m_aConnections.end(), - [&pConnection](const TWeakPairVector::value_type& rConnection) { - return rConnection.second.second == pConnection; - }); + auto i = std::find_if(m_aConnections.begin(), m_aConnections.end(), + [&pConnection](const TConnectionInfo& rConnection) { + return rConnection.pMetaConn == pConnection; + }); if (i != m_aConnections.end()) { - xTab.set(i->second.first.get(), UNO_QUERY); + xTab = i->xCatalog.get(); if (!xTab.is()) { xTab = new OMySQLCatalog(connection); - i->second.first = WeakReferenceHelper(xTab); + i->xCatalog = xTab.get(); } } } // if (pConnection) if (!xTab.is()) { - TWeakPairVector::iterator i - = std::find_if(m_aConnections.begin(), m_aConnections.end(), - [&connection](const TWeakPairVector::value_type& rConnection) { - Reference<XConnection> xTemp(rConnection.first.get(), UNO_QUERY); - return xTemp == connection; - }); + auto i = std::find_if(m_aConnections.begin(), m_aConnections.end(), + [&connection](const TConnectionInfo& rConnection) { + Reference<XConnection> xTemp(rConnection.xConn); + return xTemp == connection; + }); if (i != m_aConnections.end()) { - xTab.set(i->second.first.get(), UNO_QUERY); + xTab = i->xCatalog.get(); if (!xTab.is()) { xTab = new OMySQLCatalog(connection); - i->second.first = WeakReferenceHelper(xTab); + i->xCatalog = xTab.get(); } } } @@ -384,7 +372,7 @@ ODriverDelegator::getDataDefinitionByURL(const OUString& url, const Sequence<Pro OUString SAL_CALL ODriverDelegator::getImplementationName() { - return "org.openoffice.comp.drivers.MySQL.Driver"; + return u"org.openoffice.comp.drivers.MySQL.Driver"_ustr; } sal_Bool SAL_CALL ODriverDelegator::supportsService(const OUString& _rServiceName) @@ -394,7 +382,7 @@ sal_Bool SAL_CALL ODriverDelegator::supportsService(const OUString& _rServiceNam Sequence<OUString> SAL_CALL ODriverDelegator::getSupportedServiceNames() { - return { "com.sun.star.sdbc.Driver", "com.sun.star.sdbcx.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr, u"com.sun.star.sdbcx.Driver"_ustr }; } } // namespace connectivity diff --git a/connectivity/source/drivers/mysql_jdbc/YTable.cxx b/connectivity/source/drivers/mysql_jdbc/YTable.cxx index b5b02fefc1bc..dfb3e37a186f 100644 --- a/connectivity/source/drivers/mysql_jdbc/YTable.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YTable.cxx @@ -48,7 +48,7 @@ namespace class OMySQLKeysHelper : public OKeysHelper { protected: - virtual OUString getDropForeignKey() const override { return " DROP FOREIGN KEY "; } + virtual OUString getDropForeignKey() const override { return u" DROP FOREIGN KEY "_ustr; } public: OMySQLKeysHelper(OTableHelper* _pTable, ::osl::Mutex& _rMutex, @@ -116,20 +116,6 @@ sdbcx::OCollection* OMySQLTable::createIndexes(const ::std::vector<OUString>& _r return new OIndexesHelper(this, m_aMutex, _rNames); } -Sequence<sal_Int8> OMySQLTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -// css::lang::XUnoTunnel - -sal_Int64 OMySQLTable::getSomething(const Sequence<sal_Int8>& rId) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OTable_TYPEDEF>{}); -} - // XAlterTable void SAL_CALL OMySQLTable::alterColumnByName(const OUString& colName, const Reference<XPropertySet>& descriptor) @@ -198,7 +184,7 @@ void SAL_CALL OMySQLTable::alterColumnByName(const OUString& colName, { sTypeName += OUString::Concat(" ") + s_sAutoIncrement; descriptor->setPropertyValue(rProp.getNameByIndex(PROPERTY_ID_TYPENAME), - makeAny(sTypeName)); + Any(sTypeName)); } } else @@ -210,7 +196,7 @@ void SAL_CALL OMySQLTable::alterColumnByName(const OUString& colName, { sTypeName = sTypeName.copy(0, nIndex); descriptor->setPropertyValue(rProp.getNameByIndex(PROPERTY_ID_TYPENAME), - makeAny(sTypeName)); + Any(sTypeName)); } } } @@ -269,14 +255,14 @@ void OMySQLTable::alterColumnType(sal_Int32 nNewType, const OUString& _rColName, rtl::Reference<OColumn> pColumn = new OColumn(true); ::comphelper::copyProperties(_xDescriptor, pColumn); pColumn->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE), - makeAny(nNewType)); + Any(nNewType)); sSql += OTables::adjustSQL(::dbtools::createStandardColumnPart( pColumn, getConnection(), static_cast<OTables*>(m_pTables), getTypeCreatePattern())); executeStatement(sSql); } -OUString OMySQLTable::getTypeCreatePattern() const { return "(M,D)"; } +OUString OMySQLTable::getTypeCreatePattern() const { return u"(M,D)"_ustr; } void OMySQLTable::alterDefaultValue(std::u16string_view _sNewDefault, const OUString& _rColName) { @@ -298,7 +284,7 @@ void OMySQLTable::dropDefaultValue(const OUString& _rColName) OUString OMySQLTable::getAlterTableColumnPart() const { - OUString sSql("ALTER TABLE "); + OUString sSql(u"ALTER TABLE "_ustr); OUString sComposedName( ::dbtools::composeTableName(getMetaData(), m_CatalogName, m_SchemaName, m_Name, true, @@ -322,6 +308,6 @@ void OMySQLTable::executeStatement(const OUString& _rStatement) } } -OUString OMySQLTable::getRenameStart() const { return "RENAME TABLE "; } +OUString OMySQLTable::getRenameStart() const { return u"RENAME TABLE "_ustr; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysql_jdbc/YTables.cxx b/connectivity/source/drivers/mysql_jdbc/YTables.cxx index f1ab3ee1e7b3..b333db670623 100644 --- a/connectivity/source/drivers/mysql_jdbc/YTables.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YTables.cxx @@ -37,17 +37,16 @@ using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace dbtools; -sdbcx::ObjectType OTables::createObject(const OUString& _rName) +css::uno::Reference<css::beans::XPropertySet> OTables::createObject(const OUString& _rName) { OUString sCatalog, sSchema, sTable; ::dbtools::qualifiedNameComponents(m_xMetaData, _rName, sCatalog, sSchema, sTable, ::dbtools::EComposeRule::InDataManipulation); Sequence<OUString> sTableTypes{ - "VIEW", "TABLE", "%" + u"VIEW"_ustr, u"TABLE"_ustr, u"%"_ustr }; // this last one just to be sure to include anything else... Any aCatalog; @@ -55,7 +54,7 @@ sdbcx::ObjectType OTables::createObject(const OUString& _rName) aCatalog <<= sCatalog; Reference<XResultSet> xResult = m_xMetaData->getTables(aCatalog, sSchema, sTable, sTableTypes); - sdbcx::ObjectType xRet; + rtl::Reference<OMySQLTable> xRet; if (xResult.is()) { Reference<XRow> xRow(xResult, UNO_QUERY); @@ -90,8 +89,8 @@ Reference<XPropertySet> OTables::createDescriptor() } // XAppend -sdbcx::ObjectType OTables::appendObject(const OUString& _rForName, - const Reference<XPropertySet>& descriptor) +css::uno::Reference<css::beans::XPropertySet> +OTables::appendObject(const OUString& _rForName, const Reference<XPropertySet>& descriptor) { createTable(descriptor); return createObject(_rForName); @@ -111,7 +110,7 @@ void OTables::dropObject(sal_Int32 _nPos, const OUString& _sElementName) ::dbtools::qualifiedNameComponents(m_xMetaData, _sElementName, sCatalog, sSchema, sTable, ::dbtools::EComposeRule::InDataManipulation); - OUString aSql("DROP "); + OUString aSql(u"DROP "_ustr); Reference<XPropertySet> xProp(xObject, UNO_QUERY); bool bIsView = xProp.is() @@ -153,7 +152,7 @@ OUString OTables::adjustSQL(const OUString& _sSql) sal_Int32 nPos = nIndex + strlen(s_sUNSIGNED); OUString sNewUnsigned(sSQL.copy(nPos, nParen - nPos + 1)); sSQL = sSQL.replaceAt(nIndex, strlen(s_sUNSIGNED) + sNewUnsigned.getLength(), - rtl::OUStringConcatenation(sNewUnsigned + s_sUNSIGNED)); + rtl::Concat2View(sNewUnsigned + s_sUNSIGNED)); nIndex = sSQL.indexOf(s_sUNSIGNED, nIndex + strlen(s_sUNSIGNED) + sNewUnsigned.getLength()); } return sSQL; @@ -178,13 +177,13 @@ void OTables::appendNew(const OUString& _rsNewTable) insertElement(_rsNewTable, nullptr); // notify our container listeners - ContainerEvent aEvent(static_cast<XContainer*>(this), makeAny(_rsNewTable), Any(), Any()); + ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_rsNewTable), Any(), Any()); OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners); while (aListenerLoop.hasMoreElements()) aListenerLoop.next()->elementInserted(aEvent); } -OUString OTables::getNameForObject(const sdbcx::ObjectType& _xObject) +OUString OTables::getNameForObject(const css::uno::Reference<css::beans::XPropertySet>& _xObject) { OSL_ENSURE(_xObject.is(), "OTables::getNameForObject: Object is NULL!"); return ::dbtools::composeTableName(m_xMetaData, _xObject, diff --git a/connectivity/source/drivers/mysql_jdbc/YUser.cxx b/connectivity/source/drivers/mysql_jdbc/YUser.cxx index b683fe2b2757..6944aa7e4c3f 100644 --- a/connectivity/source/drivers/mysql_jdbc/YUser.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YUser.cxx @@ -27,6 +27,7 @@ #include <TConnection.hxx> #include <strings.hrc> #include <comphelper/types.hxx> +#include <utility> using namespace connectivity; using namespace connectivity::mysql; @@ -37,17 +38,17 @@ using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::container; using namespace ::com::sun::star::lang; -OMySQLUser::OMySQLUser(const css::uno::Reference<css::sdbc::XConnection>& _xConnection) +OMySQLUser::OMySQLUser(css::uno::Reference<css::sdbc::XConnection> _xConnection) : connectivity::sdbcx::OUser(true) - , m_xConnection(_xConnection) + , m_xConnection(std::move(_xConnection)) { construct(); } -OMySQLUser::OMySQLUser(const css::uno::Reference<css::sdbc::XConnection>& _xConnection, +OMySQLUser::OMySQLUser(css::uno::Reference<css::sdbc::XConnection> _xConnection, const OUString& Name) : connectivity::sdbcx::OUser(Name, true) - , m_xConnection(_xConnection) + , m_xConnection(std::move(_xConnection)) { construct(); } @@ -116,7 +117,7 @@ void OMySQLUser::findPrivilegesAndGrantPrivileges(const OUString& objName, sal_I Any aCatalog; if (!sCatalog.isEmpty()) aCatalog <<= sCatalog; - xRes = xMeta->getColumnPrivileges(aCatalog, sSchema, sTable, "%"); + xRes = xMeta->getColumnPrivileges(aCatalog, sSchema, sTable, u"%"_ustr); } break; } diff --git a/connectivity/source/drivers/mysql_jdbc/YUsers.cxx b/connectivity/source/drivers/mysql_jdbc/YUsers.cxx index ed33cb0e2d7c..43a032d35ff0 100644 --- a/connectivity/source/drivers/mysql_jdbc/YUsers.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YUsers.cxx @@ -23,6 +23,7 @@ #include <comphelper/types.hxx> #include <connectivity/dbtools.hxx> #include <TConnection.hxx> +#include <utility> using namespace ::comphelper; using namespace connectivity; @@ -30,20 +31,18 @@ using namespace connectivity::mysql; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; OUsers::OUsers(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, const ::std::vector<OUString>& _rVector, - const css::uno::Reference<css::sdbc::XConnection>& _xConnection, + css::uno::Reference<css::sdbc::XConnection> _xConnection, connectivity::sdbcx::IRefreshableUsers* _pParent) : sdbcx::OCollection(_rParent, true, _rMutex, _rVector) - , m_xConnection(_xConnection) + , m_xConnection(std::move(_xConnection)) , m_pParent(_pParent) { } -sdbcx::ObjectType OUsers::createObject(const OUString& _rName) +css::uno::Reference<css::beans::XPropertySet> OUsers::createObject(const OUString& _rName) { return new OMySQLUser(m_xConnection, _rName); } @@ -53,10 +52,10 @@ void OUsers::impl_refresh() { m_pParent->refreshUsers(); } Reference<XPropertySet> OUsers::createDescriptor() { return new OUserExtend(m_xConnection); } // XAppend -sdbcx::ObjectType OUsers::appendObject(const OUString& _rForName, - const Reference<XPropertySet>& descriptor) +css::uno::Reference<css::beans::XPropertySet> +OUsers::appendObject(const OUString& _rForName, const Reference<XPropertySet>& descriptor) { - OUString aSql("GRANT USAGE ON * TO "); + OUString aSql(u"GRANT USAGE ON * TO "_ustr); OUString aQuote = m_xConnection->getMetaData()->getIdentifierQuoteString(); aSql += ::dbtools::quoteName(aQuote, _rForName) + " @\"%\" "; OUString sPassword; @@ -78,7 +77,7 @@ sdbcx::ObjectType OUsers::appendObject(const OUString& _rForName, // XDrop void OUsers::dropObject(sal_Int32 /*_nPos*/, const OUString& _sElementName) { - OUString aSql("DROP USER "); + OUString aSql(u"DROP USER "_ustr); OUString aQuote = m_xConnection->getMetaData()->getIdentifierQuoteString(); aSql += ::dbtools::quoteName(aQuote, _sElementName); diff --git a/connectivity/source/drivers/mysql_jdbc/YViews.cxx b/connectivity/source/drivers/mysql_jdbc/YViews.cxx index 3dba721c0c86..6fbeaeef25ba 100644 --- a/connectivity/source/drivers/mysql_jdbc/YViews.cxx +++ b/connectivity/source/drivers/mysql_jdbc/YViews.cxx @@ -32,14 +32,11 @@ using namespace connectivity; using namespace connectivity::mysql; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; using namespace dbtools; typedef connectivity::sdbcx::OCollection OCollection_TYPE; -sdbcx::ObjectType OViews::createObject(const OUString& _rName) +css::uno::Reference<css::beans::XPropertySet> OViews::createObject(const OUString& _rName) { OUString sCatalog, sSchema, sTable; ::dbtools::qualifiedNameComponents(m_xMetaData, _rName, sCatalog, sSchema, sTable, @@ -65,8 +62,8 @@ Reference<XPropertySet> OViews::createDescriptor() } // XAppend -sdbcx::ObjectType OViews::appendObject(const OUString& _rForName, - const Reference<XPropertySet>& descriptor) +css::uno::Reference<css::beans::XPropertySet> +OViews::appendObject(const OUString& _rForName, const Reference<XPropertySet>& descriptor) { createView(descriptor); return createObject(_rForName); @@ -83,7 +80,7 @@ void OViews::dropObject(sal_Int32 _nPos, const OUString& /*_sElementName*/) if (bIsNew) return; - OUString aSql("DROP VIEW"); + OUString aSql(u"DROP VIEW"_ustr); Reference<XPropertySet> xProp(xObject, UNO_QUERY); aSql += ::dbtools::composeTableName(m_xMetaData, xProp, @@ -106,7 +103,7 @@ void OViews::createView(const Reference<XPropertySet>& descriptor) { Reference<XConnection> xConnection = static_cast<OMySQLCatalog&>(m_rParent).getConnection(); - OUString aSql("CREATE VIEW "); + OUString aSql(u"CREATE VIEW "_ustr); OUString sCommand; aSql += ::dbtools::composeTableName(m_xMetaData, descriptor, diff --git a/connectivity/source/drivers/mysqlc/DataAccess.xcu b/connectivity/source/drivers/mysqlc/DataAccess.xcu deleted file mode 100644 index 2b652ec87649..000000000000 --- a/connectivity/source/drivers/mysqlc/DataAccess.xcu +++ /dev/null @@ -1,35 +0,0 @@ -<!-- - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - --> -<oor:node xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="DataAccess" oor:package="org.openoffice.Office"> - <node oor:name="UserDefinedDriverSettings"> - <node oor:name="org.openoffice.comp.connectivity.mysql_native.Driver" oor:op="replace"> - <prop oor:name="DriverName"> - <value>org.openoffice.comp.connectivity.mysql_native.Driver</value> - </prop> - <prop oor:name="DriverPageDisplayName"> - <value>MySQL native driver</value> - </prop> - <prop oor:name="DriverTypeDisplayName"> - <value>MySQL native driver</value> - </prop> - <prop oor:name="DriverDsnPrefix"> - <value>sdbc:mysqlc:</value> - </prop> - </node> - </node> -</oor:node> diff --git a/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx b/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx new file mode 100644 index 000000000000..dfe88d9b4b17 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_catalog.cxx @@ -0,0 +1,93 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_catalog.hxx" +#include "mysqlc_tables.hxx" +#include "mysqlc_views.hxx" +#include "mysqlc_users.hxx" +#include <com/sun/star/sdbc/XRow.hpp> +#include <comphelper/types.hxx> + +connectivity::mysqlc::Catalog::Catalog( + const css::uno::Reference<css::sdbc::XConnection>& rConnection) + : OCatalog(rConnection) + , m_xConnection(rConnection) +{ +} + +//----- OCatalog ------------------------------------------------------------- +void connectivity::mysqlc::Catalog::refreshTables() +{ + css::uno::Reference<css::sdbc::XResultSet> xTables + = m_xMetaData->getTables(css::uno::Any(), u"%"_ustr, u"%"_ustr, {}); + + if (!xTables.is()) + return; + + ::std::vector<OUString> aTableNames; + + fillNames(xTables, aTableNames); + + if (!m_pTables) + m_pTables.reset(new Tables(m_xConnection->getMetaData(), *this, m_aMutex, aTableNames)); + else + m_pTables->reFill(aTableNames); +} + +void connectivity::mysqlc::Catalog::refreshViews() +{ + css::uno::Reference<css::sdbc::XResultSet> xViews + = m_xMetaData->getTables(css::uno::Any(), u"%"_ustr, u"%"_ustr, { u"VIEW"_ustr }); + + if (!xViews.is()) + return; + + ::std::vector<OUString> aViewNames; + + fillNames(xViews, aViewNames); + + if (!m_pViews) + m_pViews.reset(new Views(m_xConnection, *this, m_aMutex, aViewNames)); + else + m_pViews->reFill(aViewNames); +} + +//----- IRefreshableGroups --------------------------------------------------- +void connectivity::mysqlc::Catalog::refreshGroups() +{ + // TODO: implement me +} + +//----- IRefreshableUsers ---------------------------------------------------- +void connectivity::mysqlc::Catalog::refreshUsers() +{ + css::uno::Reference<css::sdbc::XStatement> statement = m_xConnection->createStatement(); + css::uno::Reference<css::sdbc::XResultSet> xUsers = statement->executeQuery( + u"SELECT grantee FROM information_schema.user_privileges GROUP BY grantee"_ustr); + + if (!xUsers.is()) + return; + + ::std::vector<OUString> aUserNames; + + css::uno::Reference<css::sdbc::XRow> xRow(xUsers, css::uno::UNO_QUERY); + while (xUsers->next()) + { + aUserNames.push_back(xRow->getString(1)); + } + xRow.clear(); + ::comphelper::disposeComponent(xUsers); + + if (!m_pUsers) + m_pUsers.reset(new Users(m_xConnection->getMetaData(), *this, m_aMutex, aUserNames)); + else + m_pUsers->reFill(aUserNames); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_catalog.hxx b/connectivity/source/drivers/mysqlc/mysqlc_catalog.hxx new file mode 100644 index 000000000000..1bea18c7667b --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_catalog.hxx @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <sdbcx/VCatalog.hxx> + +namespace connectivity::mysqlc +{ +class Catalog : public ::connectivity::sdbcx::OCatalog +{ + css::uno::Reference<css::sdbc::XConnection> m_xConnection; + +public: + explicit Catalog(const css::uno::Reference<css::sdbc::XConnection>& rConnection); + + // OCatalog + virtual void refreshTables() override; + virtual void refreshViews() override; + + // IRefreshableGroups + virtual void refreshGroups() override; + + // IRefreshableUsers + virtual void refreshUsers() override; + + sdbcx::OCollection* getPrivateTables() const { return m_pTables.get(); } +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_column.cxx b/connectivity/source/drivers/mysqlc/mysqlc_column.cxx new file mode 100644 index 000000000000..953d4117c247 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_column.cxx @@ -0,0 +1,45 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_column.hxx" + +#include <TConnection.hxx> + +connectivity::mysqlc::Column::Column() + : OColumn(true) // case sensitive +{ + construct(); +} + +void connectivity::mysqlc::Column::construct() +{ + m_sAutoIncrement = "auto_increment"; + registerProperty( + OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_AUTOINCREMENTCREATION), + PROPERTY_ID_AUTOINCREMENTCREATION, 0, &m_sAutoIncrement, + cppu::UnoType<decltype(m_sAutoIncrement)>::get()); +} + +::cppu::IPropertyArrayHelper* + connectivity::mysqlc::Column::createArrayHelper(sal_Int32 /*_nId*/) const +{ + return doCreateArrayHelper(); +} + +::cppu::IPropertyArrayHelper& SAL_CALL connectivity::mysqlc::Column::getInfoHelper() +{ + return *Column_PROP::getArrayHelper(isNew() ? 1 : 0); +} + +css::uno::Sequence<OUString> SAL_CALL connectivity::mysqlc::Column::getSupportedServiceNames() +{ + return { u"com.sun.star.sdbcx.Column"_ustr }; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_column.hxx b/connectivity/source/drivers/mysqlc/mysqlc_column.hxx new file mode 100644 index 000000000000..f69ef1afcea7 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_column.hxx @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include <connectivity/sdbcx/VColumn.hxx> + +namespace connectivity::mysqlc +{ +class Column; +typedef ::comphelper::OIdPropertyArrayUsageHelper<Column> Column_PROP; +class Column : public sdbcx::OColumn, public Column_PROP +{ + OUString m_sAutoIncrement; + +protected: + virtual ::cppu::IPropertyArrayHelper* createArrayHelper(sal_Int32 _nId) const override; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper() override; + +public: + Column(); + virtual void construct() override; + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_columns.cxx b/connectivity/source/drivers/mysqlc/mysqlc_columns.cxx new file mode 100644 index 000000000000..b34b36b45cbe --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_columns.cxx @@ -0,0 +1,28 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_columns.hxx" +#include "mysqlc_column.hxx" + +connectivity::mysqlc::Columns::Columns(Table& rTable, osl::Mutex& rMutex, + const ::std::vector<OUString>& rVector) + : OColumnsHelper(rTable, + true, // case sensitivity + rMutex, rVector, + /*bUseHardRef*/ true) +{ + OColumnsHelper::setParent(&rTable); +} + +css::uno::Reference<css::beans::XPropertySet> connectivity::mysqlc::Columns::createDescriptor() +{ + return new Column; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_columns.hxx b/connectivity/source/drivers/mysqlc/mysqlc_columns.hxx new file mode 100644 index 000000000000..34230db37bb5 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_columns.hxx @@ -0,0 +1,29 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "mysqlc_table.hxx" + +#include <connectivity/TColumnsHelper.hxx> + +namespace connectivity::mysqlc +{ +class Columns : public ::connectivity::OColumnsHelper +{ +protected: + virtual css::uno::Reference<css::beans::XPropertySet> createDescriptor() override; + +public: + Columns(Table& rTable, ::osl::Mutex& rMutex, const ::std::vector<OUString>& _rVector); +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx b/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx index 4cf9e916f3df..631208f70293 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_connection.cxx @@ -17,8 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include "mysqlc_catalog.hxx" #include "mysqlc_connection.hxx" #include "mysqlc_databasemetadata.hxx" +#include <com/sun/star/sdbc/SQLException.hpp> #include "mysqlc_driver.hxx" #include "mysqlc_statement.hxx" @@ -27,20 +29,17 @@ #include <com/sun/star/beans/NamedValue.hpp> -#include <osl/diagnose.h> -#include <cppuhelper/supportsservice.hxx> +#include <comphelper/servicehelper.hxx> using namespace connectivity::mysqlc; using namespace com::sun::star::uno; using namespace com::sun::star::container; -using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; using ::osl::MutexGuard; -#define MYSQLC_URI_PREFIX "sdbc:mysqlc:" - namespace { void lcl_executeUpdate(MYSQL* pMySql, const OString& sql) @@ -53,6 +52,7 @@ void lcl_executeUpdate(MYSQL* pMySql, const OString& sql) OConnection::OConnection(MysqlCDriver& _rDriver) : OMetaConnection_BASE(m_aMutex) , m_mysql() + , m_xCatalog(nullptr) , m_xMetaData(nullptr) , m_xDriver(&_rDriver) { @@ -73,15 +73,12 @@ void OConnection::construct(const OUString& url, const Sequence<PropertyValue>& mysql_library_init(0, nullptr, nullptr); mysql_init(&m_mysql); - // use TCP as connection - mysql_protocol_type protocol = MYSQL_PROTOCOL_TCP; - mysql_options(&m_mysql, MYSQL_OPT_PROTOCOL, &protocol); - OString charset_name{ "utf8mb4" }; + OString charset_name{ "utf8mb4"_ostr }; mysql_options(&m_mysql, MYSQL_SET_CHARSET_NAME, charset_name.getStr()); sal_Int32 nIndex; OUString token; - OUString aHostName("localhost"); + OUString aHostName(u"localhost"_ustr); sal_Int32 nPort = 3306; OUString aDbName; @@ -90,7 +87,7 @@ void OConnection::construct(const OUString& url, const Sequence<PropertyValue>& // parse url. Url has the following format: // external server: sdbc:mysqlc:[hostname]:[port]/[dbname] - if (url.startsWith(MYSQLC_URI_PREFIX)) + if (url.startsWith("sdbc:mysqlc:")) { nIndex = 12; } @@ -164,15 +161,22 @@ void OConnection::construct(const OUString& url, const Sequence<PropertyValue>& OString pass_str = OUStringToOString(aPass, m_settings.encoding); OString schema_str = OUStringToOString(aDbName, m_settings.encoding); OString socket_str; + + // use TCP as connection by default + mysql_protocol_type protocol = MYSQL_PROTOCOL_TCP; if (unixSocketPassed) { socket_str = OUStringToOString(sUnixSocket, m_settings.encoding); + protocol = MYSQL_PROTOCOL_SOCKET; } else if (namedPipePassed) { socket_str = OUStringToOString(sNamedPipe, m_settings.encoding); + protocol = MYSQL_PROTOCOL_PIPE; } + mysql_options(&m_mysql, MYSQL_OPT_PROTOCOL, &protocol); + // flags can also be passed as last parameter if (!mysql_real_connect(&m_mysql, host_str.getStr(), user_str.getStr(), pass_str.getStr(), schema_str.getStr(), nPort, socket_str.getStr(), @@ -184,23 +188,22 @@ void OConnection::construct(const OUString& url, const Sequence<PropertyValue>& // Check if the server is 4.1 or above if (getMysqlVersion() < 40100) { - throw SQLException("MariaDB LibreOffice Connector requires MySQL Server 4.1 or above", + throw SQLException(u"MariaDB LibreOffice Connector requires MySQL Server 4.1 or above"_ustr, *this, OUString(), 0, Any()); } - lcl_executeUpdate(&m_mysql, - OString{ "SET session sql_mode='ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO'" }); - lcl_executeUpdate(&m_mysql, OString{ "SET NAMES utf8mb4" }); + lcl_executeUpdate(&m_mysql, "SET session sql_mode='ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO'"_ostr); + lcl_executeUpdate(&m_mysql, "SET NAMES utf8mb4"_ostr); } OUString OConnection::getImplementationName() { - return "com.sun.star.sdbc.drivers.mysqlc.OConnection"; + return u"com.sun.star.sdbc.drivers.mysqlc.OConnection"_ustr; } css::uno::Sequence<OUString> OConnection::getSupportedServiceNames() { - return { "com.sun.star.sdbc.Connection" }; + return { u"com.sun.star.sdbc.Connection"_ustr }; } sal_Bool OConnection::supportsService(OUString const& ServiceName) @@ -215,8 +218,8 @@ Reference<XStatement> SAL_CALL OConnection::createStatement() // create a statement // the statement can only be executed once - Reference<XStatement> xReturn = new OStatement(this); - m_aStatements.push_back(WeakReferenceHelper(xReturn)); + rtl::Reference<OStatement> xReturn = new OStatement(this); + m_aStatements.push_back(xReturn.get()); return xReturn; } @@ -237,8 +240,8 @@ Reference<XPreparedStatement> SAL_CALL OConnection::prepareStatement(const OUStr mysql_sqlstate(&m_mysql), nErrorNum, *this, getConnectionEncoding()); - Reference<XPreparedStatement> xStatement = new OPreparedStatement(this, pStmt); - m_aStatements.push_back(WeakReferenceHelper(xStatement)); + rtl::Reference<OPreparedStatement> xStatement = new OPreparedStatement(this, pStmt); + m_aStatements.push_back(xStatement.get()); return xStatement; } @@ -253,8 +256,6 @@ Reference<XPreparedStatement> SAL_CALL OConnection::prepareCall(const OUString& OUString SAL_CALL OConnection::nativeSQL(const OUString& /*_sSql*/) { - MutexGuard aGuard(m_aMutex); - // const OUString sSqlStatement = transFormPreparedStatement( _sSql ); // TODO return OUString(); @@ -431,7 +432,7 @@ void OConnection::disposing() for (auto const& statement : m_aStatements) { - Reference<XComponent> xComp(statement.get(), UNO_QUERY); + rtl::Reference<OCommonStatement> xComp(statement.get()); if (xComp.is()) { xComp->dispose(); @@ -461,11 +462,11 @@ OUString OConnection::transFormPreparedStatement(const OUString& _sSQL) try { Reference<XConnection> xCon = this; - Sequence<Any> aArgs{ Any(NamedValue("ActiveConnection", makeAny(xCon))) }; + Sequence<Any> aArgs{ Any(NamedValue(u"ActiveConnection"_ustr, Any(xCon))) }; m_xParameterSubstitution.set( m_xDriver->getFactory()->createInstanceWithArguments( - "org.openoffice.comp.helper.ParameterSubstitution", aArgs), + u"org.openoffice.comp.helper.ParameterSubstitution"_ustr, aArgs), UNO_QUERY); } catch (const Exception&) @@ -485,4 +486,36 @@ OUString OConnection::transFormPreparedStatement(const OUString& _sSQL) return sSqlStatement; } +//----- XUnoTunnel ---------------------------------------------------------- +// virtual +sal_Int64 SAL_CALL OConnection::getSomething(const css::uno::Sequence<sal_Int8>& rId) +{ + return comphelper::getSomethingImpl(rId, this); +} + +// static +const Sequence<sal_Int8>& OConnection::getUnoTunnelId() +{ + static const comphelper::UnoIdInit implId; + return implId.getSeq(); +} + +Reference<XTablesSupplier> OConnection::createCatalog() +{ + MutexGuard aGuard(m_aMutex); + + // m_xCatalog is a weak reference. Reuse it if it still exists. + Reference<XTablesSupplier> xCatalog = m_xCatalog; + if (xCatalog.is()) + { + return xCatalog; + } + else + { + xCatalog = new Catalog(this); + m_xCatalog = xCatalog; + return m_xCatalog; + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx b/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx index c75be4724654..dd7138fff464 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_connection.hxx @@ -24,21 +24,20 @@ #include "mysqlc_types.hxx" #include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/lang/DisposedException.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XUnoTunnel.hpp> -#include <com/sun/star/sdbc/ColumnSearch.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> -#include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/SQLWarning.hpp> #include <com/sun/star/sdbc/XConnection.hpp> #include <com/sun/star/sdbc/XWarningsSupplier.hpp> #include <com/sun/star/util/XStringSubstitution.hpp> -#include <cppuhelper/compbase3.hxx> -#include <cppuhelper/weakref.hxx> -#include <rtl/string.hxx> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> + +#include <cppuhelper/basemutex.hxx> +#include <cppuhelper/compbase.hxx> #include <rtl/ref.hxx> +#include <unotools/weakref.hxx> #include <mysql.h> @@ -56,12 +55,10 @@ class ODatabaseMetaData; namespace mysqlc { -using ::com::sun::star::sdbc::SQLException; -using ::com::sun::star::sdbc::SQLWarning; -using ::com::sun::star::uno::RuntimeException; +class OCommonStatement; -typedef ::cppu::WeakComponentImplHelper3<css::sdbc::XConnection, css::sdbc::XWarningsSupplier, - css::lang::XServiceInfo> +typedef ::cppu::WeakComponentImplHelper<css::sdbc::XConnection, css::sdbc::XWarningsSupplier, + css::lang::XUnoTunnel, css::lang::XServiceInfo> OMetaConnection_BASE; struct ConnectionSettings @@ -80,9 +77,7 @@ class MysqlCDriver; typedef OMetaConnection_BASE OConnection_BASE; -typedef std::vector<css::uno::WeakReferenceHelper> OWeakRefArray; - -class OConnection final : public OBase_Mutex, public OConnection_BASE +class OConnection final : public cppu::BaseMutex, public OConnection_BASE { private: MYSQL m_mysql; @@ -92,11 +87,11 @@ private: // Data attributes + css::uno::WeakReference<css::sdbcx::XTablesSupplier> m_xCatalog; css::uno::WeakReference<css::sdbc::XDatabaseMetaData> m_xMetaData; - OWeakRefArray m_aStatements; // vector containing a list - // of all the Statement objects - // for this Connection + // vector containing a list of all the Statement objects for this Connection. + std::vector<unotools::WeakReference<OCommonStatement>> m_aStatements; rtl::Reference<MysqlCDriver> m_xDriver; // Pointer to the owning driver object public: @@ -114,6 +109,12 @@ public: rtl_TextEncoding getConnectionEncoding() const { return m_settings.encoding; } + /** + * Create and/or connect to the sdbcx Catalog. This is completely + * unrelated to the SQL "Catalog". + */ + css::uno::Reference<css::sdbcx::XTablesSupplier> createCatalog(); + // OComponentHelper virtual void SAL_CALL disposing() override; @@ -124,6 +125,10 @@ public: virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + // XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence<sal_Int8>& rId) override; + static const css::uno::Sequence<sal_Int8>& getUnoTunnelId(); + // XConnection css::uno::Reference<css::sdbc::XStatement> SAL_CALL createStatement() override; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx index a96d70f3461e..c3c073f276b2 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.cxx @@ -22,6 +22,7 @@ #include <com/sun/star/sdbc/Deferrability.hpp> #include <com/sun/star/lang/XInitialization.hpp> #include <comphelper/sequence.hxx> +#include <o3tl/string_view.hxx> #include <sal/log.hxx> #include <rtl/ustrbuf.hxx> @@ -32,7 +33,6 @@ using namespace connectivity::mysqlc; using namespace com::sun::star::uno; using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; static std::string wild("%"); @@ -158,11 +158,11 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getMaxIndexLength() { return 256; } sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns() { return true; } -OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { return "n/a"; } +OUString SAL_CALL ODatabaseMetaData::getCatalogTerm() { return u"n/a"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return "\""; } +OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString() { return u"`"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { return "#@"; } +OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters() { return u"#@"_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames() { return true; } @@ -349,7 +349,7 @@ OUString SAL_CALL ODatabaseMetaData::getURL() OUString SAL_CALL ODatabaseMetaData::getUserName() { Reference<XStatement> statement = m_rConnection.createStatement(); - Reference<XResultSet> rs = statement->executeQuery("select user()"); + Reference<XResultSet> rs = statement->executeQuery(u"select user()"_ustr); Reference<XRow> xRow(rs, UNO_QUERY_THROW); (void)rs->next(); // the first and only result // e.g. root@localhost @@ -363,9 +363,9 @@ OUString SAL_CALL ODatabaseMetaData::getUserName() return userWithConnection; } -OUString SAL_CALL ODatabaseMetaData::getDriverName() { return "MySQL Connector/OO.org"; } +OUString SAL_CALL ODatabaseMetaData::getDriverName() { return u"MySQL Connector/OO.org"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getDriverVersion() { return "0.9.2"; } +OUString SAL_CALL ODatabaseMetaData::getDriverVersion() { return u"0.9.2"_ustr; } OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion() { @@ -373,11 +373,11 @@ OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion() m_rConnection.getConnectionEncoding()); } -OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName() { return "MySQL"; } +OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName() { return u"MySQL"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getProcedureTerm() { return "procedure"; } +OUString SAL_CALL ODatabaseMetaData::getProcedureTerm() { return u"procedure"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getSchemaTerm() { return "database"; } +OUString SAL_CALL ODatabaseMetaData::getSchemaTerm() { return u"database"_ustr; } sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion() { @@ -400,7 +400,7 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion() OUString SAL_CALL ODatabaseMetaData::getSQLKeywords() { - return "ACCESSIBLE, ADD, ALL," + return u"ACCESSIBLE, ADD, ALL," "ALTER, ANALYZE, AND, AS, ASC, ASENSITIVE, BEFORE," "BETWEEN, BIGINT, BINARY, BLOB, BOTH, BY, CALL," "CASCADE, CASE, CHANGE, CHAR, CHARACTER, CHECK," @@ -442,43 +442,43 @@ OUString SAL_CALL ODatabaseMetaData::getSQLKeywords() "VARCHARACTER, VARYING, WHEN, WHERE, WHILE, WITH," "WRITE, X509, XOR, YEAR_MONTH, ZEROFILL" "GENERAL, IGNORE_SERVER_IDS, MASTER_HEARTBEAT_PERIOD," - "MAXVALUE, RESIGNAL, SIGNAL, SLOW"; + "MAXVALUE, RESIGNAL, SIGNAL, SLOW"_ustr; } -OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape() { return "\\"; } +OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape() { return u"\\"_ustr; } OUString SAL_CALL ODatabaseMetaData::getStringFunctions() { - return "ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT," + return u"ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT," "CONCAT_WS,CONV,ELT,EXPORT_SET,FIELD,FIND_IN_SET,HEX,INSERT," "INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LOCATE,LOWER,LPAD," "LTRIM,MAKE_SET,MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION," "QUOTE,REPEAT,REPLACE,REVERSE,RIGHT,RPAD,RTRIM,SOUNDEX," "SPACE,STRCMP,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING," - "SUBSTRING_INDEX,TRIM,UCASE,UPPER"; + "SUBSTRING_INDEX,TRIM,UCASE,UPPER"_ustr; } OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions() { - return "DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME," + return u"DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME," "MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,PERIOD_ADD," "PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT," "CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE," "CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME," - "SEC_TO_TIME,TIME_TO_SEC"; + "SEC_TO_TIME,TIME_TO_SEC"_ustr; } OUString SAL_CALL ODatabaseMetaData::getSystemFunctions() { - return "DATABASE,USER,SYSTEM_USER," - "SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION"; + return u"DATABASE,USER,SYSTEM_USER," + "SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION"_ustr; } OUString SAL_CALL ODatabaseMetaData::getNumericFunctions() { - return "ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS," + return u"ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS," "COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX,MIN,MOD,PI,POW," - "POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE"; + "POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE"_ustr; } sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar() { return false; } @@ -553,9 +553,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes() const char* const table_types[] = { "TABLE", "VIEW" }; sal_Int32 const requiredVersion[] = { 0, 50000 }; - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; rtl_TextEncoding encoding = m_rConnection.getConnectionEncoding(); @@ -564,7 +565,7 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes() if (m_rConnection.getMysqlVersion() >= requiredVersion[i]) { rRows.push_back( - { { Any(), makeAny(mysqlc_sdbc_driver::convert(table_types[i], encoding)) } }); + { { Any(), Any(mysqlc_sdbc_driver::convert(table_types[i], encoding)) } }); } } lcl_setRows_throw(xResultSet, 5, rRows); @@ -573,9 +574,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTableTypes() Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo() { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; @@ -584,17 +586,17 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo() while (mysqlc_types[i].typeName) { rRows.push_back( - { { Any(), makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].typeName, encoding)), - makeAny(mysqlc_types[i].dataType), makeAny(mysqlc_types[i].precision), - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalPrefix, encoding)), - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalSuffix, encoding)), - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].createParams, encoding)), - makeAny(mysqlc_types[i].nullable), makeAny(mysqlc_types[i].caseSensitive), - makeAny(mysqlc_types[i].searchable), makeAny(mysqlc_types[i].isUnsigned), - makeAny(mysqlc_types[i].fixedPrecScale), makeAny(mysqlc_types[i].autoIncrement), - makeAny(mysqlc_sdbc_driver::convert(mysqlc_types[i].localTypeName, encoding)), - makeAny(mysqlc_types[i].minScale), makeAny(mysqlc_types[i].maxScale), - makeAny(sal_Int32(0)), makeAny(sal_Int32(0)), makeAny(sal_Int32(10)) } }); + { { Any(), Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].typeName, encoding)), + Any(mysqlc_types[i].dataType), Any(mysqlc_types[i].precision), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalPrefix, encoding)), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].literalSuffix, encoding)), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].createParams, encoding)), + Any(mysqlc_types[i].nullable), Any(mysqlc_types[i].caseSensitive), + Any(mysqlc_types[i].searchable), Any(mysqlc_types[i].isUnsigned), + Any(mysqlc_types[i].fixedPrecScale), Any(mysqlc_types[i].autoIncrement), + Any(mysqlc_sdbc_driver::convert(mysqlc_types[i].localTypeName, encoding)), + Any(mysqlc_types[i].minScale), Any(mysqlc_types[i].maxScale), Any(sal_Int32(0)), + Any(sal_Int32(0)), Any(sal_Int32(10)) } }); i++; } @@ -605,27 +607,26 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTypeInfo() Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCatalogs() { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); return xResultSet; } Reference<XResultSet> SAL_CALL ODatabaseMetaData::getSchemas() { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; - OUString sSql - = m_rConnection.getMysqlVersion() > 49999 - ? OUString{ "SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG " - "FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY SCHEMA_NAME" } - : OUString{ "SHOW DATABASES" }; - Reference<XStatement> statement = m_rConnection.createStatement(); - Reference<XInterface> executed = statement->executeQuery(sSql); + Reference<XInterface> executed = statement->executeQuery( + u"SELECT SCHEMA_NAME AS TABLE_SCHEM, CATALOG_NAME AS TABLE_CATALOG FROM INFORMATION_SCHEMA.SCHEMATA \ + WHERE SCHEMA_NAME NOT IN ('information_schema', 'mysql', 'performance_schema') \ + ORDER BY SCHEMA_NAME"_ustr); Reference<XResultSet> rs(executed, UNO_QUERY_THROW); Reference<XResultSetMetaDataSupplier> supp(executed, UNO_QUERY_THROW); Reference<XResultSetMetaData> rs_meta = supp->getMetaData(); @@ -635,20 +636,12 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getSchemas() while (rs->next()) { std::vector<Any> aRow{ Any() }; - bool informationSchema = false; for (sal_uInt32 i = 1; i <= columns; i++) { OUString columnStringValue = xRow->getString(i); - if (i == 1) - { // TABLE_SCHEM - informationSchema = columnStringValue.equalsIgnoreAsciiCase("information_schema"); - } - aRow.push_back(makeAny(columnStringValue)); - } - if (!informationSchema) - { - rRows.push_back(aRow); + aRow.push_back(Any(columnStringValue)); } + rRows.push_back(aRow); } lcl_setRows_throw(xResultSet, 1, rRows); @@ -660,12 +653,12 @@ Reference<XResultSet> const OUString& table, const OUString& columnNamePattern) { - OUString query("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS " + OUString query(u"SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS " "TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, NULL AS GRANTOR, " "GRANTEE, PRIVILEGE_TYPE AS PRIVILEGE, IS_GRANTABLE FROM " "INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE TABLE_SCHEMA LIKE " "'?' AND TABLE_NAME='?' AND COLUMN_NAME LIKE '?' ORDER BY " - "COLUMN_NAME, PRIVILEGE_TYPE"); + "COLUMN_NAME, PRIVILEGE_TYPE"_ustr); query = query.replaceFirst("?", schema); query = query.replaceFirst("?", table); @@ -734,34 +727,35 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getColumns(const Any& /*catalo Reference<XResultSet> rs = statement->executeQuery(query); Reference<XRow> xRow(rs, UNO_QUERY_THROW); - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> aRows; while (rs->next()) { std::vector<Any> aRow{ Any() }; // 0. element is unused // catalog name - aRow.push_back(makeAny(xRow->getString(1))); + aRow.emplace_back(xRow->getString(1)); // schema name - aRow.push_back(makeAny(xRow->getString(2))); + aRow.emplace_back(xRow->getString(2)); // table name - aRow.push_back(makeAny(xRow->getString(3))); + aRow.emplace_back(xRow->getString(3)); // column name - aRow.push_back(makeAny(xRow->getString(4))); + aRow.emplace_back(xRow->getString(4)); // data type OUString sDataType = xRow->getString(5); - aRow.push_back(makeAny(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType))); + aRow.emplace_back(mysqlc_sdbc_driver::mysqlStrToOOOType(sDataType)); // type name - aRow.push_back(makeAny(sDataType)); // TODO + aRow.emplace_back(sDataType); // TODO // column size sal_Int32 nColumnSize = 0; OUString sColumnType = xRow->getString(14); sal_Int32 nCharMaxLen = xRow->getShort(6); bool bIsCharMax = !xRow->wasNull(); if (sDataType.equalsIgnoreAsciiCase("year")) - nColumnSize = sColumnType.copy(6, 1).toInt32(); // 'year(' length is 5 + nColumnSize = o3tl::toInt32(sColumnType.subView(6, 1)); // 'year(' length is 5 else if (sDataType.equalsIgnoreAsciiCase("date")) nColumnSize = 10; else if (sDataType.equalsIgnoreAsciiCase("time")) @@ -773,34 +767,34 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getColumns(const Any& /*catalo nColumnSize = xRow->getShort(7); // numeric precision else nColumnSize = nCharMaxLen; - aRow.push_back(makeAny(nColumnSize)); - aRow.push_back(Any()); // buffer length - unused + aRow.emplace_back(nColumnSize); + aRow.emplace_back(); // buffer length - unused // decimal digits (scale) - aRow.push_back(makeAny(xRow->getShort(8))); + aRow.emplace_back(xRow->getShort(8)); // num_prec_radix - aRow.push_back(makeAny(sal_Int32(10))); + aRow.emplace_back(sal_Int32(10)); // nullable OUString sIsNullable = xRow->getString(13); if (xRow->wasNull()) - aRow.push_back(makeAny(ColumnValue::NULLABLE_UNKNOWN)); + aRow.emplace_back(ColumnValue::NULLABLE_UNKNOWN); else if (sIsNullable.equalsIgnoreAsciiCase("YES")) - aRow.push_back(makeAny(ColumnValue::NULLABLE)); + aRow.emplace_back(ColumnValue::NULLABLE); else - aRow.push_back(makeAny(ColumnValue::NO_NULLS)); + aRow.emplace_back(ColumnValue::NO_NULLS); // remarks - aRow.push_back(makeAny(xRow->getString(9))); + aRow.emplace_back(xRow->getString(9)); // default - aRow.push_back(makeAny(xRow->getString(10))); + aRow.emplace_back(xRow->getString(10)); - aRow.push_back(Any{}); // sql_data_type - unused - aRow.push_back(Any{}); // sql_datetime_sub - unused + aRow.emplace_back(); // sql_data_type - unused + aRow.emplace_back(); // sql_datetime_sub - unused // character octet length - aRow.push_back(makeAny(xRow->getString(11))); + aRow.emplace_back(xRow->getString(11)); // ordinal position - aRow.push_back(makeAny(xRow->getString(12))); + aRow.emplace_back(xRow->getString(12)); // is nullable - aRow.push_back(makeAny(sIsNullable)); + aRow.emplace_back(sIsNullable); aRows.push_back(aRow); } lcl_setRows_throw(xResultSet, 1, aRows); @@ -816,25 +810,20 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTables(const Any& /*catalog "SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS TABLE_SCHEM, TABLE_NAME," "IF(STRCMP(TABLE_TYPE,'BASE TABLE'), TABLE_TYPE, 'TABLE') AS TABLE_TYPE, TABLE_COMMENT AS " "REMARKS " - "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' " + "FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema', 'mysql', " + "'performance_schema') AND TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' " }; if (types.getLength() == 1) { - buffer.append("AND TABLE_TYPE LIKE '"); - buffer.append(types[0]); - buffer.append("'"); + buffer.append("AND TABLE_TYPE LIKE '" + types[0] + "'"); } else if (types.getLength() > 1) { - buffer.append("AND (TABLE_TYPE LIKE '"); - buffer.append(types[0]); - buffer.append("'"); + buffer.append("AND (TABLE_TYPE LIKE '" + types[0] + "'"); for (sal_Int32 i = 1; i < types.getLength(); ++i) { - buffer.append(" OR TABLE_TYPE LIKE '"); - buffer.append(types[i]); - buffer.append("'"); + buffer.append(" OR TABLE_TYPE LIKE '" + types[i] + "'"); } buffer.append(")"); } @@ -865,9 +854,10 @@ Reference<XResultSet> const OUString& /*schemaPattern*/, const OUString& /*procedureNamePattern*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO IMPL SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -879,9 +869,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getVersionColumns(const Any& / const OUString& /* schema */, const OUString& /* table */) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; lcl_setRows_throw(xResultSet, 16, rRows); return xResultSet; @@ -891,9 +882,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getExportedKeys(const Any& /*c const OUString& /*schema */, const OUString& /*table */) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO implement SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -905,11 +897,12 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c const OUString& schema, const OUString& table) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); - OUString query("SELECT refi.CONSTRAINT_CATALOG," // 1: foreign catalog + OUString query(u"SELECT refi.CONSTRAINT_CATALOG," // 1: foreign catalog " k.COLUMN_NAME," // 2: foreign column name " refi.UNIQUE_CONSTRAINT_CATALOG," // 3: primary catalog FIXME " k.REFERENCED_TABLE_SCHEMA," // 4: primary schema @@ -924,7 +917,7 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c "refi.CONSTRAINT_NAME " " and k.TABLE_NAME = refi.TABLE_NAME " " WHERE k.REFERENCED_TABLE_SCHEMA LIKE " - "'?' AND refi.TABLE_NAME='?'"); + "'?' AND refi.TABLE_NAME='?'"_ustr); query = query.replaceFirst("?", schema); // TODO what if schema is NULL? query = query.replaceFirst("?", table); @@ -938,34 +931,34 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getImportedKeys(const Any& /*c std::vector<Any> aRow{ Any() }; // 0. element is unused // primary key catalog - aRow.push_back(makeAny(xRow->getString(3))); + aRow.push_back(Any(xRow->getString(3))); // primary key schema - aRow.push_back(makeAny(xRow->getString(4))); + aRow.push_back(Any(xRow->getString(4))); // primary key table - aRow.push_back(makeAny(xRow->getString(5))); + aRow.push_back(Any(xRow->getString(5))); // primary column name - aRow.push_back(makeAny(xRow->getString(6))); + aRow.push_back(Any(xRow->getString(6))); // fk table catalog - aRow.push_back(makeAny(xRow->getString(1))); + aRow.push_back(Any(xRow->getString(1))); // fk schema - aRow.push_back(makeAny(xRow->getString(11))); + aRow.push_back(Any(xRow->getString(11))); // fk table - aRow.push_back(makeAny(xRow->getString(10))); + aRow.push_back(Any(xRow->getString(10))); // fk column name - aRow.push_back(makeAny(xRow->getString(2))); + aRow.push_back(Any(xRow->getString(2))); // KEY_SEQ - aRow.push_back(makeAny(sal_Int32{ 0 })); // TODO + aRow.push_back(Any(sal_Int32{ 0 })); // TODO // update rule - aRow.push_back(makeAny(xRow->getShort(7))); + aRow.push_back(Any(xRow->getShort(7))); // delete rule - aRow.push_back(makeAny(xRow->getShort(8))); + aRow.push_back(Any(xRow->getShort(8))); // foreign key name - aRow.push_back(makeAny(xRow->getString(9))); + aRow.push_back(Any(xRow->getString(9))); // primary key name - aRow.push_back(makeAny(OUString{})); // TODO + aRow.push_back(Any(OUString{})); // TODO // deferrability - aRow.push_back(makeAny(Deferrability::NONE)); + aRow.push_back(Any(Deferrability::NONE)); aRows.push_back(aRow); } lcl_setRows_throw(xResultSet, 1, aRows); @@ -976,12 +969,12 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getPrimaryKeys(const Any& /*ca const OUString& schema, const OUString& table) { - OUString query("SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA " + OUString query(u"SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA " "AS TABLE_SCHEM, TABLE_NAME, " "COLUMN_NAME, SEQ_IN_INDEX AS KEY_SEQ," "INDEX_NAME AS PK_NAME FROM INFORMATION_SCHEMA.STATISTICS " "WHERE TABLE_SCHEMA LIKE '?' AND TABLE_NAME LIKE '?' AND INDEX_NAME='PRIMARY' " - "ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX"); + "ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX"_ustr); // TODO use prepared stmt instead // TODO escape schema, table name ? @@ -999,9 +992,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getIndexInfo(const Any& /*cata sal_Bool /*unique*/, sal_Bool /*approximate*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -1015,9 +1009,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getBestRowIdentifier(const Any sal_Int32 /*scope*/, sal_Bool /*nullable*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO SAL_WARN("connectivity.mysqlc", "method not implemented"); @@ -1026,11 +1021,23 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getBestRowIdentifier(const Any } Reference<XResultSet> SAL_CALL ODatabaseMetaData::getTablePrivileges( - const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& /*tableNamePattern*/) + const Any& /* catalog */, const OUString& schemaPattern, const OUString& tableNamePattern) { - // TODO - SAL_WARN("connectivity.mysqlc", "method not implemented"); - throw SQLException("getTablePrivileges method not implemented", *this, "IM001", 0, Any()); + OUString query(u"SELECT TABLE_SCHEMA TABLE_CAT, " + "NULL TABLE_SCHEM, " + "TABLE_NAME, " + "NULL GRANTOR," + "GRANTEE, " + "PRIVILEGE_TYPE PRIVILEGE, " + "IS_GRANTABLE " + "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES " + "WHERE TABLE_SCHEMA LIKE '?' " + "AND TABLE_NAME='?'"_ustr); + query = query.replaceFirst("?", schemaPattern); + query = query.replaceFirst("?", tableNamePattern); + Reference<XStatement> statement = m_rConnection.createStatement(); + Reference<XResultSet> rs = statement->executeQuery(query); + return rs; } Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCrossReference( @@ -1038,9 +1045,10 @@ Reference<XResultSet> SAL_CALL ODatabaseMetaData::getCrossReference( const OUString& /*primaryTable_*/, const Any& /*foreignCatalog*/, const OUString& /*foreignSchema*/, const OUString& /*foreignTable*/) { - Reference<XResultSet> xResultSet(getOwnConnection().getDriver().getFactory()->createInstance( - "org.openoffice.comp.helper.DatabaseMetaDataResultSet"), - UNO_QUERY); + Reference<XResultSet> xResultSet( + getOwnConnection().getDriver().getFactory()->createInstance( + u"org.openoffice.comp.helper.DatabaseMetaDataResultSet"_ustr), + UNO_QUERY); std::vector<std::vector<Any>> rRows; // TODO SAL_WARN("connectivity.mysqlc", "method not implemented"); diff --git a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx index b56a460e0843..caed92f20e80 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_databasemetadata.hxx @@ -177,7 +177,7 @@ public: css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getSchemas() override; css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getCatalogs() override; css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getTableTypes() override; - css::uno::Reference<css::sdbc::XResultSet> + virtual css::uno::Reference<css::sdbc::XResultSet> SAL_CALL getColumns(const Any& catalog, const OUString& schemaPattern, const OUString& tableNamePattern, const OUString& columnNamePattern) override; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx b/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx index 5e5b83625e90..e8b1d5c0cf70 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_driver.cxx @@ -18,15 +18,16 @@ */ #include "mysqlc_driver.hxx" #include "mysqlc_connection.hxx" +#include <cppuhelper/supportsservice.hxx> +#include <comphelper/servicehelper.hxx> using namespace css::uno; using namespace css::lang; using namespace css::beans; using namespace css::sdbc; +using namespace css::sdbcx; using namespace connectivity::mysqlc; -#include <cppuhelper/supportsservice.hxx> - MysqlCDriver::MysqlCDriver(const Reference<XMultiServiceFactory>& _rxFactory) : ODriver_BASE(m_aMutex) , m_xFactory(_rxFactory) @@ -40,7 +41,7 @@ void MysqlCDriver::disposing() // when driver will be destroyed so all our connections have to be destroyed as well for (auto const& connection : m_xConnections) { - Reference<XComponent> xComp(connection.get(), UNO_QUERY); + rtl::Reference<OConnection> xComp(connection); if (xComp.is()) { xComp->dispose(); @@ -54,12 +55,12 @@ void MysqlCDriver::disposing() // static ServiceInfo OUString MysqlCDriver::getImplementationName_Static() { - return "com.sun.star.comp.sdbc.mysqlc.MysqlCDriver"; + return u"com.sun.star.comp.sdbc.mysqlc.MysqlCDriver"_ustr; } Sequence<OUString> MysqlCDriver::getSupportedServiceNames_Static() { - return { "com.sun.star.sdbc.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr, u"com.sun.star.sdbcx.Driver"_ustr }; } OUString SAL_CALL MysqlCDriver::getImplementationName() { return getImplementationName_Static(); } @@ -84,12 +85,11 @@ Reference<XConnection> SAL_CALL MysqlCDriver::connect(const OUString& url, return nullptr; } - Reference<XConnection> xConn; // create a new connection with the given properties and append it to our vector rtl::Reference<OConnection> pCon = new OConnection(*this); pCon->construct(url, info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon); return pCon; } @@ -103,8 +103,8 @@ MysqlCDriver::getPropertyInfo(const OUString& url, const Sequence<PropertyValue> { if (acceptsURL(url)) { - return { { "Hostname", "Name of host", true, "localhost", {} }, - { "Port", "Port", true, "3306", {} } }; + return { { u"Hostname"_ustr, u"Name of host"_ustr, true, u"localhost"_ustr, {} }, + { u"Port"_ustr, u"Port"_ustr, true, u"3306"_ustr, {} } }; } return Sequence<DriverPropertyInfo>(); @@ -114,6 +114,21 @@ sal_Int32 SAL_CALL MysqlCDriver::getMajorVersion() { return MARIADBC_VERSION_MAJ sal_Int32 SAL_CALL MysqlCDriver::getMinorVersion() { return MARIADBC_VERSION_MINOR; } +Reference<XTablesSupplier> + SAL_CALL MysqlCDriver::getDataDefinitionByConnection(const Reference<XConnection>& rConnection) +{ + if (OConnection* pConnection = comphelper::getFromUnoTunnel<OConnection>(rConnection)) + return pConnection->createCatalog(); + return {}; +} + +Reference<XTablesSupplier> SAL_CALL +MysqlCDriver::getDataDefinitionByURL(const OUString& rURL, const Sequence<PropertyValue>& rInfo) +{ + Reference<XConnection> xConnection = connect(rURL, rInfo); + return getDataDefinitionByConnection(xConnection); +} + namespace connectivity::mysqlc { Reference<XInterface> MysqlCDriver_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory) diff --git a/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx b/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx index fec80288b59a..5479132a4cf6 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_driver.hxx @@ -21,24 +21,21 @@ #include "mysqlc_connection.hxx" #include <com/sun/star/sdbc/XDriver.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> - -#include <cppuhelper/compbase2.hxx> -#include <osl/module.h> +#include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp> +#include <cppuhelper/compbase.hxx> namespace connectivity::mysqlc { -using css::sdbc::SQLException; -using css::uno::Exception; using css::uno::Reference; -using css::uno::RuntimeException; using css::uno::Sequence; Reference<css::uno::XInterface> MysqlCDriver_CreateInstance(const Reference<css::lang::XMultiServiceFactory>& _rxFactory); -typedef ::cppu::WeakComponentImplHelper2<css::sdbc::XDriver, css::lang::XServiceInfo> ODriver_BASE; +typedef ::cppu::WeakComponentImplHelper<css::sdbc::XDriver, css::sdbcx::XDataDefinitionSupplier, + css::lang::XServiceInfo> + ODriver_BASE; typedef void* (*OMysqlCConnection_CreateInstanceFunction)(void* _pDriver); @@ -47,13 +44,9 @@ class MysqlCDriver : public ODriver_BASE protected: Reference<css::lang::XMultiServiceFactory> m_xFactory; ::osl::Mutex m_aMutex; // mutex is need to control member access - OWeakRefArray m_xConnections; // vector containing a list + std::vector<unotools::WeakReference<OConnection>> m_xConnections; // vector containing a list // of all the Connection objects // for this Driver -#ifdef BUNDLE_MARIADB - oslModule m_hCConnModule; - bool m_bAttemptedLoadCConn; -#endif public: explicit MysqlCDriver(const Reference<css::lang::XMultiServiceFactory>& _rxFactory); @@ -82,6 +75,12 @@ public: const Reference<css::lang::XMultiServiceFactory>& getFactory() const { return m_xFactory; } static rtl_TextEncoding getDefaultEncoding() { return RTL_TEXTENCODING_UTF8; } + + // XDataDefinitionSupplier + virtual css::uno::Reference<css::sdbcx::XTablesSupplier> SAL_CALL getDataDefinitionByConnection( + const css::uno::Reference<css::sdbc::XConnection>& rxConnection) override; + virtual css::uno::Reference<css::sdbcx::XTablesSupplier> SAL_CALL getDataDefinitionByURL( + const OUString& rsURL, const css::uno::Sequence<css::beans::PropertyValue>& rInfo) override; }; } /* connectivity::mysqlc */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_general.cxx b/connectivity/source/drivers/mysqlc/mysqlc_general.cxx index 35ecfee84750..58409e454e7a 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_general.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_general.cxx @@ -20,6 +20,7 @@ #include <sal/log.hxx> #include <rtl/ustring.hxx> +#include <o3tl/string_view.hxx> #include <com/sun/star/sdbc/DataType.hpp> @@ -93,7 +94,7 @@ void throwFeatureNotImplementedException(const char* _pAsciiFeatureName, { const OUString sMessage = OUString::createFromAscii(_pAsciiFeatureName) + ": feature not implemented."; - throw SQLException(sMessage, _rxContext, "HYC00", 0, Any()); + throw SQLException(sMessage, _rxContext, u"HYC00"_ustr, 0, Any()); } void throwInvalidArgumentException(const char* _pAsciiFeatureName, @@ -101,7 +102,7 @@ void throwInvalidArgumentException(const char* _pAsciiFeatureName, { const OUString sMessage = OUString::createFromAscii(_pAsciiFeatureName) + ": invalid arguments."; - throw SQLException(sMessage, _rxContext, "HYC00", 0, Any()); + throw SQLException(sMessage, _rxContext, u"HYC00"_ustr, 0, Any()); } void throwSQLExceptionWithMsg(const char* msg, const char* SQLSTATE, unsigned int errorNum, @@ -164,6 +165,9 @@ sal_Int32 mysqlToOOOType(int eType, int charsetnr) noexcept return css::sdbc::DataType::VARCHAR; case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: if (charsetnr == 63) return css::sdbc::DataType::LONGVARBINARY; return css::sdbc::DataType::LONGVARCHAR; @@ -189,50 +193,58 @@ sal_Int32 mysqlToOOOType(int eType, int charsetnr) noexcept return css::sdbc::DataType::VARCHAR; } -sal_Int32 mysqlStrToOOOType(const OUString& sType) +sal_Int32 mysqlStrToOOOType(std::u16string_view sType) { // TODO other types. - if (sType.equalsIgnoreAsciiCase("tiny") || sType.equalsIgnoreAsciiCase("tinyint")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"tiny") + || o3tl::equalsIgnoreAsciiCase(sType, u"tinyint")) return css::sdbc::DataType::TINYINT; - if (sType.equalsIgnoreAsciiCase("smallint") || sType.equalsIgnoreAsciiCase("year")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"smallint") + || o3tl::equalsIgnoreAsciiCase(sType, u"year")) return css::sdbc::DataType::SMALLINT; - if (sType.equalsIgnoreAsciiCase("int") || sType.equalsIgnoreAsciiCase("mediumint")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"int") + || o3tl::equalsIgnoreAsciiCase(sType, u"mediumint")) return css::sdbc::DataType::INTEGER; - if (sType.equalsIgnoreAsciiCase("varchar") || sType.equalsIgnoreAsciiCase("set") - || sType.equalsIgnoreAsciiCase("enum")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"varchar") || o3tl::equalsIgnoreAsciiCase(sType, u"set") + || o3tl::equalsIgnoreAsciiCase(sType, u"enum")) return css::sdbc::DataType::VARCHAR; - if (sType.equalsIgnoreAsciiCase("bigint")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"bigint")) return css::sdbc::DataType::BIGINT; - if (sType.equalsIgnoreAsciiCase("blob") || sType.equalsIgnoreAsciiCase("longblob") - || sType.equalsIgnoreAsciiCase("tinyblob") || sType.equalsIgnoreAsciiCase("mediumblob")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"blob") + || o3tl::equalsIgnoreAsciiCase(sType, u"longblob") + || o3tl::equalsIgnoreAsciiCase(sType, u"tinyblob") + || o3tl::equalsIgnoreAsciiCase(sType, u"mediumblob")) return css::sdbc::DataType::BLOB; - if (sType.equalsIgnoreAsciiCase("varbinary")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"varbinary")) return css::sdbc::DataType::VARBINARY; - if (sType.equalsIgnoreAsciiCase("char")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"char")) return css::sdbc::DataType::CHAR; - if (sType.equalsIgnoreAsciiCase("tinytext")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"tinytext")) return css::sdbc::DataType::VARCHAR; - if (sType.equalsIgnoreAsciiCase("text")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"text")) return css::sdbc::DataType::LONGVARCHAR; - if (sType.equalsIgnoreAsciiCase("mediumtext") || sType.equalsIgnoreAsciiCase("longtext")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"mediumtext") + || o3tl::equalsIgnoreAsciiCase(sType, u"longtext")) return css::sdbc::DataType::CLOB; - if (sType.equalsIgnoreAsciiCase("binary")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"binary")) return css::sdbc::DataType::BINARY; - if (sType.equalsIgnoreAsciiCase("time")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"time")) return css::sdbc::DataType::TIME; - if (sType.equalsIgnoreAsciiCase("date")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"date")) return css::sdbc::DataType::DATE; - if (sType.equalsIgnoreAsciiCase("datetime") || sType.equalsIgnoreAsciiCase("timestamp")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"datetime") + || o3tl::equalsIgnoreAsciiCase(sType, u"timestamp")) return css::sdbc::DataType::TIMESTAMP; - if (sType.equalsIgnoreAsciiCase("decimal")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"decimal")) return css::sdbc::DataType::DECIMAL; - if (sType.equalsIgnoreAsciiCase("real") || sType.equalsIgnoreAsciiCase("float")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"real") || o3tl::equalsIgnoreAsciiCase(sType, u"float")) return css::sdbc::DataType::REAL; - if (sType.equalsIgnoreAsciiCase("double")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"double")) return css::sdbc::DataType::DOUBLE; - if (sType.equalsIgnoreAsciiCase("bit")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"bit")) return css::sdbc::DataType::BIT; - if (sType.equalsIgnoreAsciiCase("bool") || sType.equalsIgnoreAsciiCase("boolean")) + if (o3tl::equalsIgnoreAsciiCase(sType, u"bool") + || o3tl::equalsIgnoreAsciiCase(sType, u"boolean")) return css::sdbc::DataType::BOOLEAN; OSL_FAIL("Unknown type name from string, failing back to varchar."); return css::sdbc::DataType::VARCHAR; @@ -245,93 +257,92 @@ OUString mysqlTypeToStr(unsigned type, unsigned flags) switch (type) { case MYSQL_TYPE_BIT: - return OUString{ "BIT" }; + return u"BIT"_ustr; case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: - return isUnsigned ? (isZerofill ? OUString{ "DECIMAL UNSIGNED ZEROFILL" } - : OUString{ "DECIMAL UNSIGNED" }) - : OUString{ "DECIMAL" }; + return isUnsigned + ? (isZerofill ? u"DECIMAL UNSIGNED ZEROFILL"_ustr : u"DECIMAL UNSIGNED"_ustr) + : u"DECIMAL"_ustr; case MYSQL_TYPE_TINY: - return isUnsigned ? (isZerofill ? OUString{ "TINYINT UNSIGNED ZEROFILL" } - : OUString{ "TINYINT UNSIGNED" }) - : OUString{ "TINYINT" }; + return isUnsigned + ? (isZerofill ? u"TINYINT UNSIGNED ZEROFILL"_ustr : u"TINYINT UNSIGNED"_ustr) + : u"TINYINT"_ustr; case MYSQL_TYPE_SHORT: - return isUnsigned ? (isZerofill ? OUString{ "SMALLINT UNSIGNED ZEROFILL" } - : OUString{ "SMALLINT UNSIGNED" }) - : OUString{ "SMALLINT" }; + return isUnsigned ? (isZerofill ? u"SMALLINT UNSIGNED ZEROFILL"_ustr + : u"SMALLINT UNSIGNED"_ustr) + : u"SMALLINT"_ustr; case MYSQL_TYPE_LONG: - return isUnsigned ? (isZerofill ? OUString{ "INT UNSIGNED ZEROFILL" } - : OUString{ "INT UNSIGNED" }) - : OUString{ "INT" }; + return isUnsigned ? (isZerofill ? u"INT UNSIGNED ZEROFILL"_ustr : u"INT UNSIGNED"_ustr) + : u"INT"_ustr; case MYSQL_TYPE_FLOAT: - return isUnsigned ? (isZerofill ? OUString{ "FLOAT UNSIGNED ZEROFILL" } - : OUString{ "FLOAT UNSIGNED" }) - : OUString{ "FLOAT" }; + return isUnsigned + ? (isZerofill ? u"FLOAT UNSIGNED ZEROFILL"_ustr : u"FLOAT UNSIGNED"_ustr) + : u"FLOAT"_ustr; case MYSQL_TYPE_DOUBLE: - return isUnsigned ? (isZerofill ? OUString{ "DOUBLE UNSIGNED ZEROFILL" } - : OUString{ "DOUBLE UNSIGNED" }) - : OUString{ "DOUBLE" }; + return isUnsigned + ? (isZerofill ? u"DOUBLE UNSIGNED ZEROFILL"_ustr : u"DOUBLE UNSIGNED"_ustr) + : u"DOUBLE"_ustr; case MYSQL_TYPE_NULL: - return OUString{ "NULL" }; + return u"NULL"_ustr; case MYSQL_TYPE_TIMESTAMP: - return OUString{ "TIMESTAMP" }; + return u"TIMESTAMP"_ustr; case MYSQL_TYPE_LONGLONG: - return isUnsigned ? (isZerofill ? OUString{ "BIGINT UNSIGNED ZEROFILL" } - : OUString{ "BIGINT UNSIGNED" }) - : OUString{ "BIGINT" }; + return isUnsigned + ? (isZerofill ? u"BIGINT UNSIGNED ZEROFILL"_ustr : u"BIGINT UNSIGNED"_ustr) + : u"BIGINT"_ustr; case MYSQL_TYPE_INT24: - return isUnsigned ? (isZerofill ? OUString{ "MEDIUMINT UNSIGNED ZEROFILL" } - : OUString{ "MEDIUMINT UNSIGNED" }) - : OUString{ "MEDIUMINT" }; + return isUnsigned ? (isZerofill ? u"MEDIUMINT UNSIGNED ZEROFILL"_ustr + : u"MEDIUMINT UNSIGNED"_ustr) + : u"MEDIUMINT"_ustr; case MYSQL_TYPE_DATE: - return OUString{ "DATE" }; + return u"DATE"_ustr; case MYSQL_TYPE_TIME: - return OUString{ "TIME" }; + return u"TIME"_ustr; case MYSQL_TYPE_DATETIME: - return OUString{ "DATETIME" }; + return u"DATETIME"_ustr; case MYSQL_TYPE_TINY_BLOB: { - return OUString{ "TINYBLOB" }; + return u"TINYBLOB"_ustr; } case MYSQL_TYPE_MEDIUM_BLOB: { - return OUString{ "MEDIUMBLOB" }; + return u"MEDIUMBLOB"_ustr; } case MYSQL_TYPE_LONG_BLOB: { - return OUString{ "LONGBLOB" }; + return u"LONGBLOB"_ustr; } case MYSQL_TYPE_BLOB: { - return OUString{ "BLOB" }; + return u"BLOB"_ustr; } case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: if (flags & ENUM_FLAG) { - return OUString{ "ENUM" }; + return u"ENUM"_ustr; } if (flags & SET_FLAG) { - return OUString{ "SET" }; + return u"SET"_ustr; } - return OUString{ "VARCHAR" }; + return u"VARCHAR"_ustr; case MYSQL_TYPE_STRING: if (flags & ENUM_FLAG) { - return OUString{ "ENUM" }; + return u"ENUM"_ustr; } if (flags & SET_FLAG) { - return OUString{ "SET" }; + return u"SET"_ustr; } - return OUString{ "CHAR" }; + return u"CHAR"_ustr; case MYSQL_TYPE_YEAR: - return OUString{ "YEAR" }; + return u"YEAR"_ustr; case MYSQL_TYPE_GEOMETRY: - return OUString{ "GEOMETRY" }; + return u"GEOMETRY"_ustr; default: - return OUString{ "UNKNOWN" }; + return u"UNKNOWN"_ustr; } } diff --git a/connectivity/source/drivers/mysqlc/mysqlc_general.hxx b/connectivity/source/drivers/mysqlc/mysqlc_general.hxx index 2a78c7628879..16236e1530ed 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_general.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_general.hxx @@ -108,7 +108,7 @@ sal_Int32 mysqlToOOOType(int eType, int charsetnr) noexcept; OUString mysqlTypeToStr(unsigned mysql_type, unsigned mysql_flags); -sal_Int32 mysqlStrToOOOType(const OUString& sType); +sal_Int32 mysqlStrToOOOType(std::u16string_view sType); OUString convert(const ::std::string& _string, const rtl_TextEncoding encoding); } diff --git a/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx b/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx new file mode 100644 index 000000000000..c496f9c21cde --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_indexes.cxx @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_indexes.hxx" + +connectivity::mysqlc::Indexes::Indexes(Table* pTable, osl::Mutex& rMutex, + const std::vector<OUString>& rVector) + : OIndexesHelper(pTable, rMutex, rVector) +{ +} + +// XDrop +void connectivity::mysqlc::Indexes::dropObject(sal_Int32 /*nPosition*/, + const OUString& /* sIndexName */) +{ + // TODO: implement +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx b/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx new file mode 100644 index 000000000000..4c918d1846fd --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_indexes.hxx @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "mysqlc_table.hxx" + +#include <connectivity/TIndexes.hxx> + +namespace connectivity::mysqlc +{ +class Indexes : public ::connectivity::OIndexesHelper +{ +private: + // TODO: useful? + // Table* m_pTable; + +protected: + // XDrop + void dropObject(sal_Int32 nPosition, const OUString& sIndexName); + +public: + Indexes(Table* pTable, ::osl::Mutex& rMutex, const std::vector<OUString>& rVector); +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx b/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx new file mode 100644 index 000000000000..7706844f238c --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_keys.cxx @@ -0,0 +1,19 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_keys.hxx" +#include "mysqlc_table.hxx" + +connectivity::mysqlc::Keys::Keys(Table* pTable, osl::Mutex& rMutex, + const ::std::vector<OUString>& rNames) + : OKeysHelper(pTable, rMutex, rNames) +{ +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_keys.hxx b/connectivity/source/drivers/mysqlc/mysqlc_keys.hxx new file mode 100644 index 000000000000..9d0a9ef1cc43 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_keys.hxx @@ -0,0 +1,25 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <connectivity/TKeys.hxx> + +namespace connectivity::mysqlc +{ +class Table; + +class Keys : public ::connectivity::OKeysHelper +{ +public: + Keys(Table* pTable, ::osl::Mutex& rMutex, const ::std::vector<OUString>& rNames); +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.cxx b/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.cxx index 8360700434fc..6fd5d67823d5 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.cxx @@ -31,10 +31,10 @@ #include <cppuhelper/typeprovider.hxx> #include <sal/log.hxx> -using namespace rtl; - #include <cstdlib> +#include <typeindex> +using namespace rtl; using namespace connectivity::mysqlc; using namespace connectivity; using namespace cppu; @@ -46,11 +46,8 @@ using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; using namespace com::sun::star::io; using namespace com::sun::star::util; -using namespace ::comphelper; using ::osl::MutexGuard; -#include <typeindex> - namespace { std::type_index getTypeFromMysqlType(enum_field_types type) @@ -107,12 +104,24 @@ bool OPreparedResultSet::fetchResult() } for (sal_Int32 i = 0; i < m_nColumnCount; ++i) { + bool bIsBlobType = false; + switch (m_aFields[i].type) + { + case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + bIsBlobType = true; + break; + default: + bIsBlobType = false; + } m_aMetaData[i].is_null = false; m_aMetaData[i].length = 0l; m_aMetaData[i].error = false; m_aData[i].is_null = &m_aMetaData[i].is_null; - m_aData[i].buffer_length = m_aFields[i].type == MYSQL_TYPE_BLOB ? 0 : m_aFields[i].length; + m_aData[i].buffer_length = bIsBlobType ? 0 : m_aFields[i].length; m_aData[i].length = &m_aMetaData[i].length; m_aData[i].error = &m_aMetaData[i].error; m_aData[i].buffer = nullptr; @@ -154,12 +163,12 @@ bool OPreparedResultSet::fetchResult() OUString SAL_CALL OPreparedResultSet::getImplementationName() { - return "com.sun.star.sdbcx.mysqlc.ResultSet"; + return u"com.sun.star.sdbcx.mysqlc.ResultSet"_ustr; } uno::Sequence<OUString> SAL_CALL OPreparedResultSet::getSupportedServiceNames() { - return { "com.sun.star.sdbc.ResultSet", "com.sun.star.sdbcx.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr, u"com.sun.star.sdbcx.ResultSet"_ustr }; } sal_Bool SAL_CALL OPreparedResultSet::supportsService(const OUString& _rServiceName) @@ -171,7 +180,7 @@ OPreparedResultSet::OPreparedResultSet(OConnection& rConn, OPreparedStatement* p : OPreparedResultSet_BASE(m_aMutex) , OPropertySetHelper(OPreparedResultSet_BASE::rBHelper) , m_rConnection(rConn) - , m_aStatement(static_cast<OWeakObject*>(pStmt)) + , m_xStatement(pStmt) , m_pStmt(pMyStmt) , m_encoding(rConn.getConnectionEncoding()) , m_nColumnCount(mysql_stmt_field_count(pMyStmt)) @@ -189,7 +198,7 @@ void OPreparedResultSet::disposing() MutexGuard aGuard(m_aMutex); - m_aStatement = nullptr; + m_xStatement.clear(); m_xMetaData = nullptr; } @@ -224,8 +233,8 @@ sal_Int32 SAL_CALL OPreparedResultSet::findColumn(const OUString& columnName) return i + 1; // sdbc indexes from 1 } - throw SQLException("The column name '" + columnName + "' is not valid.", *this, "42S22", 0, - Any()); + throw SQLException("The column name '" + columnName + "' is not valid.", *this, u"42S22"_ustr, + 0, Any()); } template <typename T> T OPreparedResultSet::safelyRetrieveValue(sal_Int32 nColumnIndex) @@ -249,7 +258,7 @@ template <typename T> T OPreparedResultSet::retrieveValue(sal_Int32 nColumnIndex return *static_cast<T*>(m_aData[nColumnIndex - 1].buffer); else { - auto const& row = getRowSetValue(nColumnIndex); + auto const row = getRowSetValue(nColumnIndex); if constexpr (std::is_same_v<sal_Int64, T>) return row.getLong(); else if constexpr (std::is_same_v<sal_Int32, T>) @@ -322,8 +331,21 @@ template <> OUString OPreparedResultSet::retrieveValue(sal_Int32 column) { // redirect call to the appropriate method if needed // BLOB can be simply read out as string + bool bIsBlobType = false; + switch (m_aFields[column - 1].type) + { + case MYSQL_TYPE_BLOB: + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + bIsBlobType = true; + break; + default: + bIsBlobType = false; + } + if (getTypeFromMysqlType(m_aFields[column - 1].type) != std::type_index(typeid(OUString)) - && m_aFields[column - 1].type != MYSQL_TYPE_BLOB) + && !bIsBlobType) return getRowSetValue(column).getString(); const char* sStr = static_cast<const char*>(m_aData[column - 1].buffer); @@ -363,13 +385,16 @@ ORowSetValue OPreparedResultSet::getRowSetValue(sal_Int32 nColumnIndex) case MYSQL_TYPE_NEWDECIMAL: return getString(nColumnIndex); case MYSQL_TYPE_BLOB: - throw SQLException("Column with type BLOB cannot be converted", *this, "22000", 1, - Any()); + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + throw SQLException(u"Column with type BLOB cannot be converted"_ustr, *this, + u"22000"_ustr, 1, Any()); default: SAL_WARN("connectivity.mysqlc", "OPreparedResultSet::getRowSetValue: unknown type: " << m_aFields[nColumnIndex - 1].type); - throw SQLException("Unknown column type when fetching result", *this, "22000", 1, - Any()); + throw SQLException(u"Unknown column type when fetching result"_ustr, *this, + u"22000"_ustr, 1, Any()); } } @@ -664,7 +689,7 @@ uno::Reference<uno::XInterface> SAL_CALL OPreparedResultSet::getStatement() MutexGuard aGuard(m_aMutex); checkDisposed(OPreparedResultSet_BASE::rBHelper.bDisposed); - return m_aStatement.get(); + return cppu::getXWeak(m_xStatement.get().get()); } sal_Bool SAL_CALL OPreparedResultSet::rowDeleted() @@ -1002,21 +1027,17 @@ uno::Sequence<sal_Int32> IPropertyArrayHelper* OPreparedResultSet::createArrayHelper() const { - uno::Sequence<Property> aProps(5); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = Property("FetchDirection", PROPERTY_ID_FETCHDIRECTION, - cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("FetchSize", PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = Property("IsBookmarkable", PROPERTY_ID_ISBOOKMARKABLE, - cppu::UnoType<bool>::get(), PropertyAttribute::READONLY); - pProperties[nPos++] = Property("ResultSetConcurrency", PROPERTY_ID_RESULTSETCONCURRENCY, - cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - pProperties[nPos++] = Property("ResultSetType", PROPERTY_ID_RESULTSETTYPE, - cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - return new OPropertyArrayHelper(aProps); + return new OPropertyArrayHelper{ + { { u"FetchDirection"_ustr, PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), + 0 }, + { u"FetchSize"_ustr, PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"IsBookmarkable"_ustr, PROPERTY_ID_ISBOOKMARKABLE, cppu::UnoType<bool>::get(), + PropertyAttribute::READONLY }, + { u"ResultSetConcurrency"_ustr, PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY }, + { u"ResultSetType"_ustr, PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY } } + }; } IPropertyArrayHelper& OPreparedResultSet::getInfoHelper() { return *getArrayHelper(); } @@ -1095,11 +1116,11 @@ css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL OPreparedResultSet::g void OPreparedResultSet::checkColumnIndex(sal_Int32 index) { if (!m_aData) - throw SQLException("Cursor out of range", *this, "HY109", 1, Any()); + throw SQLException(u"Cursor out of range"_ustr, *this, u"HY109"_ustr, 1, Any()); if (index < 1 || index > static_cast<int>(m_nColumnCount)) { /* static object for efficiency or thread safety is a problem ? */ - throw SQLException("index out of range", *this, "42S22", 1, Any()); + throw SQLException(u"index out of range"_ustr, *this, u"42S22"_ustr, 1, Any()); } } diff --git a/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.hxx b/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.hxx index 018595b770ba..3f79ddcd1e73 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_prepared_resultset.hxx @@ -41,9 +41,7 @@ namespace connectivity::mysqlc { -using ::com::sun::star::sdbc::SQLException; using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::RuntimeException; typedef ::cppu::WeakComponentImplHelper12< css::sdbc::XResultSet, css::sdbc::XRow, css::sdbc::XResultSetMetaDataSupplier, @@ -52,14 +50,14 @@ typedef ::cppu::WeakComponentImplHelper12< css::sdbc::XColumnLocate, css::lang::XServiceInfo> OPreparedResultSet_BASE; -class OPreparedResultSet final : public OBase_Mutex, +class OPreparedResultSet final : public cppu::BaseMutex, public OPreparedResultSet_BASE, public ::cppu::OPropertySetHelper, public OPropertyArrayUsageHelper<OPreparedResultSet> { OConnection& m_rConnection; - css::uno::WeakReferenceHelper m_aStatement; - css::uno::Reference<css::sdbc::XResultSetMetaData> m_xMetaData; + unotools::WeakReference<OPreparedStatement> m_xStatement; + rtl::Reference<OResultSetMetaData> m_xMetaData; // non-owning pointers MYSQL_RES* m_pResult; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.cxx b/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.cxx index a50b14bbb3b4..0c54630f25f2 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.cxx @@ -23,6 +23,7 @@ #include "mysqlc_propertyids.hxx" #include "mysqlc_resultsetmetadata.hxx" +#include <o3tl/safeint.hxx> #include <sal/log.hxx> #include <com/sun/star/sdbc/DataType.hpp> @@ -31,8 +32,6 @@ using namespace connectivity::mysqlc; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; using namespace com::sun::star::container; using namespace com::sun::star::io; @@ -41,12 +40,12 @@ using ::osl::MutexGuard; OUString OPreparedStatement::getImplementationName() { - return "com.sun.star.sdbcx.mysqlc.PreparedStatement"; + return u"com.sun.star.sdbcx.mysqlc.PreparedStatement"_ustr; } css::uno::Sequence<OUString> OPreparedStatement::getSupportedServiceNames() { - return { "com.sun.star.sdbc.PreparedStatement" }; + return { u"com.sun.star.sdbc.PreparedStatement"_ustr }; } sal_Bool OPreparedStatement::supportsService(OUString const& ServiceName) @@ -432,7 +431,7 @@ void SAL_CALL OPreparedStatement::setObjectWithInfo(sal_Int32 parameterIndex, co { OString sAscii = OUStringToOString(sValue, getOwnConnection()->getConnectionEncoding()); - std::stringstream sStream{ sAscii.getStr() }; + std::stringstream sStream{ std::string(sAscii) }; sStream >> nValue; m_binds[nIndex].buffer_type = MYSQL_TYPE_DOUBLE; mysqlc_sdbc_driver::resetSqlVar(&m_binds[nIndex].buffer, &nValue, MYSQL_TYPE_DOUBLE, @@ -492,9 +491,10 @@ void SAL_CALL OPreparedStatement::setBytes(sal_Int32 parameter, const Sequence<s checkParameterIndex(parameter); const sal_Int32 nIndex = parameter - 1; - m_binds[nIndex].buffer_type = MYSQL_TYPE_BLOB; // FIXME - mysqlc_sdbc_driver::resetSqlVar(&m_binds[nIndex].buffer, &x, MYSQL_TYPE_BLOB); + m_binds[nIndex].buffer_type = MYSQL_TYPE_BLOB; + mysqlc_sdbc_driver::resetSqlVar(&m_binds[nIndex].buffer, &x[0], MYSQL_TYPE_BLOB, x.getLength()); m_bindMetas[nIndex].is_null = false; + m_bindMetas[nIndex].length = x.getLength(); } void SAL_CALL OPreparedStatement::setCharacterStream(sal_Int32 parameter, @@ -569,9 +569,9 @@ void OPreparedStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, con void OPreparedStatement::checkParameterIndex(sal_Int32 column) { - if (column < 1 || column > static_cast<sal_Int32>(m_paramCount)) + if (column < 1 || o3tl::make_unsigned(column) > m_paramCount) { - throw SQLException("Parameter index out of range", *this, OUString(), 1, Any()); + throw SQLException(u"Parameter index out of range"_ustr, *this, OUString(), 1, Any()); } } diff --git a/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.hxx b/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.hxx index d280bd935ae3..d61f616372b0 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_preparedstatement.hxx @@ -30,11 +30,9 @@ namespace connectivity::mysqlc { -using ::com::sun::star::sdbc::SQLException; using ::com::sun::star::sdbc::XResultSetMetaData; using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::RuntimeException; using ::com::sun::star::uno::Type; #if defined MYSQL_VERSION_ID && (MYSQL_VERSION_ID >= 80000) && !defined MARIADB_BASE_VERSION @@ -43,6 +41,8 @@ using my_bool = bool; using my_bool = char; #endif +class OResultSetMetaData; + struct BindMetaData { my_bool is_null = false; @@ -57,7 +57,7 @@ typedef ::cppu::ImplHelper4<css::sdbc::XPreparedStatement, css::sdbc::XParameter class OPreparedStatement final : public OCommonStatement, public OPreparedStatement_BASE { unsigned int m_paramCount = 0; // number of placeholders - Reference<XResultSetMetaData> m_xMetaData; + rtl::Reference<OResultSetMetaData> m_xMetaData; MYSQL_STMT* m_pStmt; std::vector<MYSQL_BIND> m_binds; std::vector<BindMetaData> m_bindMetas; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_resultset.cxx b/connectivity/source/drivers/mysqlc/mysqlc_resultset.cxx index 7a11020ea8e0..ac07b862dc9f 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_resultset.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_resultset.cxx @@ -30,6 +30,8 @@ #include <cppuhelper/supportsservice.hxx> #include <cppuhelper/typeprovider.hxx> #include <comphelper/seqstream.hxx> +#include <o3tl/safeint.hxx> +#include <o3tl/string_view.hxx> using namespace rtl; @@ -51,14 +53,13 @@ namespace { // copied from string misc, it should be replaced when library is not an // extension anymore -std::vector<OString> lcl_split(const OString& rStr, char cSeparator) +std::vector<OString> lcl_split(std::string_view rStr, char cSeparator) { std::vector<OString> vec; sal_Int32 idx = 0; do { - OString kw = rStr.getToken(0, cSeparator, idx); - kw = kw.trim(); + OString kw(o3tl::trim(o3tl::getToken(rStr, 0, cSeparator, idx))); if (!kw.isEmpty()) { vec.push_back(kw); @@ -72,7 +73,7 @@ void OResultSet::checkRowIndex() { if (m_nRowPosition < 0 || m_nRowPosition >= m_nRowCount) { - throw SQLException("Cursor position out of range", *this, OUString(), 1, Any()); + throw SQLException(u"Cursor position out of range"_ustr, *this, OUString(), 1, Any()); } } @@ -89,12 +90,12 @@ bool OResultSet::checkNull(sal_Int32 column) OUString SAL_CALL OResultSet::getImplementationName() { - return "com.sun.star.sdbcx.mysqlc.ResultSet"; + return u"com.sun.star.sdbcx.mysqlc.ResultSet"_ustr; } uno::Sequence<OUString> SAL_CALL OResultSet::getSupportedServiceNames() { - return { "com.sun.star.sdbc.ResultSet", "com.sun.star.sdbcx.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr, u"com.sun.star.sdbcx.ResultSet"_ustr }; } sal_Bool SAL_CALL OResultSet::supportsService(const OUString& _rServiceName) @@ -107,7 +108,7 @@ OResultSet::OResultSet(OConnection& rConn, OCommonStatement* pStmt, MYSQL_RES* p : OResultSet_BASE(m_aMutex) , OPropertySetHelper(OResultSet_BASE::rBHelper) , m_pMysql(rConn.getMysqlConnection()) - , m_aStatement(static_cast<OWeakObject*>(pStmt)) + , m_aStatement(pStmt) , m_pResult(pResult) , m_encoding(_encoding) { @@ -138,8 +139,8 @@ void OResultSet::ensureFieldInfoFetched() MYSQL_FIELD* pFields = mysql_fetch_fields(m_pResult); m_aFields.reserve(nFieldCount); for (unsigned i = 0; i < nFieldCount; ++i) - m_aFields.push_back(OUString{ - pFields[i].name, static_cast<sal_Int32>(strlen(pFields[i].name)), m_encoding }); + m_aFields.emplace_back(pFields[i].name, static_cast<sal_Int32>(strlen(pFields[i].name)), + m_encoding); } void OResultSet::fetchResult() @@ -155,11 +156,11 @@ void OResultSet::fetchResult() { MYSQL_ROW data = mysql_fetch_row(m_pResult); unsigned long* lengths = mysql_fetch_lengths(m_pResult); - m_aRows.push_back(DataFields{}); + m_aRows.emplace_back(); // MYSQL_ROW is char**, array of strings for (std::size_t col = 0; col < m_aFields.size(); ++col) { - m_aRows.back().push_back(OString{ data[col], static_cast<sal_Int32>(lengths[col]) }); + m_aRows.back().emplace_back(data[col], static_cast<sal_Int32>(lengths[col])); } } unsigned errorNum = mysql_errno(m_pMysql); @@ -181,7 +182,7 @@ void OResultSet::disposing() mysql_free_result(m_pResult); m_pResult = nullptr; } - m_aStatement = nullptr; + m_aStatement.clear(); m_xMetaData = nullptr; } @@ -216,8 +217,8 @@ sal_Int32 SAL_CALL OResultSet::findColumn(const OUString& columnName) return static_cast<sal_Int32>(i) + 1; // sdbc indexes from 1 } - throw SQLException("The column name '" + columnName + "' is not valid.", *this, "42S22", 0, - Any()); + throw SQLException("The column name '" + columnName + "' is not valid.", *this, u"42S22"_ustr, + 0, Any()); } uno::Reference<XInputStream> SAL_CALL OResultSet::getBinaryStream(sal_Int32 column) @@ -292,24 +293,23 @@ Date SAL_CALL OResultSet::getDate(sal_Int32 column) if (checkNull(column)) return d; - OString dateStr = m_aRows[m_nRowPosition][column - 1]; + const OString& dateStr = m_aRows[m_nRowPosition][column - 1]; - OString dateString(dateStr); - OString token; + std::string_view dateString(dateStr); sal_Int32 nIndex = 0, i = 0; do { - token = dateString.getToken(0, '-', nIndex); + std::string_view token = o3tl::getToken(dateString, 0, '-', nIndex); switch (i) { case 0: - d.Year = static_cast<sal_uInt16>(token.toUInt32()); + d.Year = static_cast<sal_uInt16>(o3tl::toUInt32(token)); break; case 1: - d.Month = static_cast<sal_uInt16>(token.toUInt32()); + d.Month = static_cast<sal_uInt16>(o3tl::toUInt32(token)); break; case 2: - d.Day = static_cast<sal_uInt16>(token.toUInt32()); + d.Day = static_cast<sal_uInt16>(o3tl::toUInt32(token)); break; default:; } @@ -467,25 +467,28 @@ Time SAL_CALL OResultSet::getTime(sal_Int32 column) if (checkNull(column)) return t; - OString sVal = m_aRows[m_nRowPosition][column - 1]; - OString timeString{ sVal.getStr(), getDataLength(column) }; - OString token; + const OString& sVal = m_aRows[m_nRowPosition][column - 1]; + std::string_view timeString{ sVal.getStr(), o3tl::make_unsigned(getDataLength(column)) }; sal_Int32 nIndex, i = 0; - nIndex = timeString.indexOf(' ') + 1; + size_t idx = timeString.find(' '); + if (idx == std::string_view::npos) + nIndex = 0; + else + nIndex = idx + 1; do { - token = timeString.getToken(0, ':', nIndex); + std::string_view token = o3tl::getToken(timeString, 0, ':', nIndex); switch (i) { case 0: - t.Hours = static_cast<sal_uInt16>(token.toUInt32()); + t.Hours = static_cast<sal_uInt16>(o3tl::toUInt32(token)); break; case 1: - t.Minutes = static_cast<sal_uInt16>(token.toUInt32()); + t.Minutes = static_cast<sal_uInt16>(o3tl::toUInt32(token)); break; case 2: - t.Seconds = static_cast<sal_uInt16>(token.toUInt32()); + t.Seconds = static_cast<sal_uInt16>(o3tl::toUInt32(token)); break; } i++; @@ -506,14 +509,13 @@ DateTime SAL_CALL OResultSet::getTimestamp(sal_Int32 column) OString sVal = m_aRows[m_nRowPosition][column - 1]; // YY-MM-DD HH:MM:SS - std::vector<OString> dateAndTime - = lcl_split(OString{ sVal.getStr(), getDataLength(column) }, ' '); + std::vector<OString> dateAndTime = lcl_split(sVal.subView(0, getDataLength(column)), ' '); auto dateParts = lcl_split(dateAndTime.at(0), '-'); auto timeParts = lcl_split(dateAndTime.at(1), ':'); if (dateParts.size() < 2 || timeParts.size() < 2) - throw SQLException("Timestamp has a wrong format", *this, OUString(), 1, Any()); + throw SQLException(u"Timestamp has a wrong format"_ustr, *this, OUString(), 1, Any()); DateTime dt; @@ -670,7 +672,7 @@ uno::Reference<uno::XInterface> SAL_CALL OResultSet::getStatement() MutexGuard aGuard(m_aMutex); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - return m_aStatement.get(); + return cppu::getXWeak(m_aStatement.get().get()); } sal_Bool SAL_CALL OResultSet::rowDeleted() @@ -1007,21 +1009,17 @@ uno::Sequence<sal_Int32> SAL_CALL OResultSet::deleteRows(const uno::Sequence<Any IPropertyArrayHelper* OResultSet::createArrayHelper() const { - uno::Sequence<Property> aProps(5); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = Property("FetchDirection", PROPERTY_ID_FETCHDIRECTION, - cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("FetchSize", PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = Property("IsBookmarkable", PROPERTY_ID_ISBOOKMARKABLE, - cppu::UnoType<bool>::get(), PropertyAttribute::READONLY); - pProperties[nPos++] = Property("ResultSetConcurrency", PROPERTY_ID_RESULTSETCONCURRENCY, - cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - pProperties[nPos++] = Property("ResultSetType", PROPERTY_ID_RESULTSETTYPE, - cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - return new OPropertyArrayHelper(aProps); + return new OPropertyArrayHelper{ + { { u"FetchDirection"_ustr, PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), + 0 }, + { u"FetchSize"_ustr, PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"IsBookmarkable"_ustr, PROPERTY_ID_ISBOOKMARKABLE, cppu::UnoType<bool>::get(), + PropertyAttribute::READONLY }, + { u"ResultSetConcurrency"_ustr, PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY }, + { u"ResultSetType"_ustr, PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY } } + }; } IPropertyArrayHelper& OResultSet::getInfoHelper() { return *getArrayHelper(); } @@ -1097,10 +1095,10 @@ css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL OResultSet::getProper void OResultSet::checkColumnIndex(sal_Int32 index) { - if (index < 1 || index > static_cast<int>(m_aFields.size())) + if (index < 1 || o3tl::make_unsigned(index) > m_aFields.size()) { /* static object for efficiency or thread safety is a problem ? */ - throw SQLException("index out of range", *this, OUString(), 1, Any()); + throw SQLException(u"index out of range"_ustr, *this, OUString(), 1, Any()); } } diff --git a/connectivity/source/drivers/mysqlc/mysqlc_resultset.hxx b/connectivity/source/drivers/mysqlc/mysqlc_resultset.hxx index 461e81286cb6..baa65be07cc0 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_resultset.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_resultset.hxx @@ -37,12 +37,12 @@ #include <com/sun/star/util/XCancellable.hpp> #include <cppuhelper/compbase12.hxx> +#include <unotools/weakref.hxx> namespace connectivity::mysqlc { -using ::com::sun::star::sdbc::SQLException; using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::RuntimeException; +class OResultSetMetaData; /* ** OResultSet @@ -54,7 +54,7 @@ typedef ::cppu::WeakComponentImplHelper12< css::sdbc::XColumnLocate, css::lang::XServiceInfo> OResultSet_BASE; -class OResultSet final : public OBase_Mutex, +class OResultSet final : public cppu::BaseMutex, public OResultSet_BASE, public ::cppu::OPropertySetHelper, public OPropertyArrayUsageHelper<OResultSet> @@ -63,8 +63,8 @@ class OResultSet final : public OBase_Mutex, std::vector<DataFields> m_aRows; std::vector<OUString> m_aFields; MYSQL* m_pMysql = nullptr; - css::uno::WeakReferenceHelper m_aStatement; - css::uno::Reference<css::sdbc::XResultSetMetaData> m_xMetaData; + unotools::WeakReference<OCommonStatement> m_aStatement; + rtl::Reference<OResultSetMetaData> m_xMetaData; MYSQL_RES* m_pResult; rtl_TextEncoding m_encoding; bool m_bWasNull = false; // did the last getXXX result null? diff --git a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx index 3d0ac9ce8411..21dd0fafc686 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.cxx @@ -21,11 +21,11 @@ #include "mysqlc_general.hxx" #include <com/sun/star/sdbc/XRow.hpp> -#include <rtl/ustrbuf.hxx> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <o3tl/safeint.hxx> using namespace connectivity::mysqlc; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; using namespace com::sun::star::sdbc; OResultSetMetaData::OResultSetMetaData(OConnection& rConn, MYSQL_RES* pResult) @@ -199,7 +199,7 @@ sal_Bool SAL_CALL OResultSetMetaData::isWritable(sal_Int32 column) void OResultSetMetaData::checkColumnIndex(sal_Int32 columnIndex) { auto nColCount = m_fields.size(); - if (columnIndex < 1 || columnIndex > static_cast<sal_Int32>(nColCount)) + if (columnIndex < 1 || o3tl::make_unsigned(columnIndex) > nColCount) { OUString str = "Column index out of range (expected 1 to " + OUString::number(sal_Int32(nColCount)) + ", got " diff --git a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.hxx b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.hxx index c2e5db5f3375..aa84ac05586c 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_resultsetmetadata.hxx @@ -30,10 +30,6 @@ namespace connectivity::mysqlc { -using ::com::sun::star::sdbc::SQLException; -using ::com::sun::star::uno::RuntimeException; -using ::com::sun::star::uno::RuntimeException; - struct MySqlFieldInfo { OUString columnName; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_statement.cxx b/connectivity/source/drivers/mysqlc/mysqlc_statement.cxx index 6e14d9ec60bc..2d8deaebdec1 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_statement.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_statement.cxx @@ -34,9 +34,7 @@ using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; -using namespace com::sun::star::io; using namespace com::sun::star::util; using ::osl::MutexGuard; @@ -53,8 +51,7 @@ void OCommonStatement::closeResultSet() { if (m_xResultSet.is()) { - css::uno::Reference<css::sdbc::XCloseable> xClose(m_xResultSet, UNO_QUERY_THROW); - xClose->close(); + m_xResultSet->close(); m_xResultSet.clear(); } } @@ -149,11 +146,11 @@ Reference<XResultSet> SAL_CALL OStatement::executeQuery(const OUString& sql) assert(isRS == m_xResultSet.is()); if (!isRS) mysqlc_sdbc_driver::throwSQLExceptionWithMsg( - "executeQuery called on SQL command that does not return a ResultSet", "02000", 0, + u"executeQuery called on SQL command that does not return a ResultSet"_ustr, "02000", 0, *this); if (!m_xResultSet.is()) mysqlc_sdbc_driver::throwSQLExceptionWithMsg( - "internal MySQL-SDBC error: executeQuery: no ResultSet after execute() returned true.", + u"internal MySQL-SDBC error: executeQuery: no ResultSet after execute() returned true."_ustr, "02000", 0, *this); return m_xResultSet; @@ -238,8 +235,8 @@ bool OStatement::getResult() else { mysqlc_sdbc_driver::throwSQLExceptionWithMsg( - "mysql_store_result indicated success and SQL command was supposed to return a " - "ResultSet, but did not.", + u"mysql_store_result indicated success and SQL command was supposed to return a " + "ResultSet, but did not."_ustr, "02000", 0, *this); } //unreachable @@ -282,7 +279,7 @@ Any SAL_CALL OCommonStatement::getWarnings() MutexGuard aGuard(m_aMutex); checkDisposed(rBHelper.bDisposed); - return makeAny(m_aLastWarning); + return Any(m_aLastWarning); } void SAL_CALL OCommonStatement::clearWarnings() @@ -297,31 +294,20 @@ void SAL_CALL OCommonStatement::clearWarnings() { // this properties are define by the service statement // they must in alphabetic order - Sequence<Property> aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] - = Property("CursorName", PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] - = Property("EscapeProcessing", PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0); - pProperties[nPos++] = Property("FetchDirection", PROPERTY_ID_FETCHDIRECTION, - cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("FetchSize", PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("MaxFieldSize", PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("MaxRows", PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("QueryTimeOut", PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = Property("ResultSetConcurrency", PROPERTY_ID_RESULTSETCONCURRENCY, - cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("ResultSetType", PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] - = Property("UseBookmarks", PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper{ + { { u"CursorName"_ustr, PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0 }, + { u"EscapeProcessing"_ustr, PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0 }, + { u"FetchDirection"_ustr, PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), + 0 }, + { u"FetchSize"_ustr, PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"MaxFieldSize"_ustr, PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"MaxRows"_ustr, PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"QueryTimeOut"_ustr, PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"ResultSetConcurrency"_ustr, PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), 0 }, + { u"ResultSetType"_ustr, PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0 }, + { u"UseBookmarks"_ustr, PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0 } } + }; } ::cppu::IPropertyArrayHelper& OCommonStatement::getInfoHelper() { return *getArrayHelper(); } @@ -374,11 +360,11 @@ void OCommonStatement::getFastPropertyValue(Any& _rValue, sal_Int32 nHandle) con } } -OUString OStatement::getImplementationName() { return "com.sun.star.sdbcx.OStatement"; } +OUString OStatement::getImplementationName() { return u"com.sun.star.sdbcx.OStatement"_ustr; } css::uno::Sequence<OUString> OStatement::getSupportedServiceNames() { - return { "com.sun.star.sdbc.Statement" }; + return { u"com.sun.star.sdbc.Statement"_ustr }; } sal_Bool OStatement::supportsService(OUString const& ServiceName) diff --git a/connectivity/source/drivers/mysqlc/mysqlc_statement.hxx b/connectivity/source/drivers/mysqlc/mysqlc_statement.hxx index 14750309ad87..7e260fe8b144 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_statement.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_statement.hxx @@ -36,11 +36,10 @@ namespace connectivity::mysqlc { -using ::com::sun::star::sdbc::SQLException; using ::com::sun::star::sdbc::SQLWarning; using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::RuntimeException; using ::com::sun::star::uno::Type; +class OResultSet; typedef ::cppu::WeakComponentImplHelper3<css::sdbc::XWarningsSupplier, css::util::XCancellable, css::sdbc::XCloseable> @@ -49,7 +48,7 @@ typedef ::cppu::WeakComponentImplHelper3<css::sdbc::XWarningsSupplier, css::util //************ Class: OCommonStatement // is a base class for the normal statement and for the prepared statement -class OCommonStatement : public OBase_Mutex, +class OCommonStatement : public cppu::BaseMutex, public OCommonStatement_IBase, public ::cppu::OPropertySetHelper, public OPropertyArrayUsageHelper<OCommonStatement> @@ -61,7 +60,7 @@ private: protected: rtl::Reference<OConnection> m_xConnection; // The owning Connection object - css::uno::Reference<css::sdbc::XResultSet> m_xResultSet; + rtl::Reference<OResultSet> m_xResultSet; // number of rows affected by an UPDATE, DELETE or INSERT statement. sal_Int32 m_nAffectedRows = 0; diff --git a/connectivity/source/drivers/mysqlc/mysqlc_subcomponent.hxx b/connectivity/source/drivers/mysqlc/mysqlc_subcomponent.hxx index d0847aedc5d6..87978b03bd2f 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_subcomponent.hxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_subcomponent.hxx @@ -23,15 +23,6 @@ #include <osl/diagnose.h> #include <osl/mutex.hxx> -namespace cppu -{ -class IPropertyArrayHelper; -} -namespace com::sun::star::lang -{ -class XComponent; -} - namespace connectivity::mysqlc { /// @throws css::lang::DisposedException @@ -106,12 +97,6 @@ template <class TYPE>::cppu::IPropertyArrayHelper* OPropertyArrayUsageHelper<TYP return s_pProps; } -class OBase_Mutex -{ -public: - ::osl::Mutex m_aMutex; -}; - namespace internal { template <class T> void implCopySequence(const T* _pSource, T*& _pDest, sal_Int32 _nSourceLen) diff --git a/connectivity/source/drivers/mysqlc/mysqlc_table.cxx b/connectivity/source/drivers/mysqlc/mysqlc_table.cxx new file mode 100644 index 000000000000..3c621f9d375d --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_table.cxx @@ -0,0 +1,168 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_columns.hxx" +#include "mysqlc_indexes.hxx" +#include "mysqlc_keys.hxx" +#include "mysqlc_table.hxx" + +#include <TConnection.hxx> + +#include <comphelper/types.hxx> +#include <connectivity/dbtools.hxx> + +#include <com/sun/star/sdbcx/Privilege.hpp> +#include <com/sun/star/beans/PropertyAttribute.hpp> + +connectivity::mysqlc::Table::Table( + Tables* pTables, osl::Mutex& rMutex, + const css::uno::Reference<OMetaConnection::XConnection>& rConnection) + : OTableHelper(pTables, rConnection, true) + , m_rMutex(rMutex) + , m_nPrivileges(0) +{ + construct(); +} + +connectivity::mysqlc::Table::Table( + Tables* pTables, osl::Mutex& rMutex, + const css::uno::Reference<OMetaConnection::XConnection>& rConnection, const OUString& rCatalog, + const OUString& rSchema, const OUString& rName, const OUString& rType, + const OUString& rDescription) + : OTableHelper(pTables, rConnection, true, rName, rType, rDescription, rSchema, rCatalog) + , m_rMutex(rMutex) + , m_nPrivileges(0) +{ + construct(); +} + +void connectivity::mysqlc::Table::construct() +{ + OTableHelper::construct(); + if (isNew()) + return; + + // TODO: get privileges when in non-embedded mode. + m_nPrivileges = css::sdbcx::Privilege::DROP | css::sdbcx::Privilege::REFERENCE + | css::sdbcx::Privilege::ALTER | css::sdbcx::Privilege::CREATE + | css::sdbcx::Privilege::READ | css::sdbcx::Privilege::DELETE + | css::sdbcx::Privilege::UPDATE | css::sdbcx::Privilege::INSERT + | css::sdbcx::Privilege::SELECT; + registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRIVILEGES), + PROPERTY_ID_PRIVILEGES, css::beans::PropertyAttribute::READONLY, + &m_nPrivileges, cppu::UnoType<decltype(m_nPrivileges)>::get()); +} +//----- OTableHelper --------------------------------------------------------- +connectivity::sdbcx::OCollection* +connectivity::mysqlc::Table::createColumns(const ::std::vector<OUString>& rNames) +{ + return new Columns(*this, m_rMutex, rNames); +} + +connectivity::sdbcx::OCollection* +connectivity::mysqlc::Table::createKeys(const ::std::vector<OUString>& rNames) +{ + return new Keys(this, m_rMutex, rNames); +} + +connectivity::sdbcx::OCollection* +connectivity::mysqlc::Table::createIndexes(const ::std::vector<OUString>& rNames) +{ + return new Indexes(this, m_rMutex, rNames); +} + +//----- XAlterTable ----------------------------------------------------------- +void SAL_CALL connectivity::mysqlc::Table::alterColumnByName( + const OUString& rColName, const css::uno::Reference<XPropertySet>& rDescriptor) +{ + osl::MutexGuard aGuard(m_rMutex); + checkDisposed(WeakComponentImplHelperBase::rBHelper.bDisposed); + + css::uno::Reference<XPropertySet> xColumn(m_xColumns->getByName(rColName), css::uno::UNO_QUERY); + + // sdbcx::Descriptor + const bool bNameChanged + = xColumn->getPropertyValue(u"Name"_ustr) != rDescriptor->getPropertyValue(u"Name"_ustr); + // sdbcx::ColumnDescriptor + const bool bTypeChanged + = xColumn->getPropertyValue(u"Type"_ustr) != rDescriptor->getPropertyValue(u"Type"_ustr); + const bool bTypeNameChanged + = !comphelper::getString(xColumn->getPropertyValue(u"TypeName"_ustr)) + .equalsIgnoreAsciiCase( + comphelper::getString(rDescriptor->getPropertyValue(u"TypeName"_ustr))); + const bool bPrecisionChanged = xColumn->getPropertyValue(u"Precision"_ustr) + != rDescriptor->getPropertyValue(u"Precision"_ustr); + const bool bScaleChanged + = xColumn->getPropertyValue(u"Scale"_ustr) != rDescriptor->getPropertyValue(u"Scale"_ustr); + + const bool bIsNullableChanged = xColumn->getPropertyValue(u"IsNullable"_ustr) + != rDescriptor->getPropertyValue(u"IsNullable"_ustr); + + const bool bIsAutoIncrementChanged = xColumn->getPropertyValue(u"IsAutoIncrement"_ustr) + != rDescriptor->getPropertyValue(u"IsAutoIncrement"_ustr); + + // there's also DefaultValue but not related to database directly, it seems completely internal to LO + // so no need to test it + // TODO: remainder -- these are all "optional" so have to detect presence and change. + if (bTypeChanged || bTypeNameChanged || bPrecisionChanged || bScaleChanged || bIsNullableChanged + || bIsAutoIncrementChanged) + { + // If bPrecisionChanged this will only succeed if we have increased the + // precision, otherwise an exception is thrown -- however the base + // gui then offers to delete and recreate the column. + OUStringBuffer sSql(300); + sSql.append(getAlterTableColumnPart() + " MODIFY COLUMN `" + rColName + "` " + + ::dbtools::createStandardTypePart(rDescriptor, getConnection())); + + if (comphelper::getBOOL(rDescriptor->getPropertyValue(u"IsAutoIncrement"_ustr))) + sSql.append(" auto_increment"); + + // see ColumnValue: NO_NULLS = 0, NULLABLE = 1, NULLABLE_UNKNOWN + // so entry required = yes corresponds to NO_NULLS = 0 and only in this case + // NOT NULL + if (comphelper::getINT32(rDescriptor->getPropertyValue(u"IsNullable"_ustr)) == 0) + sSql.append(" NOT NULL"); + + getConnection()->createStatement()->execute(sSql.makeStringAndClear()); + } + + if (bNameChanged) + { + OUString sNewColName; + rDescriptor->getPropertyValue(u"Name"_ustr) >>= sNewColName; + OUString sSql(getAlterTableColumnPart() + " RENAME COLUMN `" + rColName + "` TO `" + + sNewColName + "`"); + + getConnection()->createStatement()->execute(sSql); + } + + m_xColumns->refresh(); +} + +void SAL_CALL connectivity::mysqlc::Table::alterColumnByIndex( + sal_Int32 index, const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + osl::MutexGuard aGuard(m_rMutex); + css::uno::Reference<XPropertySet> xColumn(m_xColumns->getByIndex(index), + css::uno::UNO_QUERY_THROW); + alterColumnByName(comphelper::getString(xColumn->getPropertyValue( + OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))), + descriptor); +} + +OUString connectivity::mysqlc::Table::getAlterTableColumnPart() const +{ + return "ALTER TABLE " + + ::dbtools::composeTableName(getMetaData(), m_CatalogName, m_SchemaName, m_Name, true, + ::dbtools::EComposeRule::InTableDefinitions); +} + +OUString connectivity::mysqlc::Table::getRenameStart() const { return u"RENAME TABLE "_ustr; } + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_table.hxx b/connectivity/source/drivers/mysqlc/mysqlc_table.hxx new file mode 100644 index 000000000000..7487f1bc7b34 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_table.hxx @@ -0,0 +1,69 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "mysqlc_tables.hxx" + +#include <connectivity/TTableHelper.hxx> + +namespace connectivity::mysqlc +{ +class Table : public OTableHelper +{ +private: + ::osl::Mutex& m_rMutex; + sal_Int32 m_nPrivileges; + +protected: + void construct() override; + +public: + Table(Tables* pTables, ::osl::Mutex& rMutex, + const css::uno::Reference<css::sdbc::XConnection>& _xConnection); + Table(Tables* pTables, ::osl::Mutex& rMutex, + const css::uno::Reference<css::sdbc::XConnection>& _xConnection, const OUString& rCatalog, + const OUString& rSchema, const OUString& rName, const OUString& rType, + const OUString& rDescription); + + // OTableHelper + virtual ::connectivity::sdbcx::OCollection* + createColumns(const ::std::vector<OUString>& rNames) override; + virtual ::connectivity::sdbcx::OCollection* + createKeys(const ::std::vector<OUString>& rNames) override; + virtual ::connectivity::sdbcx::OCollection* + createIndexes(const ::std::vector<OUString>& rNames) override; + + /** Returns always "RENAME TABLE " even for views. + * + * \return The start of the rename statement. + * @see http://dev.mysql.com/doc/refman/5.1/de/rename-table.html + */ + virtual OUString getRenameStart() const override; + + // XAlterTable + /** + * See css::sdbcx::ColumnDescriptor for details of + * rDescriptor. + */ + virtual void SAL_CALL + alterColumnByName(const OUString& rColName, + const css::uno::Reference<css::beans::XPropertySet>& rDescriptor) override; + + virtual void SAL_CALL alterColumnByIndex( + sal_Int32 index, const css::uno::Reference<css::beans::XPropertySet>& descriptor) override; + + /** returns the ALTER TABLE XXX statement + */ + OUString getAlterTableColumnPart() const; +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx b/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx new file mode 100644 index 000000000000..dd59963075ea --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_tables.cxx @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "mysqlc_table.hxx" +#include "mysqlc_tables.hxx" +#include "mysqlc_catalog.hxx" + +#include <TConnection.hxx> + +#include <connectivity/dbtools.hxx> + +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbc/ColumnValue.hpp> +#include <comphelper/types.hxx> + +//----- OCollection ----------------------------------------------------------- +void connectivity::mysqlc::Tables::impl_refresh() +{ + static_cast<Catalog&>(m_rParent).refreshTables(); +} + +static void lcl_unescape(OUString& rName) +{ + // Remove ending ` if there's one + sal_Int32 nLastIndexBacktick = rName.lastIndexOf("`"); + if ((nLastIndexBacktick > 0) && (nLastIndexBacktick == (rName.getLength() - 1))) + { + rName = rName.copy(0, nLastIndexBacktick); + } + + // Remove beginning ` + nLastIndexBacktick = rName.indexOf("`"); + if (nLastIndexBacktick == 0) + { + rName = rName.copy(1, rName.getLength() - 1); + } + + // Replace double ` by simple ` + rName = rName.replaceAll("``", "`"); +} + +css::uno::Reference<css::beans::XPropertySet> +connectivity::mysqlc::Tables::createObject(const OUString& rName) +{ + OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents(m_xMetaData, rName, sCatalog, sSchema, sTable, + ::dbtools::EComposeRule::InDataManipulation); + + css::uno::Any aCatalog; + if (!sCatalog.isEmpty()) + { + lcl_unescape(sCatalog); + aCatalog <<= sCatalog; + } + + lcl_unescape(sSchema); + lcl_unescape(sTable); + + // Only retrieving a single table, so table type is irrelevant (param 4) + css::uno::Reference<css::sdbc::XResultSet> xTables + = m_xMetaData->getTables(aCatalog, sSchema, sTable, css::uno::Sequence<OUString>()); + + if (!xTables.is()) + throw css::uno::RuntimeException(u"Could not acquire table."_ustr); + + css::uno::Reference<css::sdbc::XRow> xRow(xTables, css::uno::UNO_QUERY_THROW); + + if (!xTables->next()) + throw css::uno::RuntimeException(); + + css::uno::Reference<css::beans::XPropertySet> xRet( + new Table(this, m_rMutex, m_xMetaData->getConnection(), + xRow->getString(1), // Catalog + xRow->getString(2), // Schema + xRow->getString(3), // Name + xRow->getString(4), // Type + xRow->getString(5))); // Description / Remarks / Comments + + if (xTables->next()) + throw css::uno::RuntimeException(u"Found more tables than expected."_ustr); + + return xRet; +} + +css::uno::Reference<css::beans::XPropertySet> connectivity::mysqlc::Tables::createDescriptor() +{ + // There is some internal magic so that the same class can be used as either + // a descriptor or as a normal table. See VTable.cxx for the details. In our + // case we just need to ensure we use the correct constructor. + return new Table(this, m_rMutex, m_xMetaData->getConnection()); +} + +//----- XAppend --------------------------------------------------------------- +void connectivity::mysqlc::Tables::createTable( + const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + const css::uno::Reference<css::sdbc::XConnection> xConnection = m_xMetaData->getConnection(); + OUString aSql = ::dbtools::createSqlCreateTableStatement(descriptor, xConnection); + + css::uno::Reference<css::sdbc::XStatement> xStmt = xConnection->createStatement(); + if (xStmt.is()) + { + xStmt->execute(aSql); + ::comphelper::disposeComponent(xStmt); + } +} + +// XAppend +css::uno::Reference<css::beans::XPropertySet> connectivity::mysqlc::Tables::appendObject( + const OUString& _rForName, const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + createTable(descriptor); + return createObject(_rForName); +} + +void connectivity::mysqlc::Tables::appendNew(const OUString& _rsNewTable) +{ + insertElement(_rsNewTable, nullptr); + + // notify our container listeners + css::container::ContainerEvent aEvent(static_cast<XContainer*>(this), + css::uno::Any(_rsNewTable), css::uno::Any(), + css::uno::Any()); + comphelper::OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners); + while (aListenerLoop.hasMoreElements()) + aListenerLoop.next()->elementInserted(aEvent); +} + +OUString connectivity::mysqlc::Tables::getNameForObject( + const css::uno::Reference<css::beans::XPropertySet>& _xObject) +{ + OSL_ENSURE(_xObject.is(), "OTables::getNameForObject: Object is NULL!"); + return ::dbtools::composeTableName(m_xMetaData, _xObject, + ::dbtools::EComposeRule::InDataManipulation, false) + .replaceAll(u"`", u"Ì€ `"); +} + +//----- XDrop ----------------------------------------------------------------- +void connectivity::mysqlc::Tables::dropObject(sal_Int32 nPosition, const OUString& sName) +{ + css::uno::Reference<css::beans::XPropertySet> xTable(getObject(nPosition)); + + if (connectivity::sdbcx::ODescriptor::isNew(xTable)) + return; + + OUString sType; + xTable->getPropertyValue(u"Type"_ustr) >>= sType; + + OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents(m_xMetaData, sName, sCatalog, sSchema, sTable, + ::dbtools::EComposeRule::InDataManipulation); + + OUString sComposedName(::dbtools::composeTableName( + m_xMetaData, sCatalog, sSchema, sTable, true, ::dbtools::EComposeRule::InDataManipulation)); + + m_xMetaData->getConnection()->createStatement()->execute("DROP " + sType + " " + sComposedName); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_tables.hxx b/connectivity/source/drivers/mysqlc/mysqlc_tables.hxx new file mode 100644 index 000000000000..0dff83f247f5 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_tables.hxx @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> + +#include <connectivity/sdbcx/VCollection.hxx> +#include <utility> + +namespace connectivity::mysqlc +{ +/** +* This implements com.sun.star.sdbcx.Container, which seems to be +* also known by the name of Tables and Collection. +*/ +class Tables : public ::connectivity::sdbcx::OCollection +{ +protected: + css::uno::Reference<css::sdbc::XDatabaseMetaData> m_xMetaData; + + // OCollection + virtual void impl_refresh() override; + virtual ::css::uno::Reference<css::beans::XPropertySet> + createObject(const OUString& rName) override; + virtual css::uno::Reference<css::beans::XPropertySet> createDescriptor() override; + virtual ::css::uno::Reference<css::beans::XPropertySet> + appendObject(const OUString& rName, + const css::uno::Reference<css::beans::XPropertySet>& rDescriptor) override; + + void createTable(const css::uno::Reference<css::beans::XPropertySet>& descriptor); + virtual OUString + getNameForObject(const css::uno::Reference<css::beans::XPropertySet>& _xObject) override; + // XDrop + virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; + +public: + Tables(css::uno::Reference<css::sdbc::XDatabaseMetaData> xMetaData, + ::cppu::OWeakObject& rParent, ::osl::Mutex& rMutex, + ::std::vector<OUString> const& rNames) + : sdbcx::OCollection(rParent, true, rMutex, rNames) + , m_xMetaData(std::move(xMetaData)) + { + } + + void appendNew(const OUString& _rsNewTable); + // TODO: should we also implement XDataDescriptorFactory, XRefreshable, + // XAppend, etc. ? +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_types.cxx b/connectivity/source/drivers/mysqlc/mysqlc_types.cxx index ca473cebd84f..b29360c59077 100644 --- a/connectivity/source/drivers/mysqlc/mysqlc_types.cxx +++ b/connectivity/source/drivers/mysqlc/mysqlc_types.cxx @@ -29,14 +29,14 @@ TypeInfoDef const mysqlc_types[] = { // ------------- MySQL-Type: BIT. SDBC-Type: Bit ------------- { "BIT", // Typename - com::sun::star::sdbc::DataType::BIT, // sdbc-type + css::sdbc::DataType::BIT, // sdbc-type 1, // Precision "", // Literal prefix "", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -48,14 +48,14 @@ TypeInfoDef const mysqlc_types[] = { // ------------ MySQL-Type: BOOL. SDBC-Type: Bit ------------- { "BOOL", // Typename - com::sun::star::sdbc::DataType::BIT, // sdbc-type + css::sdbc::DataType::BIT, // sdbc-type 1, // Precision "", // Literal prefix "", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -67,14 +67,14 @@ TypeInfoDef const mysqlc_types[] = { // --------- MySQL-Type: TINYINT SDBC-Type: TINYINT ---------- { "TINYINT", // Typename - com::sun::star::sdbc::DataType::TINYINT, // sdbc-type + css::sdbc::DataType::TINYINT, // sdbc-type 3, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -86,14 +86,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: BIGINT SDBC-Type: BIGINT ---------- { "BIGINT", // Typename - com::sun::star::sdbc::DataType::BIGINT, // sdbc-type + css::sdbc::DataType::BIGINT, // sdbc-type 19, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -105,14 +105,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: LONG VARBINARY SDBC-Type: LONGVARBINARY ---------- { "LONG VARBINARY", // Typename - com::sun::star::sdbc::DataType::LONGVARBINARY, // sdbc-type + css::sdbc::DataType::LONGVARBINARY, // sdbc-type 16777215, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -124,14 +124,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: MEDIUMBLOB SDBC-Type: LONGVARBINARY ---------- { "MEDIUMBLOB", // Typename - com::sun::star::sdbc::DataType::LONGVARBINARY, // sdbc-type + css::sdbc::DataType::LONGVARBINARY, // sdbc-type 16777215, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -143,14 +143,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: LONGBLOB SDBC-Type: LONGVARBINARY ---------- { "LONGBLOB", // Typename - com::sun::star::sdbc::DataType::LONGVARBINARY, // sdbc-type + css::sdbc::DataType::LONGVARBINARY, // sdbc-type -1, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -162,14 +162,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: BLOB SDBC-Type: LONGVARBINARY ---------- { "BLOB", // Typename - com::sun::star::sdbc::DataType::LONGVARBINARY, // sdbc-type + css::sdbc::DataType::LONGVARBINARY, // sdbc-type 0xFFFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -181,14 +181,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: TINYBLOB SDBC-Type: LONGVARBINARY ---------- { "TINYBLOB", // Typename - com::sun::star::sdbc::DataType::LONGVARBINARY, // sdbc-type + css::sdbc::DataType::LONGVARBINARY, // sdbc-type 0xFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -200,14 +200,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: VARBINARY SDBC-Type: VARBINARY ---------- { "VARBINARY", // Typename - com::sun::star::sdbc::DataType::VARBINARY, // sdbc-type + css::sdbc::DataType::VARBINARY, // sdbc-type 0xFF, // Precision "'", // Literal prefix "'", // Literal suffix "(M)", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -219,14 +219,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: BINARY SDBC-Type: BINARY ---------- { "BINARY", // Typename - com::sun::star::sdbc::DataType::BINARY, // sdbc-type + css::sdbc::DataType::BINARY, // sdbc-type 0xFF, // Precision "'", // Literal prefix "'", // Literal suffix "(M)", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable true, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -238,14 +238,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: LONG VARCHAR SDBC-Type: LONG VARCHAR ---------- { "LONG VARCHAR", // Typename - com::sun::star::sdbc::DataType::LONGVARCHAR, // sdbc-type + css::sdbc::DataType::LONGVARCHAR, // sdbc-type 0xFFFFFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -257,14 +257,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: MEDIUMTEXT SDBC-Type: LONG VARCHAR ---------- { "MEDIUMTEXT", // Typename - com::sun::star::sdbc::DataType::LONGVARCHAR, // sdbc-type + css::sdbc::DataType::LONGVARCHAR, // sdbc-type 0xFFFFFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -276,14 +276,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: LONGTEXT SDBC-Type: LONG VARCHAR ---------- { "LONGTEXT", // Typename - com::sun::star::sdbc::DataType::LONGVARCHAR, // sdbc-type + css::sdbc::DataType::LONGVARCHAR, // sdbc-type 0xFFFFFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -295,14 +295,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: TEXT SDBC-Type: LONG VARCHAR ---------- { "TEXT", // Typename - com::sun::star::sdbc::DataType::LONGVARCHAR, // sdbc-type + css::sdbc::DataType::LONGVARCHAR, // sdbc-type 0xFFFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -314,14 +314,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: TINYTEXT SDBC-Type: LONG VARCHAR ---------- { "TINYTEXT", // Typename - com::sun::star::sdbc::DataType::LONGVARCHAR, // sdbc-type + css::sdbc::DataType::LONGVARCHAR, // sdbc-type 0xFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -333,14 +333,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: CHAR SDBC-Type: CHAR ---------- { "CHAR", // Typename - com::sun::star::sdbc::DataType::CHAR, // sdbc-type + css::sdbc::DataType::CHAR, // sdbc-type 0xFF, // Precision "'", // Literal prefix "'", // Literal suffix "(M)", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -352,14 +352,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: DECIMAL SDBC-Type: DECIMAL ---------- { "DECIMAL", // Typename - com::sun::star::sdbc::DataType::DECIMAL, // sdbc-type + css::sdbc::DataType::DECIMAL, // sdbc-type 17, // Precision "", // Literal prefix "", // Literal suffix "[(M[,D])] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -371,14 +371,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: NUMERIC SDBC-Type: NUMERIC ---------- { "NUMERIC", // Typename - com::sun::star::sdbc::DataType::NUMERIC, // sdbc-type + css::sdbc::DataType::NUMERIC, // sdbc-type 17, // Precision "", // Literal prefix "", // Literal suffix "[(M[,D])] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -390,14 +390,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: INTEGER SDBC-Type: INTEGER ---------- { "INTEGER", // Typename - com::sun::star::sdbc::DataType::INTEGER, // sdbc-type + css::sdbc::DataType::INTEGER, // sdbc-type 10, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -409,14 +409,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: INT SDBC-Type: INTEGER ---------- { "INT", // Typename - com::sun::star::sdbc::DataType::INTEGER, // sdbc-type + css::sdbc::DataType::INTEGER, // sdbc-type 10, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -428,14 +428,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: MEDIUMINT SDBC-Type: INTEGER ---------- { "MEDIUMINT", // Typename - com::sun::star::sdbc::DataType::INTEGER, // sdbc-type + css::sdbc::DataType::INTEGER, // sdbc-type 7, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -447,14 +447,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: SMALLINT SDBC-Type: INTEGER ---------- { "SMALLINT", // Typename - com::sun::star::sdbc::DataType::SMALLINT, // sdbc-type + css::sdbc::DataType::SMALLINT, // sdbc-type 5, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -466,14 +466,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: FLOAT SDBC-Type: REAL ---------- { "FLOAT", // Typename - com::sun::star::sdbc::DataType::REAL, // sdbc-type + css::sdbc::DataType::REAL, // sdbc-type 10, // Precision "", // Literal prefix "", // Literal suffix "[(M,D)] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -485,14 +485,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: DOUBLE SDBC-Type: DOUBLE ---------- { "DOUBLE", // Typename - com::sun::star::sdbc::DataType::DOUBLE, // sdbc-type + css::sdbc::DataType::DOUBLE, // sdbc-type 17, // Precision "", // Literal prefix "", // Literal suffix "[(M,D)] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -504,14 +504,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: DOUBLE PRECISION SDBC-Type: DOUBLE ---------- { "DOUBLE PRECISION", // Typename - com::sun::star::sdbc::DataType::DOUBLE, // sdbc-type + css::sdbc::DataType::DOUBLE, // sdbc-type 17, // Precision "", // Literal prefix "", // Literal suffix "[(M,D)] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -523,14 +523,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: REAL SDBC-Type: DOUBLE ---------- { "REAL", // Typename - com::sun::star::sdbc::DataType::DOUBLE, // sdbc-type + css::sdbc::DataType::DOUBLE, // sdbc-type 17, // Precision "", // Literal prefix "", // Literal suffix "[(M,D)] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale true, // auto_increment @@ -542,14 +542,22 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: VARCHAR SDBC-Type: VARCHAR ---------- { "VARCHAR", // Typename - com::sun::star::sdbc::DataType::VARCHAR, // sdbc-type - 255, // Precision + css::sdbc::DataType::VARCHAR, // sdbc-type + // tdf#165928: a VARCHAR should be more than 255 characters + // Mysql/MariaDB accepts 65535 bytes + // see https://mariadb.com/docs/skysql-dbaas/ref/xpand/data-types/VARCHAR/ + // but precision corresponds to the number of characters and not the number of bytes: + // see https://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html + // Knowing that Unicode can use until 4 bytes, it means a varchar field can contain: + // 65535 / 4, so 16383 characters + // TODO if there's a way to retrieve the encoding, we could be more precise + 16383, // Precision "'", // Literal prefix "'", // Literal suffix "(M)", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -561,14 +569,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: ENUM SDBC-Type: VARCHAR ---------- { "ENUM", // Typename - com::sun::star::sdbc::DataType::VARCHAR, // sdbc-type + css::sdbc::DataType::VARCHAR, // sdbc-type 0xFFFF, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -580,14 +588,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: SET SDBC-Type: VARCHAR ---------- { "SET", // Typename - com::sun::star::sdbc::DataType::VARCHAR, // sdbc-type + css::sdbc::DataType::VARCHAR, // sdbc-type 64, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -599,14 +607,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: DATE SDBC-Type: DATE ---------- { "DATE", // Typename - com::sun::star::sdbc::DataType::DATE, // sdbc-type + css::sdbc::DataType::DATE, // sdbc-type 0, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -618,14 +626,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: TIME SDBC-Type: TIME ---------- { "TIME", // Typename - com::sun::star::sdbc::DataType::TIME, // sdbc-type + css::sdbc::DataType::TIME, // sdbc-type 0, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -637,14 +645,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: DATETIME SDBC-Type: TIMESTAMP ---------- { "DATETIME", // Typename - com::sun::star::sdbc::DataType::TIMESTAMP, // sdbc-type + css::sdbc::DataType::TIMESTAMP, // sdbc-type 0, // Precision "'", // Literal prefix "'", // Literal suffix "", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -656,14 +664,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: TIMESTAMP SDBC-Type: TIMESTAMP ---------- { "TIMESTAMP", // Typename - com::sun::star::sdbc::DataType::TIMESTAMP, // sdbc-type + css::sdbc::DataType::TIMESTAMP, // sdbc-type 0, // Precision "'", // Literal prefix "'", // Literal suffix "[(M)]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable false, // unsignable false, // fixed_prec_scale false, // auto_increment @@ -677,14 +685,14 @@ TypeInfoDef const mysqlc_types[] = { // ----------- MySQL-Type: YEAR SDBC-Type: INTEGER ---------- { "YEAR", // Typename - com::sun::star::sdbc::DataType::SMALLINT, // sdbc-type + css::sdbc::DataType::SMALLINT, // sdbc-type 10, // Precision "", // Literal prefix "", // Literal suffix "[(M)] [UNSIGNED] [ZEROFILL]", // Create params - com::sun::star::sdbc::ColumnValue::NULLABLE, // nullable + css::sdbc::ColumnValue::NULLABLE, // nullable false, // case sensitive - com::sun::star::sdbc::ColumnSearch::FULL, // searchable + css::sdbc::ColumnSearch::FULL, // searchable true, // unsignable false, // fixed_prec_scale true, // auto_increment diff --git a/connectivity/source/drivers/mysqlc/mysqlc_user.cxx b/connectivity/source/drivers/mysqlc/mysqlc_user.cxx new file mode 100644 index 000000000000..d4f6bdad8b25 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_user.cxx @@ -0,0 +1,211 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <utility> + +#include "mysqlc_user.hxx" +#include <comphelper/types.hxx> +#include <connectivity/dbtools.hxx> +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbcx/Privilege.hpp> +#include <com/sun/star/sdbcx/PrivilegeObject.hpp> +#include <TConnection.hxx> + +using namespace ::connectivity; +using namespace ::connectivity::mysqlc; +using namespace ::connectivity::sdbcx; + +using namespace ::com::sun::star; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::sdbcx; + +User::User(css::uno::Reference<css::sdbc::XConnection> xConnection) + : OUser(true) // Case Sensitive + , m_xConnection(std::move(xConnection)) +{ +} + +User::User(css::uno::Reference<css::sdbc::XConnection> xConnection, const OUString& rName) + : OUser(rName, + true) // Case Sensitive + , m_xConnection(std::move(xConnection)) +{ +} + +OUserExtend::OUserExtend(const css::uno::Reference<css::sdbc::XConnection>& xConnection, + const OUString& rName) + : User(xConnection, rName) +{ + construct(); +} + +void OUserExtend::construct() +{ + registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME), + PROPERTY_ID_NAME, 0, &m_Name, ::cppu::UnoType<OUString>::get()); + + registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD), + PROPERTY_ID_PASSWORD, 0, &m_Password, ::cppu::UnoType<OUString>::get()); +} + +void User::changePassword(const OUString& /* oldPassword */, const OUString& newPassword) +{ + css::uno::Reference<XStatement> statement = m_xConnection->createStatement(); + statement->execute("SET PASSWORD FOR " + m_Name + " = PASSWORD('" + newPassword + "')"); + ::comphelper::disposeComponent(statement); +} + +cppu::IPropertyArrayHelper* OUserExtend::createArrayHelper() const +{ + css::uno::Sequence<css::beans::Property> aProps; + describeProperties(aProps); + return new cppu::OPropertyArrayHelper(aProps); +} + +cppu::IPropertyArrayHelper& OUserExtend::getInfoHelper() +{ + return *OUserExtend_PROP::getArrayHelper(); +} + +typedef connectivity::sdbcx::OUser_BASE OUser_BASE_RBHELPER; + +sal_Int32 SAL_CALL User::getPrivileges(const OUString& objName, sal_Int32 objType) +{ + ::osl::MutexGuard aGuard(m_aMutex); + checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed); + + sal_Int32 nRights, nRightsWithGrant; + findPrivilegesAndGrantPrivileges(objName, objType, nRights, nRightsWithGrant); + return nRights; +} + +void User::findPrivilegesAndGrantPrivileges(const OUString& objName, sal_Int32 objType, + sal_Int32& nRights, sal_Int32& nRightsWithGrant) +{ + nRightsWithGrant = nRights = 0; + // first we need to create the sql stmt to select the privs + css::uno::Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData(); + OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents(xMeta, objName, sCatalog, sSchema, sTable, + ::dbtools::EComposeRule::InDataManipulation); + css::uno::Reference<XResultSet> xRes; + switch (objType) + { + case css::sdbcx::PrivilegeObject::TABLE: + case css::sdbcx::PrivilegeObject::VIEW: + { + css::uno::Any aCatalog; + if (!sCatalog.isEmpty()) + aCatalog <<= sCatalog; + xRes = xMeta->getTablePrivileges(aCatalog, sSchema, sTable); + } + break; + + case css::sdbcx::PrivilegeObject::COLUMN: + { + css::uno::Any aCatalog; + if (!sCatalog.isEmpty()) + aCatalog <<= sCatalog; + xRes = xMeta->getColumnPrivileges(aCatalog, sSchema, sTable, u"%"_ustr); + } + break; + } + + if (!xRes.is()) + return; + + static const char sYes[] = "YES"; + + nRightsWithGrant = nRights = 0; + + css::uno::Reference<XRow> xCurrentRow(xRes, css::uno::UNO_QUERY); + while (xCurrentRow.is() && xRes->next()) + { + OUString sGrantee = xCurrentRow->getString(5); + OUString sPrivilege = xCurrentRow->getString(6); + OUString sGrantable = xCurrentRow->getString(7); + + if (!m_Name.equalsIgnoreAsciiCase(sGrantee)) + continue; + + if (sPrivilege.equalsIgnoreAsciiCase("SELECT")) + { + nRights |= Privilege::SELECT; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::SELECT; + } + else if (sPrivilege.equalsIgnoreAsciiCase("INSERT")) + { + nRights |= Privilege::INSERT; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::INSERT; + } + else if (sPrivilege.equalsIgnoreAsciiCase("UPDATE")) + { + nRights |= Privilege::UPDATE; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::UPDATE; + } + else if (sPrivilege.equalsIgnoreAsciiCase("DELETE")) + { + nRights |= Privilege::DELETE; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::DELETE; + } + else if (sPrivilege.equalsIgnoreAsciiCase("READ")) + { + nRights |= Privilege::READ; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::READ; + } + else if (sPrivilege.equalsIgnoreAsciiCase("CREATE")) + { + nRights |= Privilege::CREATE; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::CREATE; + } + else if (sPrivilege.equalsIgnoreAsciiCase("ALTER")) + { + nRights |= Privilege::ALTER; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::ALTER; + } + else if (sPrivilege.equalsIgnoreAsciiCase("REFERENCES")) + { + nRights |= Privilege::REFERENCE; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::REFERENCE; + } + else if (sPrivilege.equalsIgnoreAsciiCase("DROP")) + { + nRights |= Privilege::DROP; + if (sGrantable.equalsIgnoreAsciiCase(sYes)) + nRightsWithGrant |= Privilege::DROP; + } + } + ::comphelper::disposeComponent(xRes); +} + +sal_Int32 SAL_CALL User::getGrantablePrivileges(const OUString& objName, sal_Int32 objType) +{ + ::osl::MutexGuard aGuard(m_aMutex); + checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed); + + sal_Int32 nRights, nRightsWithGrant; + findPrivilegesAndGrantPrivileges(objName, objType, nRights, nRightsWithGrant); + return nRightsWithGrant; +} + +//----- IRefreshableGroups ---------------------------------------------------- +void User::refreshGroups() +{ + // TODO: implement. +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_user.hxx b/connectivity/source/drivers/mysqlc/mysqlc_user.hxx new file mode 100644 index 000000000000..6bebbaa64a11 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_user.hxx @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <sdbcx/VUser.hxx> +#include <com/sun/star/sdbc/XConnection.hpp> + +namespace connectivity::mysqlc +{ +/** +* This implements com.sun.star.sdbcx.Container. +*/ +class User : public ::connectivity::sdbcx::OUser +{ + css::uno::Reference<css::sdbc::XConnection> m_xConnection; + +public: + /** + * Create a "new" descriptor, which isn't yet in the database. + */ + User(css::uno::Reference<css::sdbc::XConnection> xConnection); + /** + * For a user that already exists in the db. + */ + User(css::uno::Reference<css::sdbc::XConnection> xConnection, const OUString& rName); + + // XAuthorizable + virtual void SAL_CALL changePassword(const OUString&, const OUString& newPassword) override; + virtual sal_Int32 SAL_CALL getPrivileges(const OUString&, sal_Int32) override; + // return the privileges and additional the grant rights + /// @throws css::sdbc::SQLException + /// @throws css::uno::RuntimeException + void findPrivilegesAndGrantPrivileges(const OUString& objName, sal_Int32 objType, + sal_Int32& nRights, sal_Int32& nRightsWithGrant); + + virtual sal_Int32 SAL_CALL getGrantablePrivileges(const OUString&, sal_Int32) override; + + // IRefreshableGroups:: + virtual void refreshGroups() override; +}; + +class OUserExtend; +typedef ::comphelper::OPropertyArrayUsageHelper<OUserExtend> OUserExtend_PROP; + +class OUserExtend : public User, public OUserExtend_PROP +{ + OUString m_Password; + +protected: + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const override; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper() override; + +public: + OUserExtend(const css::uno::Reference<css::sdbc::XConnection>& _xConnection, + const OUString& rName); + + virtual void construct() override; +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_users.cxx b/connectivity/source/drivers/mysqlc/mysqlc_users.cxx new file mode 100644 index 000000000000..e2149d532d04 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_users.cxx @@ -0,0 +1,93 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <utility> + +#include "mysqlc_user.hxx" +#include "mysqlc_users.hxx" +#include <comphelper/types.hxx> +#include <connectivity/dbtools.hxx> +#include <TConnection.hxx> + +using namespace ::connectivity; +using namespace ::connectivity::mysqlc; +using namespace ::connectivity::sdbcx; +using namespace ::cppu; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::uno; + +Users::Users(const uno::Reference<XDatabaseMetaData>& rMetaData, OWeakObject& rParent, + Mutex& rMutex, ::std::vector<OUString> const& rNames) + : OCollection(rParent, true, rMutex, rNames) + , m_xMetaData(rMetaData) +{ +} + +//----- OCollection ----------------------------------------------------------- +void Users::impl_refresh() +{ + // TODO: IMPLEMENT ME +} + +css::uno::Reference<css::beans::XPropertySet> Users::createObject(const OUString& rName) +{ + return new OUserExtend(m_xMetaData->getConnection(), rName); +} + +uno::Reference<XPropertySet> Users::createDescriptor() +{ + // There is some internal magic so that the same class can be used as either + // a descriptor or as a normal user. See VUser.cxx for the details. In our + // case we just need to ensure we use the correct constructor. + return new OUserExtend(m_xMetaData->getConnection(), u""_ustr); +} + +//----- XAppend --------------------------------------------------------------- +css::uno::Reference<css::beans::XPropertySet> +Users::appendObject(const OUString& rName, const uno::Reference<XPropertySet>& descriptor) +{ + OUString aSql(u"GRANT USAGE ON * TO "_ustr); + OUString aQuote = m_xMetaData->getIdentifierQuoteString(); + aSql += ::dbtools::quoteName(aQuote, rName) + " @\"%\" "; + OUString sPassword; + descriptor->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD)) + >>= sPassword; + if (!sPassword.isEmpty()) + { + aSql += " IDENTIFIED BY '" + sPassword + "'"; + } + + Reference<XStatement> statement = m_xMetaData->getConnection()->createStatement(); + if (statement.is()) + statement->execute(aSql); + ::comphelper::disposeComponent(statement); + + return createObject(rName); +} + +//----- XDrop ----------------------------------------------------------------- +void Users::dropObject(sal_Int32 nPosition, const OUString& rName) +{ + uno::Reference<XPropertySet> xUser(getObject(nPosition)); + + if (!ODescriptor::isNew(xUser)) + { + Reference<XStatement> statement = m_xMetaData->getConnection()->createStatement(); + if (statement.is()) + { + statement->execute("DROP USER " + rName); + ::comphelper::disposeComponent(statement); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_users.hxx b/connectivity/source/drivers/mysqlc/mysqlc_users.hxx new file mode 100644 index 000000000000..42a1b8319ca8 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_users.hxx @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <connectivity/sdbcx/VCollection.hxx> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> + +namespace connectivity::mysqlc +{ +class Users : public ::connectivity::sdbcx::OCollection +{ + css::uno::Reference<css::sdbc::XDatabaseMetaData> m_xMetaData; + +protected: + // OCollection + virtual void impl_refresh() override; + virtual ::css::uno::Reference<css::beans::XPropertySet> + createObject(const OUString& rName) override; + virtual css::uno::Reference<css::beans::XPropertySet> createDescriptor() override; + virtual ::css::uno::Reference<css::beans::XPropertySet> + appendObject(const OUString& rName, + const css::uno::Reference<css::beans::XPropertySet>& rDescriptor) override; + +public: + Users(const css::uno::Reference<css::sdbc::XDatabaseMetaData>& rMetaData, + ::cppu::OWeakObject& rParent, ::osl::Mutex& rMutex, + ::std::vector<OUString> const& rNames); + + // TODO: we should also implement XDataDescriptorFactory, XRefreshable, + // XAppend, etc., but all are optional. + + // XDrop + virtual void dropObject(sal_Int32 nPosition, const OUString& rName) override; +}; +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_view.cxx b/connectivity/source/drivers/mysqlc/mysqlc_view.cxx new file mode 100644 index 000000000000..86837381d2bc --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_view.cxx @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "mysqlc_view.hxx" + +#include <propertyids.hxx> + +#include <com/sun/star/sdbc/XRow.hpp> + +namespace connectivity::mysqlc +{ +View::View(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, bool _bCaseSensitive, + const OUString& _rSchemaName, const OUString& _rName) + : View_Base(_bCaseSensitive, _rName, _rxConnection->getMetaData(), OUString(), _rSchemaName, + OUString()) + , m_xConnection(_rxConnection) +{ +} + +View::~View() {} + +void SAL_CALL View::acquire() noexcept { View_Base::acquire(); }; +void SAL_CALL View::release() noexcept { View_Base::release(); }; +css::uno::Any SAL_CALL View::queryInterface(const css::uno::Type& _rType) +{ + css::uno::Any aReturn = View_Base::queryInterface(_rType); + if (!aReturn.hasValue()) + aReturn = View_IBASE::queryInterface(_rType); + return aReturn; +} + +css::uno::Sequence<css::uno::Type> SAL_CALL View::getTypes() +{ + return ::comphelper::concatSequences(View_Base::getTypes(), View_IBASE::getTypes()); +} + +css::uno::Sequence<sal_Int8> SAL_CALL View::getImplementationId() +{ + return css::uno::Sequence<sal_Int8>(); +} + +void SAL_CALL View::alterCommand(const OUString& _rNewCommand) +{ + OUString aCommand = "ALTER VIEW " + m_SchemaName + "." + m_Name + " AS " + _rNewCommand; + m_xMetaData->getConnection()->createStatement()->execute(aCommand); +} + +void SAL_CALL View::getFastPropertyValue(css::uno::Any& _rValue, sal_Int32 _nHandle) const +{ + if (_nHandle == PROPERTY_ID_COMMAND) + { + // retrieve the very current command, don't rely on the base classes cached value + // (which we initialized empty, anyway) + _rValue <<= impl_getCommand(); + return; + } + + View_Base::getFastPropertyValue(_rValue, _nHandle); +} + +OUString View::impl_getCommand() const +{ + OUString aCommand("SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = '" + + m_SchemaName + "' AND TABLE_NAME = '" + m_Name + "'"); + //::utl::SharedUNOComponent< XStatement > xStatement; xStatement.set( m_xConnection->createStatement(), UNO_QUERY_THROW ); + css::uno::Reference<css::sdbc::XResultSet> xResult( + m_xMetaData->getConnection()->createStatement()->executeQuery(aCommand), + css::uno::UNO_SET_THROW); + if (!xResult->next()) + { + // hmm. There is no view the name as we know it. Can only mean some other instance + // dropped this view meanwhile... + std::abort(); + } + + css::uno::Reference<css::sdbc::XRow> xRow(xResult, css::uno::UNO_QUERY_THROW); + return xRow->getString(1); +} + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_view.hxx b/connectivity/source/drivers/mysqlc/mysqlc_view.hxx new file mode 100644 index 000000000000..8450152499c0 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_view.hxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <connectivity/sdbcx/VView.hxx> + +#include <com/sun/star/sdbcx/XAlterView.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> + +#include <comphelper/sequence.hxx> +#include <cppuhelper/implbase1.hxx> + +namespace connectivity::mysqlc +{ +typedef ::connectivity::sdbcx::OView View_Base; +typedef ::cppu::ImplHelper1<css::sdbcx::XAlterView> View_IBASE; + +class View : public View_Base, public View_IBASE +{ +public: + View(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, bool _bCaseSensitive, + const OUString& _rSchemaName, const OUString& _rName); + + // UNO + virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type& aType) override; + virtual void SAL_CALL acquire() noexcept override; + virtual void SAL_CALL release() noexcept override; + + virtual css::uno::Sequence<css::uno::Type> SAL_CALL getTypes() override; + virtual css::uno::Sequence<sal_Int8> SAL_CALL getImplementationId() override; + + // XAlterView + virtual void SAL_CALL alterCommand(const OUString& NewCommand) override; + +protected: + virtual ~View() override; + +protected: + // OPropertyContainer + virtual void SAL_CALL getFastPropertyValue(css::uno::Any& _rValue, + sal_Int32 _nHandle) const override; + +private: + /** retrieves the current command of the View */ + OUString impl_getCommand() const; + +private: + css::uno::Reference<css::sdbc::XConnection> m_xConnection; + + using View_Base::getFastPropertyValue; +}; + +} // namespace connectivity::mysqlc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_views.cxx b/connectivity/source/drivers/mysqlc/mysqlc_views.cxx new file mode 100644 index 000000000000..a603b84d04d1 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_views.cxx @@ -0,0 +1,114 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include "mysqlc_tables.hxx" +#include "mysqlc_views.hxx" +#include "mysqlc_view.hxx" +#include "mysqlc_catalog.hxx" +#include <connectivity/dbtools.hxx> +#include <comphelper/types.hxx> +#include <TConnection.hxx> + +connectivity::mysqlc::Views::Views(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, + ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, + const ::std::vector<OUString>& _rVector) + : sdbcx::OCollection(_rParent, true, _rMutex, _rVector) + , m_xConnection(_rxConnection) + , m_xMetaData(_rxConnection->getMetaData()) +{ +} + +css::uno::Reference<css::beans::XPropertySet> +connectivity::mysqlc::Views::createObject(const OUString& _rName) +{ + OUString sCatalog, sSchema, sTable; + ::dbtools::qualifiedNameComponents(m_xMetaData, _rName, sCatalog, sSchema, sTable, + ::dbtools::EComposeRule::InDataManipulation); + return new View(m_xConnection, isCaseSensitive(), sSchema, sTable); +} + +void connectivity::mysqlc::Views::impl_refresh() +{ + static_cast<Catalog&>(m_rParent).refreshViews(); +} + +css::uno::Reference<css::beans::XPropertySet> connectivity::mysqlc::Views::createDescriptor() +{ + return new connectivity::sdbcx::OView(true, m_xMetaData); +} + +// XAppend +css::uno::Reference<css::beans::XPropertySet> connectivity::mysqlc::Views::appendObject( + const OUString& _rForName, const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + createView(descriptor); + return createObject(_rForName); +} + +// XDrop +void connectivity::mysqlc::Views::dropObject(sal_Int32 _nPos, const OUString& /*_sElementName*/) +{ + css::uno::Reference<XInterface> xObject(getObject(_nPos)); + bool bIsNew = connectivity::sdbcx::ODescriptor::isNew(xObject); + if (!bIsNew) + { + OUString aSql(u"DROP VIEW"_ustr); + + css::uno::Reference<css::beans::XPropertySet> xProp(xObject, css::uno::UNO_QUERY); + aSql += ::dbtools::composeTableName(m_xMetaData, xProp, + ::dbtools::EComposeRule::InTableDefinitions, true); + + css::uno::Reference<css::sdbc::XConnection> xConnection = m_xMetaData->getConnection(); + css::uno::Reference<css::sdbc::XStatement> xStmt = xConnection->createStatement(); + xStmt->execute(aSql); + ::comphelper::disposeComponent(xStmt); + } +} + +void connectivity::mysqlc::Views::createView( + const css::uno::Reference<css::beans::XPropertySet>& descriptor) +{ + css::uno::Reference<css::sdbc::XConnection> xConnection = m_xMetaData->getConnection(); + + OUString sCommand; + descriptor->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_COMMAND)) + >>= sCommand; + + OUString aSql = "CREATE VIEW " + + ::dbtools::composeTableName(m_xMetaData, descriptor, + ::dbtools::EComposeRule::InTableDefinitions, true) + + " AS " + sCommand; + + css::uno::Reference<css::sdbc::XStatement> xStmt = xConnection->createStatement(); + if (xStmt.is()) + { + xStmt->execute(aSql); + ::comphelper::disposeComponent(xStmt); + } + connectivity::mysqlc::Tables* pTables = static_cast<connectivity::mysqlc::Tables*>( + static_cast<connectivity::mysqlc::Catalog&>(m_rParent).getPrivateTables()); + if (pTables) + { + OUString sName = ::dbtools::composeTableName( + m_xMetaData, descriptor, ::dbtools::EComposeRule::InDataManipulation, false); + pTables->appendNew(sName); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/mysqlc/mysqlc_views.hxx b/connectivity/source/drivers/mysqlc/mysqlc_views.hxx new file mode 100644 index 000000000000..f55d6a032184 --- /dev/null +++ b/connectivity/source/drivers/mysqlc/mysqlc_views.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#pragma once + +#include <connectivity/sdbcx/VCollection.hxx> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +namespace connectivity::mysqlc +{ +class Views final : public connectivity::sdbcx::OCollection +{ + css::uno::Reference<css::sdbc::XConnection> m_xConnection; + css::uno::Reference<css::sdbc::XDatabaseMetaData> m_xMetaData; + + // OCollection + virtual css::uno::Reference<css::beans::XPropertySet> + createObject(const OUString& _rName) override; + virtual void impl_refresh() override; + virtual css::uno::Reference<css::beans::XPropertySet> createDescriptor() override; + virtual css::uno::Reference<css::beans::XPropertySet> + appendObject(const OUString& _rForName, + const css::uno::Reference<css::beans::XPropertySet>& descriptor) override; + + void createView(const css::uno::Reference<css::beans::XPropertySet>& descriptor); + +public: + Views(const css::uno::Reference<css::sdbc::XConnection>& _rxConnection, + ::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, + const ::std::vector<OUString>& _rVector); + + // XDrop + virtual void dropObject(sal_Int32 _nPos, const OUString& _sElementName) override; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/odbc/OConnection.cxx b/connectivity/source/drivers/odbc/OConnection.cxx index 7ae8c46802e2..57b3891958fa 100644 --- a/connectivity/source/drivers/odbc/OConnection.cxx +++ b/connectivity/source/drivers/odbc/OConnection.cxx @@ -37,7 +37,6 @@ using namespace dbtools; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; @@ -67,20 +66,20 @@ OConnection::~OConnection() if (!m_bClosed) { - rc = N3SQLDisconnect( m_aConnectionHandle ); + rc = functions().Disconnect(m_aConnectionHandle); OSL_ENSURE( rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO, "Failure from SQLDisconnect" ); } - rc = N3SQLFreeHandle( SQL_HANDLE_DBC, m_aConnectionHandle ); + rc = functions().FreeHandle(SQL_HANDLE_DBC, m_aConnectionHandle); OSL_ENSURE( rc == SQL_SUCCESS , "Failure from SQLFreeHandle for connection"); m_aConnectionHandle = SQL_NULL_HANDLE; } -oslGenericFunction OConnection::getOdbcFunction(ODBC3SQLFunctionId _nIndex) const +const Functions& OConnection::functions() const { OSL_ENSURE(m_xDriver, "OConnection::getOdbcFunction: m_xDriver is null!"); - return m_xDriver->getOdbcFunction(_nIndex); + return m_xDriver->functions(); } SQLRETURN OConnection::OpenConnection(const OUString& aConnectStr, sal_Int32 nTimeOut, bool bSilent) @@ -91,48 +90,55 @@ SQLRETURN OConnection::OpenConnection(const OUString& aConnectStr, sal_Int32 nTi return -1; SQLRETURN nSQLRETURN = 0; - SDB_ODBC_CHAR szConnStrOut[4096] = {}; - SDB_ODBC_CHAR szConnStrIn[2048] = {}; - SQLSMALLINT cbConnStrOut; - OString aConStr(OUStringToOString(aConnectStr,getTextEncoding())); - memcpy(szConnStrIn, aConStr.getStr(), std::min<sal_Int32>(sal_Int32(2048),aConStr.getLength())); #ifndef MACOSX - N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_LOGIN_TIMEOUT,reinterpret_cast<SQLPOINTER>(nTimeOut),SQL_IS_UINTEGER); + functions().SetConnectAttr(m_aConnectionHandle,SQL_ATTR_LOGIN_TIMEOUT,reinterpret_cast<SQLPOINTER>(static_cast<sal_IntPtr>(nTimeOut)),SQL_IS_UINTEGER); #else (void)nTimeOut; /* WaE */ #endif #ifdef LINUX - (void) bSilent; - nSQLRETURN = N3SQLDriverConnect(m_aConnectionHandle, - nullptr, - szConnStrIn, - static_cast<SQLSMALLINT>(std::min(sal_Int32(2048),aConStr.getLength())), - szConnStrOut, - SQLSMALLINT(sizeof(szConnStrOut)/sizeof(SDB_ODBC_CHAR)) -1, - &cbConnStrOut, - SQL_DRIVER_NOPROMPT); + bSilent = true; +#endif //LINUX + SQLUSMALLINT nSilent = bSilent ? SQL_DRIVER_NOPROMPT : SQL_DRIVER_COMPLETE; + + if (bUseWChar && functions().has(ODBC3SQLFunctionId::DriverConnectW)) + { + SQLWChars sqlConnectStr(aConnectStr); + SQLWCHAR szConnStrOut[4096] = {}; + SQLSMALLINT cchConnStrOut; + nSQLRETURN = functions().DriverConnectW(m_aConnectionHandle, + nullptr, + sqlConnectStr.get(), + sqlConnectStr.cch(), + szConnStrOut, + std::size(szConnStrOut) - 1, + &cchConnStrOut, + nSilent); + } + else + { + SQLChars sqlConnectStr(aConnectStr, getTextEncoding()); + SQLCHAR szConnStrOut[4096] = {}; + SQLSMALLINT cbConnStrOut; + nSQLRETURN = functions().DriverConnect(m_aConnectionHandle, + nullptr, + sqlConnectStr.get(), + sqlConnectStr.cch(), + szConnStrOut, + std::size(szConnStrOut) - 1, + &cbConnStrOut, + nSilent); + } +#ifdef LINUX if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA || SQL_SUCCESS_WITH_INFO == nSQLRETURN) - return nSQLRETURN; #else - - SQLUSMALLINT nSilent = bSilent ? SQL_DRIVER_NOPROMPT : SQL_DRIVER_COMPLETE; - nSQLRETURN = N3SQLDriverConnect(m_aConnectionHandle, - nullptr, - szConnStrIn, - static_cast<SQLSMALLINT>(std::min<sal_Int32>(sal_Int32(2048),aConStr.getLength())), - szConnStrOut, - SQLSMALLINT(sizeof szConnStrOut), - &cbConnStrOut, - nSilent); if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA) +#endif return nSQLRETURN; m_bClosed = false; -#endif //LINUX - try { OUString aVal; @@ -157,7 +163,7 @@ SQLRETURN OConnection::OpenConnection(const OUString& aConnectStr, sal_Int32 nTi // autocommit is always default if (!m_bReadOnly) - N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_AUTOCOMMIT, reinterpret_cast<SQLPOINTER>(SQL_AUTOCOMMIT_ON),SQL_IS_INTEGER); + functions().SetConnectAttr(m_aConnectionHandle,SQL_ATTR_AUTOCOMMIT, reinterpret_cast<SQLPOINTER>(SQL_AUTOCOMMIT_ON),SQL_IS_INTEGER); return nSQLRETURN; } @@ -168,13 +174,13 @@ SQLRETURN OConnection::Construct(const OUString& url,const Sequence< PropertyVal m_sURL = url; setConnectionInfo(info); - N3SQLAllocHandle(SQL_HANDLE_DBC,m_pDriverHandleCopy,&m_aConnectionHandle); + functions().AllocHandle(SQL_HANDLE_DBC,m_pDriverHandleCopy,&m_aConnectionHandle); if(m_aConnectionHandle == SQL_NULL_HANDLE) throw SQLException(); sal_Int32 nLen = url.indexOf(':'); nLen = url.indexOf(':',nLen+2); - OUString aDSN("DSN="), aUID, aPWD, aSysDrvSettings; + OUString aDSN(u"DSN="_ustr), aUID, aPWD, aSysDrvSettings; aDSN += url.subView(nLen+1); sal_Int32 nTimeout = 20; @@ -267,7 +273,7 @@ SQLRETURN OConnection::Construct(const OUString& url,const Sequence< PropertyVal } // XServiceInfo -IMPLEMENT_SERVICE_INFO(OConnection, "com.sun.star.sdbc.drivers.odbc.OConnection", "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(OConnection, u"com.sun.star.sdbc.drivers.odbc.OConnection"_ustr, u"com.sun.star.sdbc.Connection"_ustr) Reference< XStatement > SAL_CALL OConnection::createStatement( ) @@ -292,19 +298,34 @@ Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( const OU Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall( const OUString& /*sql*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::prepareCall", *this ); - return nullptr; + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::prepareCall"_ustr, *this ); } OUString SAL_CALL OConnection::nativeSQL( const OUString& sql ) { ::osl::MutexGuard aGuard( m_aMutex ); - OString aSql(OUStringToOString(sql,getTextEncoding())); - char pOut[2048]; SQLINTEGER nOutLen; - OTools::ThrowException(this,N3SQLNativeSql(m_aConnectionHandle,reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(aSql.getStr())),aSql.getLength(),reinterpret_cast<SDB_ODBC_CHAR*>(pOut),sizeof pOut - 1,&nOutLen),m_aConnectionHandle,SQL_HANDLE_DBC,*this); - return OUString(pOut,nOutLen,getTextEncoding()); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::NativeSqlW)) + { + SQLWChars nativeSQL(sql); + SQLWCHAR pOut[2048]; + SQLRETURN ret = functions().NativeSqlW(m_aConnectionHandle, + nativeSQL.get(), nativeSQL.cch(), + pOut, std::size(pOut) - 1, &nOutLen); + OTools::ThrowException(this, ret, m_aConnectionHandle, SQL_HANDLE_DBC, *this); + return toUString(pOut, nOutLen); + } + else + { + SQLChars nativeSQL(sql, getTextEncoding()); + SQLCHAR pOut[2048]; + SQLRETURN ret = functions().NativeSql(m_aConnectionHandle, + nativeSQL.get(), nativeSQL.cch(), + pOut, std::size(pOut) - 1, &nOutLen); + OTools::ThrowException(this, ret, m_aConnectionHandle, SQL_HANDLE_DBC, *this); + return toUString(pOut, nOutLen, getTextEncoding()); + } } void SAL_CALL OConnection::setAutoCommit( sal_Bool autoCommit ) @@ -312,10 +333,10 @@ void SAL_CALL OConnection::setAutoCommit( sal_Bool autoCommit ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - - OTools::ThrowException(this,N3SQLSetConnectAttr(m_aConnectionHandle, + const sal_IntPtr nAutocommit = autoCommit ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF; + OTools::ThrowException(this,functions().SetConnectAttr(m_aConnectionHandle, SQL_ATTR_AUTOCOMMIT, - reinterpret_cast<SQLPOINTER>((autoCommit) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF) ,SQL_IS_INTEGER), + reinterpret_cast<SQLPOINTER>(nAutocommit) ,SQL_IS_INTEGER), m_aConnectionHandle,SQL_HANDLE_DBC,*this); } @@ -326,7 +347,7 @@ sal_Bool SAL_CALL OConnection::getAutoCommit( ) sal_uInt32 nOption = 0; - OTools::ThrowException(this,N3SQLGetConnectAttr(m_aConnectionHandle, + OTools::ThrowException(this,functions().GetConnectAttr(m_aConnectionHandle, SQL_ATTR_AUTOCOMMIT, &nOption,0,nullptr),m_aConnectionHandle,SQL_HANDLE_DBC,*this); return nOption == SQL_AUTOCOMMIT_ON ; } @@ -337,7 +358,7 @@ void SAL_CALL OConnection::commit( ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - OTools::ThrowException(this,N3SQLEndTran(SQL_HANDLE_DBC,m_aConnectionHandle,SQL_COMMIT),m_aConnectionHandle,SQL_HANDLE_DBC,*this); + OTools::ThrowException(this,functions().EndTran(SQL_HANDLE_DBC,m_aConnectionHandle,SQL_COMMIT),m_aConnectionHandle,SQL_HANDLE_DBC,*this); } void SAL_CALL OConnection::rollback( ) @@ -346,7 +367,7 @@ void SAL_CALL OConnection::rollback( ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - OTools::ThrowException(this,N3SQLEndTran(SQL_HANDLE_DBC,m_aConnectionHandle,SQL_ROLLBACK),m_aConnectionHandle,SQL_HANDLE_DBC,*this); + OTools::ThrowException(this,functions().EndTran(SQL_HANDLE_DBC,m_aConnectionHandle,SQL_ROLLBACK),m_aConnectionHandle,SQL_HANDLE_DBC,*this); } sal_Bool SAL_CALL OConnection::isClosed( ) @@ -378,7 +399,7 @@ void SAL_CALL OConnection::setReadOnly( sal_Bool readOnly ) OTools::ThrowException(this, - N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_ACCESS_MODE,reinterpret_cast< SQLPOINTER >( readOnly ),SQL_IS_INTEGER), + functions().SetConnectAttr(m_aConnectionHandle,SQL_ATTR_ACCESS_MODE,reinterpret_cast< SQLPOINTER >( readOnly ),SQL_IS_INTEGER), m_aConnectionHandle,SQL_HANDLE_DBC,*this); } @@ -393,11 +414,20 @@ void SAL_CALL OConnection::setCatalog( const OUString& catalog ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - - OString aCat(OUStringToOString(catalog,getTextEncoding())); - OTools::ThrowException(this, - N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,const_cast<char *>(aCat.getStr()),SQL_NTS), - m_aConnectionHandle,SQL_HANDLE_DBC,*this); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::SetConnectAttrW)) + { + SQLWChars sqlCatalog(catalog); + OTools::ThrowException(this, + functions().SetConnectAttrW(m_aConnectionHandle, SQL_ATTR_CURRENT_CATALOG, sqlCatalog.get(), SQL_NTSL), + m_aConnectionHandle,SQL_HANDLE_DBC,*this); + } + else + { + SQLChars sqlCatalog(catalog, getTextEncoding()); + OTools::ThrowException(this, + functions().SetConnectAttr(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,sqlCatalog.get(),SQL_NTS), + m_aConnectionHandle,SQL_HANDLE_DBC,*this); + } } OUString SAL_CALL OConnection::getCatalog( ) @@ -405,14 +435,25 @@ OUString SAL_CALL OConnection::getCatalog( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - SQLINTEGER nValueLen; - char pCat[1024]; - OTools::ThrowException(this, - N3SQLGetConnectAttr(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,pCat,(sizeof pCat)-1,&nValueLen), - m_aConnectionHandle,SQL_HANDLE_DBC,*this); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::GetConnectAttrW)) + { + SQLWCHAR pCat[1024]; + // SQLGetConnectAttrW gets/returns count of bytes, not characters + OTools::ThrowException(this, + functions().GetConnectAttrW(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,pCat,sizeof(pCat)-sizeof(SQLWCHAR),&nValueLen), + m_aConnectionHandle,SQL_HANDLE_DBC,*this); + return toUString(pCat, nValueLen / sizeof(SQLWCHAR)); + } + else + { + SQLCHAR pCat[1024]; + OTools::ThrowException(this, + functions().GetConnectAttr(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,pCat,sizeof(pCat)-1,&nValueLen), + m_aConnectionHandle,SQL_HANDLE_DBC,*this); - return OUString(pCat,nValueLen,getTextEncoding()); + return toUString(pCat, nValueLen, getTextEncoding()); + } } void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) @@ -421,9 +462,9 @@ void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) checkDisposed(OConnection_BASE::rBHelper.bDisposed); - OTools::ThrowException(this,N3SQLSetConnectAttr(m_aConnectionHandle, + OTools::ThrowException(this,functions().SetConnectAttr(m_aConnectionHandle, SQL_ATTR_TXN_ISOLATION, - reinterpret_cast<SQLPOINTER>(level),SQL_IS_INTEGER), + reinterpret_cast<SQLPOINTER>(static_cast<sal_IntPtr>(level)),SQL_IS_INTEGER), m_aConnectionHandle,SQL_HANDLE_DBC,*this); } @@ -436,7 +477,7 @@ sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) sal_Int32 nTxn = 0; SQLINTEGER nValueLen; OTools::ThrowException(this, - N3SQLGetConnectAttr(m_aConnectionHandle,SQL_ATTR_TXN_ISOLATION,&nTxn,sizeof nTxn,&nValueLen), + functions().GetConnectAttr(m_aConnectionHandle,SQL_ATTR_TXN_ISOLATION,&nTxn,sizeof nTxn,&nValueLen), m_aConnectionHandle,SQL_HANDLE_DBC,*this); return nTxn; } @@ -452,7 +493,7 @@ Reference< css::container::XNameAccess > SAL_CALL OConnection::getTypeMap( ) void SAL_CALL OConnection::setTypeMap( const Reference< css::container::XNameAccess >& /*typeMap*/ ) { - ::dbtools::throwFeatureNotImplementedSQLException( "XConnection::setTypeMap", *this ); + ::dbtools::throwFeatureNotImplementedSQLException( u"XConnection::setTypeMap"_ustr, *this ); } // XCloseable @@ -488,7 +529,7 @@ void OConnection::disposing() m_aConnections.clear(); if(!m_bClosed) - N3SQLDisconnect(m_aConnectionHandle); + functions().Disconnect(m_aConnectionHandle); m_bClosed = true; } @@ -503,7 +544,7 @@ SQLHANDLE OConnection::createStatementHandle() { rtl::Reference xConnection(new OConnection(m_pDriverHandleCopy,m_xDriver.get())); xConnection->Construct(m_sURL,getConnectionInfo()); - xConnectionTemp = xConnection; + xConnectionTemp = std::move(xConnection); bNew = true; } } @@ -512,7 +553,7 @@ SQLHANDLE OConnection::createStatementHandle() } SQLHANDLE aStatementHandle = SQL_NULL_HANDLE; - N3SQLAllocHandle(SQL_HANDLE_STMT,xConnectionTemp->getConnection(),&aStatementHandle); + functions().AllocHandle(SQL_HANDLE_STMT,xConnectionTemp->getConnection(),&aStatementHandle); ++m_nStatementCount; if(bNew) m_aConnections.emplace(aStatementHandle,xConnectionTemp); @@ -528,10 +569,10 @@ void OConnection::freeStatementHandle(SQLHANDLE& _pHandle) auto aFind = m_aConnections.find(_pHandle); - N3SQLFreeStmt(_pHandle,SQL_RESET_PARAMS); - N3SQLFreeStmt(_pHandle,SQL_UNBIND); - N3SQLFreeStmt(_pHandle,SQL_CLOSE); - N3SQLFreeHandle(SQL_HANDLE_STMT,_pHandle); + functions().FreeStmt(_pHandle,SQL_RESET_PARAMS); + functions().FreeStmt(_pHandle,SQL_UNBIND); + functions().FreeStmt(_pHandle,SQL_CLOSE); + functions().FreeHandle(SQL_HANDLE_STMT,_pHandle); _pHandle = SQL_NULL_HANDLE; diff --git a/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx b/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx index 957142027182..97cd0b1b33d9 100644 --- a/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx +++ b/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx @@ -28,11 +28,10 @@ #include <TPrivilegesResultSet.hxx> #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> +#include <o3tl/string_view.hxx> using namespace connectivity::odbc; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; ODatabaseMetaData::ODatabaseMetaData(const SQLHANDLE _pHandle,OConnection* _pCon) @@ -41,7 +40,7 @@ ODatabaseMetaData::ODatabaseMetaData(const SQLHANDLE _pHandle,OConnection* _pCon ,m_pConnection(_pCon) ,m_bUseCatalog(true) { - OSL_ENSURE(m_pConnection,"ODatabaseMetaData::ODatabaseMetaData: No connection set!"); + assert(m_pConnection && "ODatabaseMetaData::ODatabaseMetaData: No connection set!"); if(!m_pConnection->isCatalogUsed()) { osl_atomic_increment( &m_refCount ); @@ -1241,7 +1240,7 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion( ) try { OUString aValue; OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this,m_pConnection->getTextEncoding()); - return aValue.copy(0,aValue.indexOf('.')).toInt32(); + return o3tl::toInt32(aValue.subView(0,aValue.indexOf('.'))); } catch (const SQLException &) { @@ -1277,7 +1276,7 @@ sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion( ) try { OUString aValue; OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this,m_pConnection->getTextEncoding()); - return aValue.copy(0,aValue.lastIndexOf('.')).toInt32(); + return o3tl::toInt32(aValue.subView(0,aValue.lastIndexOf('.'))); } catch (const SQLException &) { diff --git a/connectivity/source/drivers/odbc/ODatabaseMetaDataResultSet.cxx b/connectivity/source/drivers/odbc/ODatabaseMetaDataResultSet.cxx index ae6eeb4fddeb..bc5b08f5550d 100644 --- a/connectivity/source/drivers/odbc/ODatabaseMetaDataResultSet.cxx +++ b/connectivity/source/drivers/odbc/ODatabaseMetaDataResultSet.cxx @@ -24,6 +24,7 @@ #include <comphelper/property.hxx> #include <cppuhelper/typeprovider.hxx> #include <comphelper/sequence.hxx> +#include <comphelper/stl_types.hxx> #include <odbc/OResultSetMetaData.hxx> #include <odbc/OTools.hxx> #include <comphelper/types.hxx> @@ -47,7 +48,6 @@ ODatabaseMetaDataResultSet::ODatabaseMetaDataResultSet(OConnection* _pConnection ,OPropertySetHelper(ODatabaseMetaDataResultSet_BASE::rBHelper) ,m_aStatementHandle(_pConnection->createStatementHandle()) - ,m_aStatement(nullptr) ,m_pConnection(_pConnection) ,m_nTextEncoding(_pConnection->getTextEncoding()) ,m_nRowPos(-1) @@ -84,7 +84,6 @@ void ODatabaseMetaDataResultSet::disposing() m_pConnection->freeStatementHandle(m_aStatementHandle); - m_aStatement = nullptr; m_xMetaData.clear(); m_pConnection.clear(); } @@ -151,8 +150,6 @@ sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::findColumn( const OUString& colum } ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); - return 0; // Never reached } template < typename T, SQLSMALLINT sqlTypeId > T ODatabaseMetaDataResultSet::getInteger ( sal_Int32 columnIndex ) @@ -182,17 +179,14 @@ template < typename T, SQLSMALLINT sqlTypeId > T ODatabaseMetaDataResultSet::get Reference< css::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getBinaryStream( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBinaryStream", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBinaryStream"_ustr, *this ); } Reference< css::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getCharacterStream", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getCharacterStream"_ustr, *this ); } - sal_Bool SAL_CALL ODatabaseMetaDataResultSet::getBoolean( sal_Int32 columnIndex ) { @@ -245,7 +239,7 @@ Sequence< sal_Int8 > SAL_CALL ODatabaseMetaDataResultSet::getBytes( sal_Int32 co case DataType::VARCHAR: case DataType::LONGVARCHAR: { - OUString const & aRet = OTools::getStringValue(m_pConnection.get(),m_aStatementHandle,columnIndex,SQL_C_BINARY,m_bWasNull,**this,m_nTextEncoding); + OUString const aRet = OTools::getStringValue(m_pConnection.get(),m_aStatementHandle,columnIndex,SQL_C_BINARY,m_bWasNull,**this,m_nTextEncoding); return Sequence<sal_Int8>(reinterpret_cast<const sal_Int8*>(aRet.getStr()),sizeof(sal_Unicode)*aRet.getLength()); } } @@ -342,34 +336,29 @@ Reference< XResultSetMetaData > SAL_CALL ODatabaseMetaDataResultSet::getMetaData Reference< XArray > SAL_CALL ODatabaseMetaDataResultSet::getArray( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getArray", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getArray"_ustr, *this ); } Reference< XClob > SAL_CALL ODatabaseMetaDataResultSet::getClob( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getClob", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getClob"_ustr, *this ); } Reference< XBlob > SAL_CALL ODatabaseMetaDataResultSet::getBlob( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBlob", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBlob"_ustr, *this ); } Reference< XRef > SAL_CALL ODatabaseMetaDataResultSet::getRef( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getRef", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getRef"_ustr, *this ); } Any SAL_CALL ODatabaseMetaDataResultSet::getObject( sal_Int32 /*columnIndex*/, const Reference< css::container::XNameAccess >& /*typeMap*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getObject", *this ); - return Any(); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getObject"_ustr, *this ); } @@ -506,7 +495,7 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::first( ) m_bEOF = false; - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_FIRST,0); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_FIRST,0); OTools::ThrowException(m_pConnection.get(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); bool bRet = ( m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO ); if( bRet ) @@ -521,7 +510,7 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::last( ) ::osl::MutexGuard aGuard( m_aMutex ); - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_LAST,0); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_LAST,0); OTools::ThrowException(m_pConnection.get(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); // here I know definitely that I stand on the last record bool bRet = ( m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO ); @@ -538,7 +527,7 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::absolute( sal_Int32 row ) m_bEOF = false; - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_ABSOLUTE,row); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_ABSOLUTE,row); OTools::ThrowException(m_pConnection.get(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO; if(bRet) @@ -554,7 +543,7 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::relative( sal_Int32 row ) m_bEOF = false; - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,row); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,row); OTools::ThrowException(m_pConnection.get(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO; if(bRet) @@ -570,7 +559,7 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::previous( ) m_bEOF = false; - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0); OTools::ThrowException(m_pConnection.get(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO; if(bRet) @@ -636,8 +625,8 @@ sal_Bool SAL_CALL ODatabaseMetaDataResultSet::next( ) m_bEOF = false; SQLRETURN nOldFetchStatus = m_nCurrentFetchState; - // m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_NEXT,0); - m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle); + // m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_NEXT,0); + m_nCurrentFetchState = functions().Fetch(m_aStatementHandle); OTools::ThrowException(m_pConnection.get(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO; if(bRet || ( m_nCurrentFetchState == SQL_NO_DATA && nOldFetchStatus != SQL_NO_DATA ) ) @@ -672,7 +661,7 @@ void SAL_CALL ODatabaseMetaDataResultSet::cancel( ) ::osl::MutexGuard aGuard( m_aMutex ); - N3SQLCancel(m_aStatementHandle); + functions().Cancel(m_aStatementHandle); } void SAL_CALL ODatabaseMetaDataResultSet::clearWarnings( ) @@ -689,30 +678,50 @@ sal_Int32 ODatabaseMetaDataResultSet::getFetchSize() return 1; } -OUString ODatabaseMetaDataResultSet::getCursorName() +const OUString & ODatabaseMetaDataResultSet::getCursorName() { - return OUString(); + return EMPTY_OUSTRING; } ::cppu::IPropertyArrayHelper* ODatabaseMetaDataResultSet::createArrayHelper( ) const { - Sequence< css::beans::Property > aProps(5); - css::beans::Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + } + } + }; } ::cppu::IPropertyArrayHelper & ODatabaseMetaDataResultSet::getInfoHelper() @@ -815,55 +824,59 @@ void ODatabaseMetaDataResultSet::openTypeInfo() aMap[SQL_GUID] = DataType::VARBINARY; - m_aValueRange[2] = aMap; + m_aValueRange[2] = std::move(aMap); - OTools::ThrowException(m_pConnection.get(),N3SQLGetTypeInfo(m_aStatementHandle, SQL_ALL_TYPES),m_aStatementHandle,SQL_HANDLE_STMT,*this); + OTools::ThrowException(m_pConnection.get(),functions().GetTypeInfo(m_aStatementHandle, SQL_ALL_TYPES),m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openTables(const Any& catalog, const OUString& schemaPattern, - std::u16string_view tableNamePattern, + const OUString& tableNamePattern, const Sequence< OUString >& types ) { - OString aPKQ,aPKO,aPKN,aCOL; - const OUString *pSchemaPat = nullptr; - - if(schemaPattern != "%") - pSchemaPat = &schemaPattern; - else - pSchemaPat = nullptr; - - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schemaPattern,m_nTextEncoding); - aPKN = OUStringToOString(tableNamePattern,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(); - - - const char *pCOL = nullptr; - const char* const pComma = ","; - const OUString* pBegin = types.getConstArray(); - const OUString* pEnd = pBegin + types.getLength(); - for(;pBegin != pEnd;++pBegin) + OUString uPKQ; + catalog >>= uPKQ; + OUStringBuffer uCOL; + comphelper::intersperse(types.begin(), types.end(), comphelper::OUStringBufferAppender(uCOL), u","); + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::TablesW)) { - aCOL += OUStringToOString(*pBegin,m_nTextEncoding) + pComma; + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLWChars(schemaPattern); + SQLWChars aPKN(tableNamePattern); + SQLWChars aCOL = !uCOL.isEmpty() ? SQLWChars(uCOL.makeStringAndClear()) : SQLWChars(u"" SQL_ALL_TABLE_TYPES ""_ustr); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().TablesW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL, + aCOL.get(), SQL_NTSL); } - if ( !aCOL.isEmpty() ) + else { - aCOL = aCOL.replaceAt(aCOL.getLength()-1,1,pComma); - pCOL = aCOL.getStr(); + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLChars(schemaPattern, m_nTextEncoding); + SQLChars aPKN(tableNamePattern, m_nTextEncoding); + SQLChars aCOL = !uCOL.isEmpty() ? SQLChars(uCOL, m_nTextEncoding) : SQLChars(SQL_ALL_TABLE_TYPES ""_ostr); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().Tables(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS, + aCOL.get(), SQL_NTS); } - else - pCOL = SQL_ALL_TABLE_TYPES; - - SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pCOL)), pCOL ? SQL_NTS : 0); OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); @@ -871,11 +884,23 @@ void ODatabaseMetaDataResultSet::openTables(const Any& catalog, const OUString& void ODatabaseMetaDataResultSet::openTablesTypes( ) { - SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle, - nullptr,0, - nullptr,0, - nullptr,0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(SQL_ALL_TABLE_TYPES)),SQL_NTS); + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::TablesW)) + { + nRetcode = functions().TablesW(m_aStatementHandle, + nullptr, 0, + nullptr, 0, + nullptr, 0, + SQLWChars(u"" SQL_ALL_TABLE_TYPES ""_ustr).get(), SQL_NTSL); + } + else + { + nRetcode = functions().Tables(m_aStatementHandle, + nullptr,0, + nullptr,0, + nullptr,0, + SQLChars(SQL_ALL_TABLE_TYPES ""_ostr).get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); m_aColMapping.clear(); @@ -887,12 +912,23 @@ void ODatabaseMetaDataResultSet::openTablesTypes( ) void ODatabaseMetaDataResultSet::openCatalogs() { - SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(SQL_ALL_CATALOGS)),SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>("")),SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>("")),SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>("")),SQL_NTS); - + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::TablesW)) + { + nRetcode = functions().TablesW(m_aStatementHandle, + SQLWChars(u"" SQL_ALL_CATALOGS ""_ustr).get(), SQL_NTSL, + SQLWChars(u""_ustr).get(), SQL_NTSL, + SQLWChars(u""_ustr).get(), SQL_NTSL, + SQLWChars(u""_ustr).get(), SQL_NTSL); + } + else + { + nRetcode = functions().Tables(m_aStatementHandle, + SQLChars(SQL_ALL_CATALOGS ""_ostr).get(), SQL_NTS, + SQLChars(""_ostr).get(), SQL_NTS, + SQLChars(""_ostr).get(), SQL_NTS, + SQLChars(""_ostr).get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); m_aColMapping.clear(); @@ -904,11 +940,23 @@ void ODatabaseMetaDataResultSet::openCatalogs() void ODatabaseMetaDataResultSet::openSchemas() { - SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>("")),SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(SQL_ALL_SCHEMAS)),SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>("")),SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>("")),SQL_NTS); + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::TablesW)) + { + nRetcode = functions().TablesW(m_aStatementHandle, + SQLWChars(u""_ustr).get(), SQL_NTSL, + SQLWChars(u"" SQL_ALL_SCHEMAS ""_ustr).get(), SQL_NTSL, + SQLWChars(u""_ustr).get(),SQL_NTSL, + SQLWChars(u""_ustr).get(),SQL_NTSL); + } + else + { + nRetcode = functions().Tables(m_aStatementHandle, + SQLChars(""_ostr).get(), SQL_NTS, + SQLChars(SQL_ALL_SCHEMAS ""_ostr).get(), SQL_NTS, + SQLChars(""_ostr).get(), SQL_NTS, + SQLChars(""_ostr).get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); m_aColMapping.clear(); @@ -919,69 +967,99 @@ void ODatabaseMetaDataResultSet::openSchemas() } void ODatabaseMetaDataResultSet::openColumnPrivileges( const Any& catalog, const OUString& schema, - std::u16string_view table, - std::u16string_view columnNamePattern ) + const OUString& table, + const OUString& columnNamePattern ) { - const OUString *pSchemaPat = nullptr; - - if(schema != "%") - pSchemaPat = &schema; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ColumnPrivilegesW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLWChars(schema); + SQLWChars aPKN(table); + SQLWChars aCOL(columnNamePattern); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().ColumnPrivilegesW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL, + aCOL.get(), SQL_NTSL); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN,aCOL; - - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schema,m_nTextEncoding); - aPKN = OUStringToOString(table,m_nTextEncoding); - aCOL = OUStringToOString(columnNamePattern,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(), - *pCOL = aCOL.getStr(); - - - SQLRETURN nRetcode = N3SQLColumnPrivileges(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pCOL)), SQL_NTS); + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLChars(schema, m_nTextEncoding); + SQLChars aPKN(table, m_nTextEncoding); + SQLChars aCOL(columnNamePattern, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().ColumnPrivileges(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS, + aCOL.get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openColumns( const Any& catalog, const OUString& schemaPattern, - std::u16string_view tableNamePattern, std::u16string_view columnNamePattern ) + const OUString& tableNamePattern, const OUString& columnNamePattern ) { - const OUString *pSchemaPat = nullptr; - - if(schemaPattern != "%") - pSchemaPat = &schemaPattern; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ColumnsW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLWChars(schemaPattern); + SQLWChars aPKN(tableNamePattern); + SQLWChars aCOL(columnNamePattern); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().ColumnsW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL, + aCOL.get(), SQL_NTSL); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN,aCOL; - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schemaPattern,m_nTextEncoding); - aPKN = OUStringToOString(tableNamePattern,m_nTextEncoding); - aCOL = OUStringToOString(columnNamePattern,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(), - *pCOL = aCOL.getStr(); - - - SQLRETURN nRetcode = N3SQLColumns(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pCOL)), SQL_NTS); - + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLChars(schemaPattern, m_nTextEncoding); + SQLChars aPKN(tableNamePattern, m_nTextEncoding); + SQLChars aCOL(columnNamePattern, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().Columns(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS, + aCOL.get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); ::std::map<sal_Int32,sal_Int32> aMap; aMap[SQL_BIT] = DataType::BIT; @@ -1016,79 +1094,108 @@ void ODatabaseMetaDataResultSet::openColumns( const Any& catalog, aMap[SQL_GUID] = DataType::VARBINARY; - m_aValueRange[5] = aMap; + m_aValueRange[5] = std::move(aMap); checkColumnCount(); } void ODatabaseMetaDataResultSet::openProcedureColumns( const Any& catalog, const OUString& schemaPattern, - std::u16string_view procedureNamePattern,std::u16string_view columnNamePattern ) + const OUString& procedureNamePattern,const OUString& columnNamePattern ) { - const OUString *pSchemaPat = nullptr; - - if(schemaPattern != "%") - pSchemaPat = &schemaPattern; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ProcedureColumnsW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLWChars(schemaPattern); + SQLWChars aPKN(procedureNamePattern); + SQLWChars aCOL(columnNamePattern); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().ProcedureColumnsW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL, + aCOL.get(), SQL_NTSL); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN,aCOL; - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schemaPattern,m_nTextEncoding); - aPKN = OUStringToOString(procedureNamePattern,m_nTextEncoding); - aCOL = OUStringToOString(columnNamePattern,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(), - *pCOL = aCOL.getStr(); - - - SQLRETURN nRetcode = N3SQLProcedureColumns(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pCOL)), SQL_NTS); - + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLChars(schemaPattern, m_nTextEncoding); + SQLChars aPKN(procedureNamePattern, m_nTextEncoding); + SQLChars aCOL(columnNamePattern, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().ProcedureColumns(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS, + aCOL.get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openProcedures(const Any& catalog, const OUString& schemaPattern, - std::u16string_view procedureNamePattern) + const OUString& procedureNamePattern) { - const OUString *pSchemaPat = nullptr; - - if(schemaPattern != "%") - pSchemaPat = &schemaPattern; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ProceduresW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLWChars(schemaPattern); + SQLWChars aPKN(procedureNamePattern); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().ProceduresW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN; - - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schemaPattern,m_nTextEncoding); - aPKN = OUStringToOString(procedureNamePattern,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(); - - - SQLRETURN nRetcode = N3SQLProcedures(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS); + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLChars(schemaPattern, m_nTextEncoding); + SQLChars aPKN(procedureNamePattern, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().Procedures(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openSpecialColumns(bool _bRowVer,const Any& catalog, const OUString& schema, - std::u16string_view table,sal_Int32 scope, bool nullable ) + const OUString& table,sal_Int32 scope, bool nullable ) { // Some ODBC drivers really don't like getting an empty string as tableName // E.g. psqlodbc up to at least version 09.01.0100 segfaults - if (table.empty()) + if (table.isEmpty()) { static constexpr OUStringLiteral errMsg = u"ODBC: Trying to get special columns of empty table name"; @@ -1096,42 +1203,59 @@ void ODatabaseMetaDataResultSet::openSpecialColumns(bool _bRowVer,const Any& cat throw SQLException( errMsg, *this, SQLState, -1, Any() ); } - const OUString *pSchemaPat = nullptr; - - if(schema != "%") - pSchemaPat = &schema; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::SpecialColumnsW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLWChars(schema); + SQLWChars aPKN(table); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().SpecialColumnsW(m_aStatementHandle, _bRowVer ? SQL_ROWVER : SQL_BEST_ROWID, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL, + scope, + nullable ? SQL_NULLABLE : SQL_NO_NULLS); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN; - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schema,m_nTextEncoding); - aPKN = OUStringToOString(table,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(); - - - SQLRETURN nRetcode = N3SQLSpecialColumns(m_aStatementHandle,_bRowVer ? SQL_ROWVER : SQL_BEST_ROWID, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS, - static_cast<SQLSMALLINT>(scope), - nullable ? SQL_NULLABLE : SQL_NO_NULLS); + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLChars(schema, m_nTextEncoding); + SQLChars aPKN(table, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().SpecialColumns(m_aStatementHandle, _bRowVer ? SQL_ROWVER : SQL_BEST_ROWID, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS, + static_cast<SQLSMALLINT>(scope), + nullable ? SQL_NULLABLE : SQL_NO_NULLS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openVersionColumns(const Any& catalog, const OUString& schema, - std::u16string_view table) + const OUString& table) { openSpecialColumns(true,catalog,schema,table,SQL_SCOPE_TRANSACTION,false); } void ODatabaseMetaDataResultSet::openBestRowIdentifier( const Any& catalog, const OUString& schema, - std::u16string_view table,sal_Int32 scope,bool nullable ) + const OUString& table,sal_Int32 scope,bool nullable ) { openSpecialColumns(false,catalog,schema,table,scope,nullable); } @@ -1141,47 +1265,72 @@ void ODatabaseMetaDataResultSet::openForeignKeys( const Any& catalog, const OUSt const Any& catalog2, const OUString* schema2, const OUString* table2) { - OString aPKQ, aPKO, aPKN, aFKQ, aFKO, aFKN; - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - if ( catalog2.hasValue() ) - aFKQ = OUStringToOString(comphelper::getString(catalog2),m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr; - const char *pPKO = nullptr; - if (schema && !schema->isEmpty()) - { - aPKO = OUStringToOString(*schema,m_nTextEncoding); - pPKO = aPKO.getStr(); - } - const char *pPKN = nullptr; - if (table) - { - aPKN = OUStringToOString(*table,m_nTextEncoding); - pPKN = aPKN.getStr(); - } - const char *pFKQ = catalog2.hasValue() && !aFKQ.isEmpty() ? aFKQ.getStr() : nullptr; - const char *pFKO = nullptr; - if (schema2 && !schema2->isEmpty()) + OUString uPKQ, uFKQ; + catalog >>= uPKQ; + catalog2 >>= uFKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ForeignKeysW)) { - aFKO = OUStringToOString(*schema2,m_nTextEncoding); - pFKO = aFKO.getStr(); + SQLWChars aPKQ, aPKO, aPKN, aFKQ, aFKO, aFKN; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!uFKQ.isEmpty()) + aFKQ = SQLWChars(uFKQ); + if (schema && !schema->isEmpty()) + aPKO = SQLWChars(*schema); + if (table) + aPKN = SQLWChars(*table); + if (schema2 && !schema2->isEmpty()) + aFKO = SQLWChars(*schema2); + if (table2) + aFKN = SQLWChars(*table2); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr; + auto pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + auto pPKN = !aPKN.empty() ? aPKN.get() : nullptr; + auto pFKQ = !aFKQ.empty() ? aFKQ.get() : nullptr; + auto pFKO = !aFKO.empty() ? aFKO.get() : nullptr; + auto pFKN = !aFKN.empty() ? aFKN.get() : nullptr; + + nRetcode = functions().ForeignKeysW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + pPKN, pPKN ? SQL_NTSL : 0, + pFKQ, pFKQ ? SQL_NTSL : 0, + pFKO, pFKO ? SQL_NTSL : 0, + pFKN, pFKN ? SQL_NTSL : 0); } - const char *pFKN = nullptr; - if (table2) + else { - aFKN = OUStringToOString(*table2,m_nTextEncoding); - pFKN = aFKN.getStr(); + SQLChars aPKQ, aPKO, aPKN, aFKQ, aFKO, aFKN; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!uFKQ.isEmpty()) + aFKQ = SQLChars(uFKQ, m_nTextEncoding); + if (schema && !schema->isEmpty()) + aPKO = SQLChars(*schema, m_nTextEncoding); + if (table) + aPKN = SQLChars(*table, m_nTextEncoding); + if (schema2 && !schema2->isEmpty()) + aFKO = SQLChars(*schema2, m_nTextEncoding); + if (table2) + aFKN = SQLChars(*table2, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr; + auto pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + auto pPKN = !aPKN.empty() ? aPKN.get() : nullptr; + auto pFKQ = !aFKQ.empty() ? aFKQ.get() : nullptr; + auto pFKO = !aFKO.empty() ? aFKO.get() : nullptr; + auto pFKN = !aFKN.empty() ? aFKN.get() : nullptr; + + nRetcode = functions().ForeignKeys(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + pPKN, pPKN ? SQL_NTS : 0, + pFKQ, pFKQ ? SQL_NTS : 0, + pFKO, pFKO ? SQL_NTS : 0, + pFKN, pFKN ? SQL_NTS : 0); } - - SQLRETURN nRetcode = N3SQLForeignKeys(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), pPKN ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pFKQ)), (catalog2.hasValue() && !aFKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pFKO)), pFKO ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pFKN)), SQL_NTS - ); OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } @@ -1200,91 +1349,137 @@ void ODatabaseMetaDataResultSet::openExportedKeys(const Any& catalog, const OUSt } void ODatabaseMetaDataResultSet::openPrimaryKeys(const Any& catalog, const OUString& schema, - std::u16string_view table) + const OUString& table) { - const OUString *pSchemaPat = nullptr; - - if(schema != "%") - pSchemaPat = &schema; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::PrimaryKeysW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLWChars(schema); + SQLWChars aPKN(table); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().PrimaryKeysW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN; - - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schema,m_nTextEncoding); - aPKN = OUStringToOString(table,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(); - - - SQLRETURN nRetcode = N3SQLPrimaryKeys(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS); + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLChars(schema, m_nTextEncoding); + SQLChars aPKN(table, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().PrimaryKeys(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openTablePrivileges(const Any& catalog, const OUString& schemaPattern, - std::u16string_view tableNamePattern) + const OUString& tableNamePattern) { - const OUString *pSchemaPat = nullptr; - - if(schemaPattern != "%") - pSchemaPat = &schemaPattern; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::TablePrivilegesW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLWChars(schemaPattern); + SQLWChars aPKN(tableNamePattern); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().TablePrivilegesW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN; - - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schemaPattern,m_nTextEncoding); - aPKN = OUStringToOString(tableNamePattern,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(); - - SQLRETURN nRetcode = N3SQLTablePrivileges(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS); + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schemaPattern.isEmpty() && schemaPattern != "%") + aPKO = SQLChars(schemaPattern, m_nTextEncoding); + SQLChars aPKN(tableNamePattern, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().TablePrivileges(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } void ODatabaseMetaDataResultSet::openIndexInfo( const Any& catalog, const OUString& schema, - std::u16string_view table, bool unique, bool approximate ) + const OUString& table, bool unique, bool approximate ) { - const OUString *pSchemaPat = nullptr; - - if(schema != "%") - pSchemaPat = &schema; + OUString uPKQ; + catalog >>= uPKQ; + SQLRETURN nRetcode; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::StatisticsW)) + { + SQLWChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLWChars(uPKQ); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLWChars(schema); + SQLWChars aPKN(table); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().StatisticsW(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTSL : 0, + pPKO, pPKO ? SQL_NTSL : 0, + aPKN.get(), SQL_NTSL, + unique ? SQL_INDEX_UNIQUE : SQL_INDEX_ALL, + approximate ? 1 : 0); + } else - pSchemaPat = nullptr; - - OString aPKQ,aPKO,aPKN; - - if ( catalog.hasValue() ) - aPKQ = OUStringToOString(comphelper::getString(catalog),m_nTextEncoding); - aPKO = OUStringToOString(schema,m_nTextEncoding); - aPKN = OUStringToOString(table,m_nTextEncoding); - - const char *pPKQ = catalog.hasValue() && !aPKQ.isEmpty() ? aPKQ.getStr() : nullptr, - *pPKO = pSchemaPat && !pSchemaPat->isEmpty() && !aPKO.isEmpty() ? aPKO.getStr() : nullptr, - *pPKN = aPKN.getStr(); - - SQLRETURN nRetcode = N3SQLStatistics(m_aStatementHandle, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKQ)), (catalog.hasValue() && !aPKQ.isEmpty()) ? SQL_NTS : 0, - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKO)), pPKO ? SQL_NTS : 0 , - reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(pPKN)), SQL_NTS, - unique ? SQL_INDEX_UNIQUE : SQL_INDEX_ALL, - approximate ? 1 : 0); + { + SQLChars aPKQ, aPKO; + if (!uPKQ.isEmpty()) + aPKQ = SQLChars(uPKQ, m_nTextEncoding); + if (!schema.isEmpty() && schema != "%") + aPKO = SQLChars(schema, m_nTextEncoding); + SQLChars aPKN(table, m_nTextEncoding); + + auto pPKQ = !aPKQ.empty() ? aPKQ.get() : nullptr, + pPKO = !aPKO.empty() ? aPKO.get() : nullptr; + + nRetcode = functions().Statistics(m_aStatementHandle, + pPKQ, pPKQ ? SQL_NTS : 0, + pPKO, pPKO ? SQL_NTS : 0, + aPKN.get(), SQL_NTS, + unique ? SQL_INDEX_UNIQUE : SQL_INDEX_ALL, + approximate ? 1 : 0); + } OTools::ThrowException(m_pConnection.get(),nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this); checkColumnCount(); } @@ -1292,7 +1487,7 @@ void ODatabaseMetaDataResultSet::openIndexInfo( const Any& catalog, const OUStri void ODatabaseMetaDataResultSet::checkColumnCount() { sal_Int16 nNumResultCols=0; - OTools::ThrowException(m_pConnection.get(),N3SQLNumResultCols(m_aStatementHandle,&nNumResultCols),m_aStatementHandle,SQL_HANDLE_STMT,*this); + OTools::ThrowException(m_pConnection.get(),functions().NumResultCols(m_aStatementHandle,&nNumResultCols),m_aStatementHandle,SQL_HANDLE_STMT,*this); m_nDriverColumnCount = nNumResultCols; } diff --git a/connectivity/source/drivers/odbc/ODriver.cxx b/connectivity/source/drivers/odbc/ODriver.cxx index df7b3fd206b8..6e9b28082c11 100644 --- a/connectivity/source/drivers/odbc/ODriver.cxx +++ b/connectivity/source/drivers/odbc/ODriver.cxx @@ -17,13 +17,18 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <odbc/ODriver.hxx> +#include <sal/config.h> + #include <odbc/OConnection.hxx> -#include <odbc/OTools.hxx> +#include <odbc/ODriver.hxx> +#include <resource/sharedresources.hxx> +#include <strings.hrc> + #include <connectivity/dbexception.hxx> #include <cppuhelper/supportsservice.hxx> -#include <strings.hrc> -#include <resource/sharedresources.hxx> +#include <osl/module.h> + +#include <utility> using namespace connectivity::odbc; using namespace com::sun::star::uno; @@ -31,10 +36,9 @@ using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -ODBCDriver::ODBCDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext) +ODBCDriver::ODBCDriver(css::uno::Reference< css::uno::XComponentContext > _xContext) :ODriver_BASE(m_aMutex) - ,m_xContext(_rxContext) - ,m_pDriverHandle(SQL_NULL_HANDLE) + ,m_xContext(std::move(_xContext)) { } @@ -45,7 +49,7 @@ void ODBCDriver::disposing() for (auto const& connection : m_xConnections) { - Reference< XComponent > xComp(connection.get(), UNO_QUERY); + rtl::Reference< OConnection > xComp(connection); if (xComp.is()) xComp->dispose(); } @@ -58,7 +62,7 @@ void ODBCDriver::disposing() OUString ODBCDriver::getImplementationName( ) { - return "com.sun.star.comp.sdbc.ODBCDriver"; + return u"com.sun.star.comp.sdbc.ODBCDriver"_ustr; // this name is referenced in the configuration and in the odbc.xml // Please take care when changing it. } @@ -66,7 +70,7 @@ OUString ODBCDriver::getImplementationName( ) Sequence< OUString > ODBCDriver::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr }; } @@ -81,15 +85,9 @@ Reference< XConnection > SAL_CALL ODBCDriver::connect( const OUString& url, cons if ( ! acceptsURL(url) ) return nullptr; - if(!m_pDriverHandle) - { - OUString aPath; - if(!EnvironmentHandle(aPath)) - throw SQLException(aPath,*this,OUString(),1000,Any()); - } - rtl::Reference<OConnection> pCon = new OConnection(m_pDriverHandle,this); + rtl::Reference<OConnection> pCon = new OConnection(EnvironmentHandle(), this); pCon->Construct(url,info); - m_xConnections.push_back(WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon); return pCon; } @@ -103,71 +101,71 @@ Sequence< DriverPropertyInfo > SAL_CALL ODBCDriver::getPropertyInfo( const OUStr { if ( acceptsURL(url) ) { - Sequence< OUString > aBooleanValues{ "false", "true" }; + Sequence< OUString > aBooleanValues{ u"false"_ustr, u"true"_ustr }; return { { - "CharSet", - "CharSet of the database.", + u"CharSet"_ustr, + u"CharSet of the database."_ustr, false, {}, {} }, { - "UseCatalog", - "Use catalog for file-based databases.", + u"UseCatalog"_ustr, + u"Use catalog for file-based databases."_ustr, false, - "false", + u"false"_ustr, aBooleanValues }, { - "SystemDriverSettings", - "Driver settings.", + u"SystemDriverSettings"_ustr, + u"Driver settings."_ustr, false, {}, {} }, { - "ParameterNameSubstitution", - "Change named parameters with '?'.", + u"ParameterNameSubstitution"_ustr, + u"Change named parameters with '?'."_ustr, false, - "false", + u"false"_ustr, aBooleanValues }, { - "IgnoreDriverPrivileges", - "Ignore the privileges from the database driver.", + u"IgnoreDriverPrivileges"_ustr, + u"Ignore the privileges from the database driver."_ustr, false, - "false", + u"false"_ustr, aBooleanValues }, { - "IsAutoRetrievingEnabled", - "Retrieve generated values.", + u"IsAutoRetrievingEnabled"_ustr, + u"Retrieve generated values."_ustr, false, - "false", + u"false"_ustr, aBooleanValues }, { - "AutoRetrievingStatement", - "Auto-increment statement.", + u"AutoRetrievingStatement"_ustr, + u"Auto-increment statement."_ustr, false, {}, {} }, { - "GenerateASBeforeCorrelationName", - "Generate AS before table correlation names.", + u"GenerateASBeforeCorrelationName"_ustr, + u"Generate AS before table correlation names."_ustr, false, - "false", + u"false"_ustr, aBooleanValues }, { - "EscapeDateTime", - "Escape date time format.", + u"EscapeDateTime"_ustr, + u"Escape date time format."_ustr, false, - "true", + u"true"_ustr, aBooleanValues } }; @@ -175,7 +173,6 @@ Sequence< DriverPropertyInfo > SAL_CALL ODBCDriver::getPropertyInfo( const OUStr ::connectivity::SharedResources aResources; const OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); ::dbtools::throwGenericSQLException(sMessage ,*this); - return Sequence< DriverPropertyInfo >(); } sal_Int32 SAL_CALL ODBCDriver::getMajorVersion( ) @@ -188,5 +185,728 @@ sal_Int32 SAL_CALL ODBCDriver::getMinorVersion( ) return 0; } +// Implib definitions for ODBC-DLL/shared library: + +namespace +{ +constinit oslGenericFunction pODBC3SQLFunctions[static_cast<size_t>(ODBC3SQLFunctionId::LAST)]{}; + +bool LoadFunctions(oslModule pODBCso) +{ + auto load = [pODBCso](ODBC3SQLFunctionId id, const OUString& name) + { + assert(id > ODBC3SQLFunctionId::FIRST && id < ODBC3SQLFunctionId::LAST); + auto& rpFunc = pODBC3SQLFunctions[static_cast<size_t>(id)]; + assert(rpFunc == nullptr); + rpFunc = osl_getFunctionSymbol(pODBCso, name.pData); + return rpFunc != nullptr; + }; + + // Optional functions for Unicode support + if (bUseWChar) + { + load(ODBC3SQLFunctionId::DriverConnectW, u"SQLDriverConnectW"_ustr); + load(ODBC3SQLFunctionId::GetInfoW, u"SQLGetInfoW"_ustr); + load(ODBC3SQLFunctionId::SetConnectAttrW, u"SQLSetConnectAttrW"_ustr); + load(ODBC3SQLFunctionId::GetConnectAttrW, u"SQLGetConnectAttrW"_ustr); + load(ODBC3SQLFunctionId::PrepareW, u"SQLPrepareW"_ustr); + load(ODBC3SQLFunctionId::SetCursorNameW, u"SQLSetCursorNameW"_ustr); + load(ODBC3SQLFunctionId::ExecDirectW, u"SQLExecDirectW"_ustr); + load(ODBC3SQLFunctionId::ColAttributeW, u"SQLColAttributeW"_ustr); + load(ODBC3SQLFunctionId::GetDiagRecW, u"SQLGetDiagRecW"_ustr); + load(ODBC3SQLFunctionId::ColumnPrivilegesW, u"SQLColumnPrivilegesW"_ustr); + load(ODBC3SQLFunctionId::ColumnsW, u"SQLColumnsW"_ustr); + load(ODBC3SQLFunctionId::ForeignKeysW, u"SQLForeignKeysW"_ustr); + load(ODBC3SQLFunctionId::PrimaryKeysW, u"SQLPrimaryKeysW"_ustr); + load(ODBC3SQLFunctionId::ProcedureColumnsW, u"SQLProcedureColumnsW"_ustr); + load(ODBC3SQLFunctionId::ProceduresW, u"SQLProceduresW"_ustr); + load(ODBC3SQLFunctionId::SpecialColumnsW, u"SQLSpecialColumnsW"_ustr); + load(ODBC3SQLFunctionId::StatisticsW, u"SQLStatisticsW"_ustr); + load(ODBC3SQLFunctionId::TablePrivilegesW, u"SQLTablePrivilegesW"_ustr); + load(ODBC3SQLFunctionId::TablesW, u"SQLTablesW"_ustr); + load(ODBC3SQLFunctionId::GetCursorNameW, u"SQLGetCursorNameW"_ustr); + load(ODBC3SQLFunctionId::NativeSqlW, u"SQLNativeSqlW"_ustr); + } + + return load(ODBC3SQLFunctionId::AllocHandle, u"SQLAllocHandle"_ustr) + && load(ODBC3SQLFunctionId::DriverConnect, u"SQLDriverConnect"_ustr) + && load(ODBC3SQLFunctionId::GetInfo, u"SQLGetInfo"_ustr) + && load(ODBC3SQLFunctionId::GetFunctions, u"SQLGetFunctions"_ustr) + && load(ODBC3SQLFunctionId::GetTypeInfo, u"SQLGetTypeInfo"_ustr) + && load(ODBC3SQLFunctionId::SetConnectAttr, u"SQLSetConnectAttr"_ustr) + && load(ODBC3SQLFunctionId::GetConnectAttr, u"SQLGetConnectAttr"_ustr) + && load(ODBC3SQLFunctionId::SetEnvAttr, u"SQLSetEnvAttr"_ustr) + && load(ODBC3SQLFunctionId::GetEnvAttr, u"SQLGetEnvAttr"_ustr) + && load(ODBC3SQLFunctionId::SetStmtAttr, u"SQLSetStmtAttr"_ustr) + && load(ODBC3SQLFunctionId::GetStmtAttr, u"SQLGetStmtAttr"_ustr) + && load(ODBC3SQLFunctionId::Prepare, u"SQLPrepare"_ustr) + && load(ODBC3SQLFunctionId::BindParameter, u"SQLBindParameter"_ustr) + && load(ODBC3SQLFunctionId::SetCursorName, u"SQLSetCursorName"_ustr) + && load(ODBC3SQLFunctionId::Execute, u"SQLExecute"_ustr) + && load(ODBC3SQLFunctionId::ExecDirect, u"SQLExecDirect"_ustr) + && load(ODBC3SQLFunctionId::DescribeParam, u"SQLDescribeParam"_ustr) + && load(ODBC3SQLFunctionId::NumParams, u"SQLNumParams"_ustr) + && load(ODBC3SQLFunctionId::ParamData, u"SQLParamData"_ustr) + && load(ODBC3SQLFunctionId::PutData, u"SQLPutData"_ustr) + && load(ODBC3SQLFunctionId::RowCount, u"SQLRowCount"_ustr) + && load(ODBC3SQLFunctionId::NumResultCols, u"SQLNumResultCols"_ustr) + && load(ODBC3SQLFunctionId::ColAttribute, u"SQLColAttribute"_ustr) + && load(ODBC3SQLFunctionId::BindCol, u"SQLBindCol"_ustr) + && load(ODBC3SQLFunctionId::Fetch, u"SQLFetch"_ustr) + && load(ODBC3SQLFunctionId::FetchScroll, u"SQLFetchScroll"_ustr) + && load(ODBC3SQLFunctionId::GetData, u"SQLGetData"_ustr) + && load(ODBC3SQLFunctionId::SetPos, u"SQLSetPos"_ustr) + && load(ODBC3SQLFunctionId::BulkOperations, u"SQLBulkOperations"_ustr) + && load(ODBC3SQLFunctionId::MoreResults, u"SQLMoreResults"_ustr) + && load(ODBC3SQLFunctionId::GetDiagRec, u"SQLGetDiagRec"_ustr) + && load(ODBC3SQLFunctionId::ColumnPrivileges, u"SQLColumnPrivileges"_ustr) + && load(ODBC3SQLFunctionId::Columns, u"SQLColumns"_ustr) + && load(ODBC3SQLFunctionId::ForeignKeys, u"SQLForeignKeys"_ustr) + && load(ODBC3SQLFunctionId::PrimaryKeys, u"SQLPrimaryKeys"_ustr) + && load(ODBC3SQLFunctionId::ProcedureColumns, u"SQLProcedureColumns"_ustr) + && load(ODBC3SQLFunctionId::Procedures, u"SQLProcedures"_ustr) + && load(ODBC3SQLFunctionId::SpecialColumns, u"SQLSpecialColumns"_ustr) + && load(ODBC3SQLFunctionId::Statistics, u"SQLStatistics"_ustr) + && load(ODBC3SQLFunctionId::TablePrivileges, u"SQLTablePrivileges"_ustr) + && load(ODBC3SQLFunctionId::Tables, u"SQLTables"_ustr) + && load(ODBC3SQLFunctionId::FreeStmt, u"SQLFreeStmt"_ustr) + && load(ODBC3SQLFunctionId::CloseCursor, u"SQLCloseCursor"_ustr) + && load(ODBC3SQLFunctionId::Cancel, u"SQLCancel"_ustr) + && load(ODBC3SQLFunctionId::EndTran, u"SQLEndTran"_ustr) + && load(ODBC3SQLFunctionId::Disconnect, u"SQLDisconnect"_ustr) + && load(ODBC3SQLFunctionId::FreeHandle, u"SQLFreeHandle"_ustr) + && load(ODBC3SQLFunctionId::GetCursorName, u"SQLGetCursorName"_ustr) + && load(ODBC3SQLFunctionId::NativeSql, u"SQLNativeSql"_ustr); +} + +// Take care of Dynamically loading of the DLL/shared lib and Addresses: +// Returns sal_True at success +bool LoadLibrary_ODBC3(OUString &_rPath) +{ + static bool bLoaded = false; + static oslModule pODBCso = nullptr; + + if (bLoaded) + return true; +#ifdef DISABLE_DYNLOADING + (void)_rPath; +#else +#ifdef _WIN32 + _rPath = "ODBC32.DLL"; +#endif +#ifdef UNX + #ifdef MACOSX + _rPath = "libiodbc.dylib"; + #else + _rPath = "libodbc.so.2"; + pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW ); + if ( !pODBCso ) + { + _rPath = "libodbc.so.1"; + pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW ); + } + if ( !pODBCso ) + _rPath = "libodbc.so"; + + #endif /* MACOSX */ +#endif + + if ( !pODBCso ) + pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW ); +#endif // DISABLE_DYNLOADING + if( !pODBCso) + return false; + + bLoaded = LoadFunctions(pODBCso); + return bLoaded; +} + +class ORealOdbcDriver : public connectivity::odbc::ODBCDriver, public connectivity::odbc::Functions +{ +public: + explicit ORealOdbcDriver(const css::uno::Reference<css::uno::XComponentContext>& _rxContext) + : ODBCDriver(_rxContext) + { + } + const Functions& functions() const override { return *this; } + + // Functions + + bool has(ODBC3SQLFunctionId id) const override + { + assert(id > ODBC3SQLFunctionId::FIRST && id < ODBC3SQLFunctionId::LAST); + return pODBC3SQLFunctions[static_cast<size_t>(id)] != nullptr; + } + + SQLRETURN AllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, + SQLHANDLE* OutputHandlePtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::AllocHandle, HandleType, InputHandle, OutputHandlePtr); + } + + SQLRETURN DriverConnect(SQLHDBC ConnectionHandle, HWND WindowHandle, + SQLCHAR* InConnectionString, SQLSMALLINT StringLength1, + SQLCHAR* OutConnectionString, SQLSMALLINT BufferLength, + SQLSMALLINT* StringLength2Ptr, + SQLUSMALLINT DriverCompletion) const override + { + return ODBCFunc(ODBC3SQLFunctionId::DriverConnect, ConnectionHandle, WindowHandle, + InConnectionString, StringLength1, OutConnectionString, BufferLength, + StringLength2Ptr, DriverCompletion); + } + + SQLRETURN DriverConnectW(SQLHDBC ConnectionHandle, HWND WindowHandle, + SQLWCHAR* InConnectionString, SQLSMALLINT StringLength1, + SQLWCHAR* OutConnectionString, SQLSMALLINT BufferLength, + SQLSMALLINT* StringLength2Ptr, + SQLUSMALLINT DriverCompletion) const override + { + return ODBCFunc(ODBC3SQLFunctionId::DriverConnectW, ConnectionHandle, WindowHandle, + InConnectionString, StringLength1, OutConnectionString, BufferLength, + StringLength2Ptr, DriverCompletion); + } + + SQLRETURN GetInfo(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr, + SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetInfo, ConnectionHandle, InfoType, InfoValuePtr, + BufferLength, StringLengthPtr); + } + + SQLRETURN GetInfoW(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr, + SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetInfoW, ConnectionHandle, InfoType, InfoValuePtr, + BufferLength, StringLengthPtr); + } + + SQLRETURN GetFunctions(SQLHDBC ConnectionHandle, SQLUSMALLINT FunctionId, + SQLUSMALLINT* SupportedPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetFunctions, ConnectionHandle, FunctionId, + SupportedPtr); + } + + SQLRETURN GetTypeInfo(SQLHSTMT StatementHandle, SQLSMALLINT DataType) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetTypeInfo, StatementHandle, DataType); + } + + SQLRETURN SetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetConnectAttr, ConnectionHandle, Attribute, ValuePtr, + StringLength); + } + + SQLRETURN SetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetConnectAttrW, ConnectionHandle, Attribute, ValuePtr, + StringLength); + } + + SQLRETURN GetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER BufferLength, SQLINTEGER* StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetConnectAttr, ConnectionHandle, Attribute, ValuePtr, + BufferLength, StringLength); + } + + SQLRETURN GetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER BufferLength, SQLINTEGER* StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetConnectAttrW, ConnectionHandle, Attribute, ValuePtr, + BufferLength, StringLength); + } + + SQLRETURN SetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetEnvAttr, EnvironmentHandle, Attribute, ValuePtr, + StringLength); + } + + SQLRETURN GetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER BufferLength, SQLINTEGER* StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetEnvAttr, EnvironmentHandle, Attribute, ValuePtr, + BufferLength, StringLength); + } + + SQLRETURN SetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetStmtAttr, StatementHandle, Attribute, ValuePtr, + StringLength); + } + + SQLRETURN GetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, + SQLINTEGER BufferLength, SQLINTEGER* StringLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetStmtAttr, StatementHandle, Attribute, ValuePtr, + BufferLength, StringLength); + } + + SQLRETURN Prepare(SQLHSTMT StatementHandle, SQLCHAR* StatementText, + SQLINTEGER TextLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Prepare, StatementHandle, StatementText, TextLength); + } + + SQLRETURN PrepareW(SQLHSTMT StatementHandle, SQLWCHAR* StatementText, + SQLINTEGER TextLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::PrepareW, StatementHandle, StatementText, TextLength); + } + + SQLRETURN BindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, + SQLSMALLINT InputOutputType, SQLSMALLINT ValueType, + SQLSMALLINT ParameterType, SQLULEN ColumnSize, + SQLSMALLINT DecimalDigits, SQLPOINTER ParameterValuePtr, + SQLLEN BufferLength, SQLLEN* StrLen_or_IndPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::BindParameter, StatementHandle, ParameterNumber, + InputOutputType, ValueType, ParameterType, ColumnSize, DecimalDigits, + ParameterValuePtr, BufferLength, StrLen_or_IndPtr); + } + + SQLRETURN SetCursorName(SQLHSTMT StatementHandle, SQLCHAR* CursorName, + SQLSMALLINT NameLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetCursorName, StatementHandle, CursorName, NameLength); + } + + SQLRETURN SetCursorNameW(SQLHSTMT StatementHandle, SQLWCHAR* CursorName, + SQLSMALLINT NameLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetCursorNameW, StatementHandle, CursorName, NameLength); + } + + SQLRETURN Execute(SQLHSTMT StatementHandle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Execute, StatementHandle); + } + + SQLRETURN ExecDirect(SQLHSTMT StatementHandle, SQLCHAR* StatementText, + SQLINTEGER TextLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ExecDirect, StatementHandle, StatementText, TextLength); + } + + SQLRETURN ExecDirectW(SQLHSTMT StatementHandle, SQLWCHAR* StatementText, + SQLINTEGER TextLength) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ExecDirectW, StatementHandle, StatementText, TextLength); + } + + SQLRETURN DescribeParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, + SQLSMALLINT* DataTypePtr, SQLULEN* ParameterSizePtr, + SQLSMALLINT* DecimalDigitsPtr, SQLSMALLINT* NullablePtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::DescribeParam, StatementHandle, ParameterNumber, + DataTypePtr, ParameterSizePtr, DecimalDigitsPtr, NullablePtr); + } + + SQLRETURN NumParams(SQLHSTMT StatementHandle, SQLSMALLINT* ParameterCountPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::NumParams, StatementHandle, ParameterCountPtr); + } + + SQLRETURN ParamData(SQLHSTMT StatementHandle, SQLPOINTER* ValuePtrPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ParamData, StatementHandle, ValuePtrPtr); + } + + SQLRETURN PutData(SQLHSTMT StatementHandle, SQLPOINTER DataPtr, + SQLLEN StrLen_or_Ind) const override + { + return ODBCFunc(ODBC3SQLFunctionId::PutData, StatementHandle, DataPtr, StrLen_or_Ind); + } + + SQLRETURN RowCount(SQLHSTMT StatementHandle, SQLLEN* RowCountPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::RowCount, StatementHandle, RowCountPtr); + } + + SQLRETURN NumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT* ColumnCountPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::NumResultCols, StatementHandle, ColumnCountPtr); + } + + SQLRETURN ColAttribute(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, + SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttributePtr, + SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr, + SQLLEN* NumericAttributePtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ColAttribute, StatementHandle, ColumnNumber, + FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, + NumericAttributePtr); + } + + SQLRETURN ColAttributeW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, + SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttributePtr, + SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr, + SQLLEN* NumericAttributePtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ColAttributeW, StatementHandle, ColumnNumber, + FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, + NumericAttributePtr); + } + + SQLRETURN BindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, + SQLPOINTER TargetValuePtr, SQLLEN BufferLength, + SQLLEN* StrLen_or_IndPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::BindCol, StatementHandle, ColumnNumber, TargetType, + TargetValuePtr, BufferLength, StrLen_or_IndPtr); + } + + SQLRETURN Fetch(SQLHSTMT StatementHandle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Fetch, StatementHandle); + } + + SQLRETURN FetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, + SQLLEN FetchOffset) const override + { + return ODBCFunc(ODBC3SQLFunctionId::FetchScroll, StatementHandle, FetchOrientation, + FetchOffset); + } + + SQLRETURN GetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, + SQLPOINTER TargetValuePtr, SQLLEN BufferLength, + SQLLEN* StrLen_or_IndPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetData, StatementHandle, ColumnNumber, TargetType, + TargetValuePtr, BufferLength, StrLen_or_IndPtr); + } + + SQLRETURN SetPos(SQLHSTMT StatementHandle, SQLSETPOSIROW RowNumber, SQLUSMALLINT Operation, + SQLUSMALLINT LockType) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SetPos, StatementHandle, RowNumber, Operation, + LockType); + } + + SQLRETURN BulkOperations(SQLHSTMT StatementHandle, SQLSMALLINT Operation) const override + { + return ODBCFunc(ODBC3SQLFunctionId::BulkOperations, StatementHandle, Operation); + } + + SQLRETURN MoreResults(SQLHSTMT StatementHandle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::MoreResults, StatementHandle); + } + + SQLRETURN GetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, + SQLCHAR* Sqlstate, SQLINTEGER* NativeErrorPtr, SQLCHAR* MessageText, + SQLSMALLINT BufferLength, SQLSMALLINT* TextLengthPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetDiagRec, HandleType, Handle, RecNumber, Sqlstate, + NativeErrorPtr, MessageText, BufferLength, TextLengthPtr); + } + + SQLRETURN GetDiagRecW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, + SQLWCHAR* Sqlstate, SQLINTEGER* NativeErrorPtr, SQLWCHAR* MessageText, + SQLSMALLINT BufferLength, SQLSMALLINT* TextLengthPtr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetDiagRecW, HandleType, Handle, RecNumber, Sqlstate, + NativeErrorPtr, MessageText, BufferLength, TextLengthPtr); + } + + SQLRETURN ColumnPrivileges(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, + SQLSMALLINT NameLength1, SQLCHAR* SchemaName, + SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, + SQLCHAR* ColumnName, SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ColumnPrivileges, StatementHandle, CatalogName, + NameLength1, SchemaName, NameLength2, TableName, NameLength3, ColumnName, + NameLength4); + } + + SQLRETURN ColumnPrivilegesW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, + SQLSMALLINT NameLength1, SQLWCHAR* SchemaName, + SQLSMALLINT NameLength2, SQLWCHAR* TableName, SQLSMALLINT NameLength3, + SQLWCHAR* ColumnName, SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ColumnPrivilegesW, StatementHandle, CatalogName, + NameLength1, SchemaName, NameLength2, TableName, NameLength3, ColumnName, + NameLength4); + } + + SQLRETURN Columns(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, + SQLSMALLINT NameLength3, SQLCHAR* ColumnName, + SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Columns, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, ColumnName, NameLength4); + } + + SQLRETURN ColumnsW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLWCHAR* SchemaName, SQLSMALLINT NameLength2, SQLWCHAR* TableName, + SQLSMALLINT NameLength3, SQLWCHAR* ColumnName, + SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ColumnsW, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, ColumnName, NameLength4); + } + + SQLRETURN ForeignKeys(SQLHSTMT StatementHandle, SQLCHAR* PKCatalogName, SQLSMALLINT NameLength1, + SQLCHAR* PKSchemaName, SQLSMALLINT NameLength2, SQLCHAR* PKTableName, + SQLSMALLINT NameLength3, SQLCHAR* FKCatalogName, SQLSMALLINT NameLength4, + SQLCHAR* FKSchemaName, SQLSMALLINT NameLength5, SQLCHAR* FKTableName, + SQLSMALLINT NameLength6) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ForeignKeys, StatementHandle, PKCatalogName, + NameLength1, PKSchemaName, NameLength2, PKTableName, NameLength3, + FKCatalogName, NameLength4, FKSchemaName, NameLength5, FKTableName, + NameLength6); + } + + SQLRETURN ForeignKeysW(SQLHSTMT StatementHandle, SQLWCHAR* PKCatalogName, SQLSMALLINT NameLength1, + SQLWCHAR* PKSchemaName, SQLSMALLINT NameLength2, SQLWCHAR* PKTableName, + SQLSMALLINT NameLength3, SQLWCHAR* FKCatalogName, SQLSMALLINT NameLength4, + SQLWCHAR* FKSchemaName, SQLSMALLINT NameLength5, SQLWCHAR* FKTableName, + SQLSMALLINT NameLength6) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ForeignKeysW, StatementHandle, PKCatalogName, + NameLength1, PKSchemaName, NameLength2, PKTableName, NameLength3, + FKCatalogName, NameLength4, FKSchemaName, NameLength5, FKTableName, + NameLength6); + } + + SQLRETURN PrimaryKeys(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, + SQLSMALLINT NameLength3) const override + { + return ODBCFunc(ODBC3SQLFunctionId::PrimaryKeys, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3); + } + + SQLRETURN PrimaryKeysW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLWCHAR* SchemaName, SQLSMALLINT NameLength2, SQLWCHAR* TableName, + SQLSMALLINT NameLength3) const override + { + return ODBCFunc(ODBC3SQLFunctionId::PrimaryKeysW, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3); + } + + SQLRETURN ProcedureColumns(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, + SQLSMALLINT NameLength1, SQLCHAR* SchemaName, + SQLSMALLINT NameLength2, SQLCHAR* ProcName, SQLSMALLINT NameLength3, + SQLCHAR* ColumnName, SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ProcedureColumns, StatementHandle, CatalogName, + NameLength1, SchemaName, NameLength2, ProcName, NameLength3, ColumnName, + NameLength4); + } + + SQLRETURN ProcedureColumnsW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, + SQLSMALLINT NameLength1, SQLWCHAR* SchemaName, + SQLSMALLINT NameLength2, SQLWCHAR* ProcName, SQLSMALLINT NameLength3, + SQLWCHAR* ColumnName, SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ProcedureColumnsW, StatementHandle, CatalogName, + NameLength1, SchemaName, NameLength2, ProcName, NameLength3, ColumnName, + NameLength4); + } + + SQLRETURN Procedures(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* ProcName, + SQLSMALLINT NameLength3) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Procedures, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, ProcName, NameLength3); + } + + SQLRETURN ProceduresW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLWCHAR* SchemaName, SQLSMALLINT NameLength2, SQLWCHAR* ProcName, + SQLSMALLINT NameLength3) const override + { + return ODBCFunc(ODBC3SQLFunctionId::ProceduresW, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, ProcName, NameLength3); + } + + SQLRETURN SpecialColumns(SQLHSTMT StatementHandle, SQLUSMALLINT IdentifierType, + SQLCHAR* CatalogName, SQLSMALLINT NameLength1, SQLCHAR* SchemaName, + SQLSMALLINT NameLength2, SQLCHAR* TableName, SQLSMALLINT NameLength3, + SQLUSMALLINT Scope, SQLUSMALLINT Nullable) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SpecialColumns, StatementHandle, IdentifierType, + CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, + Scope, Nullable); + } + + SQLRETURN SpecialColumnsW(SQLHSTMT StatementHandle, SQLUSMALLINT IdentifierType, + SQLWCHAR* CatalogName, SQLSMALLINT NameLength1, SQLWCHAR* SchemaName, + SQLSMALLINT NameLength2, SQLWCHAR* TableName, SQLSMALLINT NameLength3, + SQLUSMALLINT Scope, SQLUSMALLINT Nullable) const override + { + return ODBCFunc(ODBC3SQLFunctionId::SpecialColumnsW, StatementHandle, IdentifierType, + CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, + Scope, Nullable); + } + + SQLRETURN Statistics(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, + SQLSMALLINT NameLength3, SQLUSMALLINT Unique, + SQLUSMALLINT Reserved) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Statistics, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, Unique, Reserved); + } + + SQLRETURN StatisticsW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLWCHAR* SchemaName, SQLSMALLINT NameLength2, SQLWCHAR* TableName, + SQLSMALLINT NameLength3, SQLUSMALLINT Unique, + SQLUSMALLINT Reserved) const override + { + return ODBCFunc(ODBC3SQLFunctionId::StatisticsW, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, Unique, Reserved); + } + + SQLRETURN TablePrivileges(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, + SQLSMALLINT NameLength1, SQLCHAR* SchemaName, SQLSMALLINT NameLength2, + SQLCHAR* TableName, SQLSMALLINT NameLength3) const override + { + return ODBCFunc(ODBC3SQLFunctionId::TablePrivileges, StatementHandle, CatalogName, + NameLength1, SchemaName, NameLength2, TableName, NameLength3); + } + + SQLRETURN TablePrivilegesW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, + SQLSMALLINT NameLength1, SQLWCHAR* SchemaName, SQLSMALLINT NameLength2, + SQLWCHAR* TableName, SQLSMALLINT NameLength3) const override + { + return ODBCFunc(ODBC3SQLFunctionId::TablePrivilegesW, StatementHandle, CatalogName, + NameLength1, SchemaName, NameLength2, TableName, NameLength3); + } + + SQLRETURN Tables(SQLHSTMT StatementHandle, SQLCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLCHAR* SchemaName, SQLSMALLINT NameLength2, SQLCHAR* TableName, + SQLSMALLINT NameLength3, SQLCHAR* TableType, + SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Tables, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, TableType, NameLength4); + } + + SQLRETURN TablesW(SQLHSTMT StatementHandle, SQLWCHAR* CatalogName, SQLSMALLINT NameLength1, + SQLWCHAR* SchemaName, SQLSMALLINT NameLength2, SQLWCHAR* TableName, + SQLSMALLINT NameLength3, SQLWCHAR* TableType, + SQLSMALLINT NameLength4) const override + { + return ODBCFunc(ODBC3SQLFunctionId::TablesW, StatementHandle, CatalogName, NameLength1, + SchemaName, NameLength2, TableName, NameLength3, TableType, NameLength4); + } + + SQLRETURN FreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option) const override + { + return ODBCFunc(ODBC3SQLFunctionId::FreeStmt, StatementHandle, Option); + } + + SQLRETURN CloseCursor(SQLHSTMT StatementHandle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::CloseCursor, StatementHandle); + } + + SQLRETURN Cancel(SQLHSTMT StatementHandle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Cancel, StatementHandle); + } + + SQLRETURN EndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, + SQLSMALLINT CompletionType) const override + { + return ODBCFunc(ODBC3SQLFunctionId::EndTran, HandleType, Handle, CompletionType); + } + + SQLRETURN Disconnect(SQLHDBC ConnectionHandle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::Disconnect, ConnectionHandle); + } + + SQLRETURN FreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) const override + { + return ODBCFunc(ODBC3SQLFunctionId::FreeHandle, HandleType, Handle); + } + + SQLRETURN GetCursorName(SQLHSTMT StatementHandle, SQLCHAR* CursorName, SQLSMALLINT BufferLength, + SQLSMALLINT* NameLength2) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetCursorName, StatementHandle, CursorName, + BufferLength, NameLength2); + } + + SQLRETURN GetCursorNameW(SQLHSTMT StatementHandle, SQLWCHAR* CursorName, SQLSMALLINT BufferLength, + SQLSMALLINT* NameLength2) const override + { + return ODBCFunc(ODBC3SQLFunctionId::GetCursorNameW, StatementHandle, CursorName, + BufferLength, NameLength2); + } + + SQLRETURN NativeSql(SQLHDBC ConnectionHandle, SQLCHAR* InStatementText, SQLINTEGER TextLength1, + SQLCHAR* OutStatementText, SQLINTEGER BufferLength, + SQLINTEGER* TextLength2Ptr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::NativeSql, ConnectionHandle, InStatementText, + TextLength1, OutStatementText, BufferLength, TextLength2Ptr); + } + + SQLRETURN NativeSqlW(SQLHDBC ConnectionHandle, SQLWCHAR* InStatementText, SQLINTEGER TextLength1, + SQLWCHAR* OutStatementText, SQLINTEGER BufferLength, + SQLINTEGER* TextLength2Ptr) const override + { + return ODBCFunc(ODBC3SQLFunctionId::NativeSqlW, ConnectionHandle, InStatementText, + TextLength1, OutStatementText, BufferLength, TextLength2Ptr); + } + +protected: + virtual SQLHANDLE EnvironmentHandle() override; + +private: + template <typename... Args> static SQLRETURN ODBCFunc(ODBC3SQLFunctionId id, Args... args) + { + assert(id > ODBC3SQLFunctionId::FIRST && id < ODBC3SQLFunctionId::LAST); + assert(pODBC3SQLFunctions[static_cast<size_t>(id)]); + using Func_t = SQLRETURN(SQL_API*)(Args...); + return (*reinterpret_cast<Func_t>(pODBC3SQLFunctions[static_cast<size_t>(id)]))(args...); + } + + SQLHANDLE m_pDriverHandle = SQL_NULL_HANDLE; +}; + +// ODBC Environment (common for all Connections): +SQLHANDLE ORealOdbcDriver::EnvironmentHandle() +{ + // Is (for this instance) already an Environment made? + if (m_pDriverHandle == SQL_NULL_HANDLE) + { + OUString aPath; + SQLHANDLE h = SQL_NULL_HANDLE; + // allocate Environment + // load ODBC-DLL now: + if (!LoadLibrary_ODBC3(aPath) + || AllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &h) != SQL_SUCCESS) + dbtools::throwSQLException(aPath, OUString(), *this, 1000); + + // Save in global Structure + m_pDriverHandle = h; + SetEnvAttr(h, SQL_ATTR_ODBC_VERSION, reinterpret_cast<SQLPOINTER>(SQL_OV_ODBC3), + SQL_IS_UINTEGER); + //N3SQLSetEnvAttr(h, SQL_ATTR_CONNECTION_POOLING,(SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER); + } + + return m_pDriverHandle; +} +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +connectivity_odbc_ORealOdbcDriver_get_implementation(css::uno::XComponentContext* context, + css::uno::Sequence<css::uno::Any> const&) +{ + return cppu::acquire(new ORealOdbcDriver(context)); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/odbc/OFunctions.cxx b/connectivity/source/drivers/odbc/OFunctions.cxx deleted file mode 100644 index 951eb8b36bff..000000000000 --- a/connectivity/source/drivers/odbc/OFunctions.cxx +++ /dev/null @@ -1,245 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include <odbc/OFunctions.hxx> - -// Implib definitions for ODBC-DLL/shared library: - -namespace connectivity -{ - T3SQLAllocHandle pODBC3SQLAllocHandle; -T3SQLConnect pODBC3SQLConnect; -T3SQLDriverConnect pODBC3SQLDriverConnect; -T3SQLBrowseConnect pODBC3SQLBrowseConnect; -T3SQLDataSources pODBC3SQLDataSources; -T3SQLDrivers pODBC3SQLDrivers; -T3SQLGetInfo pODBC3SQLGetInfo; -T3SQLGetFunctions pODBC3SQLGetFunctions; -T3SQLGetTypeInfo pODBC3SQLGetTypeInfo; -T3SQLSetConnectAttr pODBC3SQLSetConnectAttr; -T3SQLGetConnectAttr pODBC3SQLGetConnectAttr; -T3SQLSetEnvAttr pODBC3SQLSetEnvAttr; -T3SQLGetEnvAttr pODBC3SQLGetEnvAttr; -T3SQLSetStmtAttr pODBC3SQLSetStmtAttr; -T3SQLGetStmtAttr pODBC3SQLGetStmtAttr; -T3SQLPrepare pODBC3SQLPrepare; -T3SQLBindParameter pODBC3SQLBindParameter; -T3SQLSetCursorName pODBC3SQLSetCursorName; -T3SQLExecute pODBC3SQLExecute; -T3SQLExecDirect pODBC3SQLExecDirect; -T3SQLDescribeParam pODBC3SQLDescribeParam; -T3SQLNumParams pODBC3SQLNumParams; -T3SQLParamData pODBC3SQLParamData; -T3SQLPutData pODBC3SQLPutData; -T3SQLRowCount pODBC3SQLRowCount; -T3SQLNumResultCols pODBC3SQLNumResultCols; -T3SQLDescribeCol pODBC3SQLDescribeCol; -T3SQLColAttribute pODBC3SQLColAttribute; -T3SQLBindCol pODBC3SQLBindCol; -T3SQLFetch pODBC3SQLFetch; -T3SQLFetchScroll pODBC3SQLFetchScroll; -T3SQLGetData pODBC3SQLGetData; -T3SQLSetPos pODBC3SQLSetPos; -T3SQLBulkOperations pODBC3SQLBulkOperations; -T3SQLMoreResults pODBC3SQLMoreResults; -T3SQLGetDiagRec pODBC3SQLGetDiagRec; -T3SQLColumnPrivileges pODBC3SQLColumnPrivileges; -T3SQLColumns pODBC3SQLColumns; -T3SQLForeignKeys pODBC3SQLForeignKeys; -T3SQLPrimaryKeys pODBC3SQLPrimaryKeys; -T3SQLProcedureColumns pODBC3SQLProcedureColumns; -T3SQLProcedures pODBC3SQLProcedures; -T3SQLSpecialColumns pODBC3SQLSpecialColumns; -T3SQLStatistics pODBC3SQLStatistics; -T3SQLTablePrivileges pODBC3SQLTablePrivileges; -T3SQLTables pODBC3SQLTables; -T3SQLFreeStmt pODBC3SQLFreeStmt; -T3SQLCloseCursor pODBC3SQLCloseCursor; -T3SQLCancel pODBC3SQLCancel; -T3SQLEndTran pODBC3SQLEndTran; -T3SQLDisconnect pODBC3SQLDisconnect; -T3SQLFreeHandle pODBC3SQLFreeHandle; -T3SQLGetCursorName pODBC3SQLGetCursorName; -T3SQLNativeSql pODBC3SQLNativeSql; - -static bool LoadFunctions(oslModule pODBCso); - -// Take care of Dynamically loading of the DLL/shared lib and Addresses: -// Returns sal_True at success -bool LoadLibrary_ODBC3(OUString &_rPath) -{ - static bool bLoaded = false; - static oslModule pODBCso = nullptr; - - if (bLoaded) - return true; -#ifdef DISABLE_DYNLOADING - (void)_rPath; -#else -#ifdef _WIN32 - _rPath = "ODBC32.DLL"; -#endif -#ifdef UNX - #ifdef MACOSX - _rPath = "libiodbc.dylib"; - #else - _rPath = "libodbc.so.2"; - pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW ); - if ( !pODBCso ) - { - _rPath = "libodbc.so.1"; - pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW ); - } - if ( !pODBCso ) - _rPath = "libodbc.so"; - - #endif /* MACOSX */ -#endif - - if ( !pODBCso ) - pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW ); -#endif // DISABLE_DYNLOADING - if( !pODBCso) - return false; - - bLoaded = LoadFunctions(pODBCso); - return bLoaded; -} - - -bool LoadFunctions(oslModule pODBCso) -{ - - if( ( pODBC3SQLAllocHandle = reinterpret_cast<T3SQLAllocHandle>(osl_getFunctionSymbol(pODBCso, OUString("SQLAllocHandle").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLConnect = reinterpret_cast<T3SQLConnect>(osl_getFunctionSymbol(pODBCso, OUString("SQLConnect").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLDriverConnect = reinterpret_cast<T3SQLDriverConnect>(osl_getFunctionSymbol(pODBCso, OUString("SQLDriverConnect").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLBrowseConnect = reinterpret_cast<T3SQLBrowseConnect>(osl_getFunctionSymbol(pODBCso, OUString("SQLBrowseConnect").pData ))) == nullptr ) - return false; - if(( pODBC3SQLDataSources = reinterpret_cast<T3SQLDataSources>(osl_getFunctionSymbol(pODBCso, OUString("SQLDataSources").pData ))) == nullptr ) - return false; - if(( pODBC3SQLDrivers = reinterpret_cast<T3SQLDrivers>(osl_getFunctionSymbol(pODBCso, OUString("SQLDrivers").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetInfo = reinterpret_cast<T3SQLGetInfo>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetInfo").pData ))) == nullptr ) - return false; - if(( pODBC3SQLGetFunctions = reinterpret_cast<T3SQLGetFunctions>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetFunctions").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetTypeInfo = reinterpret_cast<T3SQLGetTypeInfo>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetTypeInfo").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLSetConnectAttr = reinterpret_cast<T3SQLSetConnectAttr>(osl_getFunctionSymbol(pODBCso, OUString("SQLSetConnectAttr").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetConnectAttr = reinterpret_cast<T3SQLGetConnectAttr>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetConnectAttr").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLSetEnvAttr = reinterpret_cast<T3SQLSetEnvAttr>(osl_getFunctionSymbol(pODBCso, OUString("SQLSetEnvAttr").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetEnvAttr = reinterpret_cast<T3SQLGetEnvAttr>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetEnvAttr").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLSetStmtAttr = reinterpret_cast<T3SQLSetStmtAttr>(osl_getFunctionSymbol(pODBCso, OUString("SQLSetStmtAttr").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetStmtAttr = reinterpret_cast<T3SQLGetStmtAttr>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetStmtAttr").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLPrepare = reinterpret_cast<T3SQLPrepare>(osl_getFunctionSymbol(pODBCso, OUString("SQLPrepare").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLBindParameter = reinterpret_cast<T3SQLBindParameter>(osl_getFunctionSymbol(pODBCso, OUString("SQLBindParameter").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLSetCursorName = reinterpret_cast<T3SQLSetCursorName>(osl_getFunctionSymbol(pODBCso, OUString("SQLSetCursorName").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLExecute = reinterpret_cast<T3SQLExecute>(osl_getFunctionSymbol(pODBCso, OUString("SQLExecute").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLExecDirect = reinterpret_cast<T3SQLExecDirect>(osl_getFunctionSymbol(pODBCso, OUString("SQLExecDirect").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLDescribeParam = reinterpret_cast<T3SQLDescribeParam>(osl_getFunctionSymbol(pODBCso, OUString("SQLDescribeParam").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLNumParams = reinterpret_cast<T3SQLNumParams>(osl_getFunctionSymbol(pODBCso, OUString("SQLNumParams").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLParamData = reinterpret_cast<T3SQLParamData>(osl_getFunctionSymbol(pODBCso, OUString("SQLParamData").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLPutData = reinterpret_cast<T3SQLPutData>(osl_getFunctionSymbol(pODBCso, OUString("SQLPutData").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLRowCount = reinterpret_cast<T3SQLRowCount>(osl_getFunctionSymbol(pODBCso, OUString("SQLRowCount").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLNumResultCols = reinterpret_cast<T3SQLNumResultCols>(osl_getFunctionSymbol(pODBCso, OUString("SQLNumResultCols").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLDescribeCol = reinterpret_cast<T3SQLDescribeCol>(osl_getFunctionSymbol(pODBCso, OUString("SQLDescribeCol").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLColAttribute = reinterpret_cast<T3SQLColAttribute>(osl_getFunctionSymbol(pODBCso, OUString("SQLColAttribute").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLBindCol = reinterpret_cast<T3SQLBindCol>(osl_getFunctionSymbol(pODBCso, OUString("SQLBindCol").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLFetch = reinterpret_cast<T3SQLFetch>(osl_getFunctionSymbol(pODBCso, OUString("SQLFetch").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLFetchScroll = reinterpret_cast<T3SQLFetchScroll>(osl_getFunctionSymbol(pODBCso, OUString("SQLFetchScroll").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetData = reinterpret_cast<T3SQLGetData>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetData").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLSetPos = reinterpret_cast<T3SQLSetPos>(osl_getFunctionSymbol(pODBCso, OUString("SQLSetPos").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLBulkOperations = reinterpret_cast<T3SQLBulkOperations>(osl_getFunctionSymbol(pODBCso, OUString("SQLBulkOperations").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLMoreResults = reinterpret_cast<T3SQLMoreResults>(osl_getFunctionSymbol(pODBCso, OUString("SQLMoreResults").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetDiagRec = reinterpret_cast<T3SQLGetDiagRec>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetDiagRec").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLColumnPrivileges = reinterpret_cast<T3SQLColumnPrivileges>(osl_getFunctionSymbol(pODBCso, OUString("SQLColumnPrivileges").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLColumns = reinterpret_cast<T3SQLColumns>(osl_getFunctionSymbol(pODBCso, OUString("SQLColumns").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLForeignKeys = reinterpret_cast<T3SQLForeignKeys>(osl_getFunctionSymbol(pODBCso, OUString("SQLForeignKeys").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLPrimaryKeys = reinterpret_cast<T3SQLPrimaryKeys>(osl_getFunctionSymbol(pODBCso, OUString("SQLPrimaryKeys").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLProcedureColumns = reinterpret_cast<T3SQLProcedureColumns>(osl_getFunctionSymbol(pODBCso, OUString("SQLProcedureColumns").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLProcedures = reinterpret_cast<T3SQLProcedures>(osl_getFunctionSymbol(pODBCso, OUString("SQLProcedures").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLSpecialColumns = reinterpret_cast<T3SQLSpecialColumns>(osl_getFunctionSymbol(pODBCso, OUString("SQLSpecialColumns").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLStatistics = reinterpret_cast<T3SQLStatistics>(osl_getFunctionSymbol(pODBCso, OUString("SQLStatistics").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLTablePrivileges = reinterpret_cast<T3SQLTablePrivileges>(osl_getFunctionSymbol(pODBCso, OUString("SQLTablePrivileges").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLTables = reinterpret_cast<T3SQLTables>(osl_getFunctionSymbol(pODBCso, OUString("SQLTables").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLFreeStmt = reinterpret_cast<T3SQLFreeStmt>(osl_getFunctionSymbol(pODBCso, OUString("SQLFreeStmt").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLCloseCursor = reinterpret_cast<T3SQLCloseCursor>(osl_getFunctionSymbol(pODBCso, OUString("SQLCloseCursor").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLCancel = reinterpret_cast<T3SQLCancel>(osl_getFunctionSymbol(pODBCso, OUString("SQLCancel").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLEndTran = reinterpret_cast<T3SQLEndTran>(osl_getFunctionSymbol(pODBCso, OUString("SQLEndTran").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLDisconnect = reinterpret_cast<T3SQLDisconnect>(osl_getFunctionSymbol(pODBCso, OUString("SQLDisconnect").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLFreeHandle = reinterpret_cast<T3SQLFreeHandle>(osl_getFunctionSymbol(pODBCso, OUString("SQLFreeHandle").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLGetCursorName = reinterpret_cast<T3SQLGetCursorName>(osl_getFunctionSymbol(pODBCso, OUString("SQLGetCursorName").pData ))) == nullptr ) - return false; - if( ( pODBC3SQLNativeSql = reinterpret_cast<T3SQLNativeSql>(osl_getFunctionSymbol(pODBCso, OUString("SQLNativeSql").pData ))) == nullptr ) - return false; - - return true; -} - - -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/odbc/OPreparedStatement.cxx b/connectivity/source/drivers/odbc/OPreparedStatement.cxx index 507a52d872a2..e0225e0f6407 100644 --- a/connectivity/source/drivers/odbc/OPreparedStatement.cxx +++ b/connectivity/source/drivers/odbc/OPreparedStatement.cxx @@ -40,22 +40,12 @@ using namespace connectivity; using namespace connectivity::odbc; using namespace com::sun::star::uno; using namespace com::sun::star::lang; -using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; using namespace com::sun::star::io; using namespace com::sun::star::util; -IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.OPreparedStatement","com.sun.star.sdbc.PreparedStatement"); - -namespace -{ - // for now, never use wchar, - // but most of code is prepared to handle it - // in case we make this configurable - const bool bUseWChar = false; -} +IMPLEMENT_SERVICE_INFO(OPreparedStatement,u"com.sun.star.sdbcx.OPreparedStatement"_ustr,u"com.sun.star.sdbc.PreparedStatement"_ustr); OPreparedStatement::OPreparedStatement( OConnection* _pConnection,const OUString& sql) :OStatement_BASE2(_pConnection) @@ -93,6 +83,11 @@ css::uno::Sequence< css::uno::Type > SAL_CALL OPreparedStatement::getTypes( ) Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData( ) { + return getMetaDataImpl(); +} + +const rtl::Reference< OResultSetMetaData > & OPreparedStatement::getMetaDataImpl() +{ ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); @@ -149,7 +144,7 @@ sal_Bool SAL_CALL OPreparedStatement::execute( ) OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); try { - SQLRETURN nReturn = N3SQLExecute(m_aStatementHandle); + SQLRETURN nReturn = functions().Execute(m_aStatementHandle); OTools::ThrowException(m_pConnection.get(),nReturn,m_aStatementHandle,SQL_HANDLE_STMT,*this); bool needData = nReturn == SQL_NEED_DATA; @@ -163,7 +158,7 @@ sal_Bool SAL_CALL OPreparedStatement::execute( ) // Get the parameter number that requires data sal_Int32* paramIndex = nullptr; - N3SQLParamData(m_aStatementHandle, reinterpret_cast<SQLPOINTER*>(¶mIndex)); + functions().ParamData(m_aStatementHandle, reinterpret_cast<SQLPOINTER*>(¶mIndex)); // If the parameter index is -1, there is no // more data required @@ -236,7 +231,7 @@ Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - Reference< XResultSet > rs; + rtl::Reference< OResultSet > rs; prepareStatement(); @@ -316,36 +311,21 @@ void OPreparedStatement::setParameter(const sal_Int32 parameterIndex, const sal_ * * Our internal OUString storage is always UTF-16, so no conversion to do here. */ - static_assert(sizeof (SQLWCHAR) == 2 || sizeof (SQLWCHAR) == 4, "must be 2 or 4"); - if (sizeof (SQLWCHAR) == 2) - { - nCharLen = _sData.getLength(); - nByteLen = 2 * nCharLen; - pData = allocBindBuf(parameterIndex, nByteLen); - memcpy(pData, _sData.getStr(), nByteLen); - } - else - { - pData = allocBindBuf(parameterIndex, _sData.getLength() * 4); - sal_uInt32* pCursor = static_cast<sal_uInt32*>(pData); - nCharLen = 0; - for (sal_Int32 i = 0; i != _sData.getLength();) - { - *pCursor++ = _sData.iterateCodePoints(&i); - nCharLen += 1; - } - nByteLen = 4 * nCharLen; - } + SQLWChars data(_sData); + nCharLen = data.cch(); + nByteLen = data.cb(); + pData = allocBindBuf(parameterIndex, nByteLen); + memcpy(pData, data.get(), nByteLen); } else { assert(getOwnConnection()->getTextEncoding() != RTL_TEXTENCODING_UCS2 && getOwnConnection()->getTextEncoding() != RTL_TEXTENCODING_UCS4); - OString sOData( - OUStringToOString(_sData, getOwnConnection()->getTextEncoding())); - nCharLen = nByteLen = sOData.getLength(); + SQLChars data(_sData, getOwnConnection()->getTextEncoding()); + nCharLen = data.cch(); + nByteLen = data.cb(); pData = allocBindBuf(parameterIndex, nByteLen); - memcpy(pData, sOData.getStr(), nByteLen); + memcpy(pData, data.get(), nByteLen); } setParameter( parameterIndex, _nType, nCharLen, _nScale, pData, nByteLen, nByteLen ); @@ -369,13 +349,13 @@ void OPreparedStatement::setParameter(const sal_Int32 parameterIndex, const sal_ void OPreparedStatement::setParameter(const sal_Int32 parameterIndex, const sal_Int32 _nType, const SQLULEN _nColumnSize, const sal_Int32 _nScale, const void* const _pData, const SQLULEN _nDataLen, const SQLLEN _nDataAllocLen) { SQLSMALLINT fCType, fSqlType; - OTools::getBindTypes(bUseWChar, m_pConnection->useOldDateFormat(), OTools::jdbcTypeToOdbc(_nType), fCType, fSqlType); + OTools::getBindTypes(m_pConnection->useOldDateFormat(), OTools::jdbcTypeToOdbc(_nType), fCType, fSqlType); SQLLEN& rDataLen = boundParams[parameterIndex-1].getBindLengthBuffer(); rDataLen = _nDataLen; SQLRETURN nRetcode; - nRetcode = (*reinterpret_cast<T3SQLBindParameter>(m_pConnection->getOdbcFunction(ODBC3SQLFunctionId::BindParameter)))( + nRetcode = functions().BindParameter( m_aStatementHandle, // checkParameterIndex guarantees this is safe static_cast<SQLUSMALLINT>(parameterIndex), @@ -509,13 +489,12 @@ void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, const sal_I SQLSMALLINT fCType; SQLSMALLINT fSqlType; - OTools::getBindTypes( bUseWChar, - m_pConnection->useOldDateFormat(), + OTools::getBindTypes( m_pConnection->useOldDateFormat(), OTools::jdbcTypeToOdbc(_nType), fCType, fSqlType); - SQLRETURN nReturn = N3SQLBindParameter( m_aStatementHandle, + SQLRETURN nReturn = functions().BindParameter( m_aStatementHandle, static_cast<SQLUSMALLINT>(parameterIndex), SQL_PARAM_INPUT, fCType, @@ -546,13 +525,13 @@ void SAL_CALL OPreparedStatement::setBlob( sal_Int32 parameterIndex, const Refer void SAL_CALL OPreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const Reference< XArray >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setArray", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setArray"_ustr, *this ); } void SAL_CALL OPreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const Reference< XRef >& /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XParameters::setRef", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XParameters::setRef"_ustr, *this ); } void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, const Any& x, sal_Int32 sqlType, sal_Int32 scale ) @@ -582,9 +561,21 @@ void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, c case DataType::NUMERIC: if(x.hasValue()) { + // NB: sqlType and scale are not to be sent to the database, but to be used here. + // XParameters::setObjectWithInfo is required to convert the given object to the + // required type before being sent to the database; and scale may be needed for + // that conversion. But here we convert any object to a decimal string; and ODBC + // (or at least some drivers - see tdf#162219) needs DecimalDigits value passed + // to SQLBindParameter equal to the number of decimals in the string, otherwise + // the conversion from string to decimal fails. It may be not equal to the scale + // of the target parameter; ODBC driver handles that. Therefore, here we ignore + // the originally passed value of scale. ORowSetValue aValue; aValue.fill(x); - setParameter(parameterIndex, sqlType, scale, aValue.getString()); + OUString number(aValue.getString()); + sal_Int32 nIndex = number.indexOf('.'); + sal_Int32 decimals = nIndex < 0 ? 0 : (number.getLength() - nIndex - 1); + setParameter(parameterIndex, sqlType, decimals, number); } else setNull(parameterIndex,sqlType); @@ -641,13 +632,13 @@ void SAL_CALL OPreparedStatement::clearParameters( ) ::osl::MutexGuard aGuard( m_aMutex ); prepareStatement(); OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - N3SQLFreeStmt (m_aStatementHandle, SQL_RESET_PARAMS); - N3SQLFreeStmt (m_aStatementHandle, SQL_UNBIND); + functions().FreeStmt (m_aStatementHandle, SQL_RESET_PARAMS); + functions().FreeStmt (m_aStatementHandle, SQL_UNBIND); } void SAL_CALL OPreparedStatement::clearBatch( ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XPreparedBatchExecution::clearBatch", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XPreparedBatchExecution::clearBatch"_ustr, *this ); // clearParameters( ); // m_aBatchVector.erase(); } @@ -655,18 +646,14 @@ void SAL_CALL OPreparedStatement::clearBatch( ) void SAL_CALL OPreparedStatement::addBatch( ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XPreparedBatchExecution::addBatch", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XPreparedBatchExecution::addBatch"_ustr, *this ); } - Sequence< sal_Int32 > SAL_CALL OPreparedStatement::executeBatch( ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XPreparedBatchExecution::executeBatch", *this ); - // not reached, but keep -Werror happy - return Sequence< sal_Int32 > (); + ::dbtools::throwFunctionNotSupportedSQLException( u"XPreparedBatchExecution::executeBatch"_ustr, *this ); } - // methods @@ -679,7 +666,7 @@ void OPreparedStatement::initBoundParam () OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); // Get the number of parameters numParams = 0; - N3SQLNumParams (m_aStatementHandle,&numParams); + functions().NumParams (m_aStatementHandle,&numParams); // There are parameter markers, allocate the bound // parameter objects @@ -778,7 +765,7 @@ void OPreparedStatement::putParamData (sal_Int32 index) // Put the data OSL_ENSURE( m_aStatementHandle, "OPreparedStatement::putParamData: StatementHandle is null!" ); - N3SQLPutData ( m_aStatementHandle, buf.getArray(), buf.getLength() ); + functions().PutData ( m_aStatementHandle, buf.getArray(), buf.getLength() ); // decrement the number of bytes still needed maxBytesLeft -= haveRead; @@ -825,11 +812,11 @@ void OPreparedStatement::setStream( *lenBuf = SQL_LEN_DATA_AT_EXEC (length); SQLSMALLINT fCType, fSqlType; - OTools::getBindTypes(bUseWChar, m_pConnection->useOldDateFormat(), OTools::jdbcTypeToOdbc(_nType), fCType, fSqlType); + OTools::getBindTypes(m_pConnection->useOldDateFormat(), OTools::jdbcTypeToOdbc(_nType), fCType, fSqlType); OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - N3SQLBindParameter(m_aStatementHandle, + functions().BindParameter(m_aStatementHandle, static_cast<SQLUSMALLINT>(ParameterIndex), SQL_PARAM_INPUT, fCType, @@ -888,8 +875,17 @@ void OPreparedStatement::prepareStatement() if(!isPrepared()) { OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - OString aSql(OUStringToOString(m_sSqlStatement,getOwnConnection()->getTextEncoding())); - SQLRETURN nReturn = N3SQLPrepare(m_aStatementHandle, reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(aSql.getStr())), aSql.getLength()); + SQLRETURN nReturn; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::PrepareW)) + { + SQLWChars aSql(m_sSqlStatement); + nReturn = functions().PrepareW(m_aStatementHandle, aSql.get(), aSql.cch()); + } + else + { + SQLChars aSql(m_sSqlStatement, getOwnConnection()->getTextEncoding()); + nReturn = functions().Prepare(m_aStatementHandle, aSql.get(), aSql.cch()); + } OTools::ThrowException(m_pConnection.get(),nReturn,m_aStatementHandle,SQL_HANDLE_STMT,*this); m_bPrepared = true; initBoundParam(); @@ -909,14 +905,14 @@ void OPreparedStatement::checkParameterIndex(sal_Int32 _parameterIndex) )); SQLException aNext(sError,*this, OUString(),0,Any()); - ::dbtools::throwInvalidIndexException(*this,makeAny(aNext)); + ::dbtools::throwInvalidIndexException(*this,Any(aNext)); } } rtl::Reference<OResultSet> OPreparedStatement::createResultSet() { rtl::Reference<OResultSet> pReturn = new OResultSet(m_aStatementHandle,this); - pReturn->setMetaData(getMetaData()); + pReturn->setMetaData(getMetaDataImpl()); return pReturn; } diff --git a/connectivity/source/drivers/odbc/ORealDriver.cxx b/connectivity/source/drivers/odbc/ORealDriver.cxx deleted file mode 100644 index 28c054b45f7c..000000000000 --- a/connectivity/source/drivers/odbc/ORealDriver.cxx +++ /dev/null @@ -1,291 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include <odbc/ODriver.hxx> -#include <odbc/OTools.hxx> -#include <odbc/OFunctions.hxx> - -namespace connectivity::odbc -{ - namespace { - - class ORealOdbcDriver : public ODBCDriver - { - protected: - virtual oslGenericFunction getOdbcFunction(ODBC3SQLFunctionId _nIndex) const override; - virtual SQLHANDLE EnvironmentHandle(OUString &_rPath) override; - public: - explicit ORealOdbcDriver(const css::uno::Reference< css::uno::XComponentContext >& _rxContext) : ODBCDriver(_rxContext) {} - }; - - } - -oslGenericFunction ORealOdbcDriver::getOdbcFunction(ODBC3SQLFunctionId _nIndex) const -{ - oslGenericFunction pFunction = nullptr; - switch(_nIndex) - { - case ODBC3SQLFunctionId::AllocHandle: - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLAllocHandle); - break; - case ODBC3SQLFunctionId::Connect: - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLConnect); - break; - case ODBC3SQLFunctionId::DriverConnect: - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLDriverConnect); - break; - case ODBC3SQLFunctionId::BrowseConnect: - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLBrowseConnect); - break; - case ODBC3SQLFunctionId::DataSources: - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLDataSources); - break; - case ODBC3SQLFunctionId::Drivers: - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLDrivers); - break; - case ODBC3SQLFunctionId::GetInfo: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetInfo); - break; - case ODBC3SQLFunctionId::GetFunctions: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetFunctions); - break; - case ODBC3SQLFunctionId::GetTypeInfo: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetTypeInfo); - break; - case ODBC3SQLFunctionId::SetConnectAttr: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLSetConnectAttr); - break; - case ODBC3SQLFunctionId::GetConnectAttr: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetConnectAttr); - break; - case ODBC3SQLFunctionId::SetEnvAttr: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLSetEnvAttr); - break; - case ODBC3SQLFunctionId::GetEnvAttr: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetEnvAttr); - break; - case ODBC3SQLFunctionId::SetStmtAttr: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLSetStmtAttr); - break; - case ODBC3SQLFunctionId::GetStmtAttr: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetStmtAttr); - break; - case ODBC3SQLFunctionId::Prepare: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLPrepare); - break; - case ODBC3SQLFunctionId::BindParameter: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLBindParameter); - break; - case ODBC3SQLFunctionId::SetCursorName: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLSetCursorName); - break; - case ODBC3SQLFunctionId::Execute: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLExecute); - break; - case ODBC3SQLFunctionId::ExecDirect: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLExecDirect); - break; - case ODBC3SQLFunctionId::DescribeParam: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLDescribeParam); - break; - case ODBC3SQLFunctionId::NumParams: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLNumParams); - break; - case ODBC3SQLFunctionId::ParamData: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLParamData); - break; - case ODBC3SQLFunctionId::PutData: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLPutData); - break; - case ODBC3SQLFunctionId::RowCount: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLRowCount); - break; - case ODBC3SQLFunctionId::NumResultCols: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLNumResultCols); - break; - case ODBC3SQLFunctionId::DescribeCol: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLDescribeCol); - break; - case ODBC3SQLFunctionId::ColAttribute: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLColAttribute); - break; - case ODBC3SQLFunctionId::BindCol: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLBindCol); - break; - case ODBC3SQLFunctionId::Fetch: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLFetch); - break; - case ODBC3SQLFunctionId::FetchScroll: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLFetchScroll); - break; - case ODBC3SQLFunctionId::GetData: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetData); - break; - case ODBC3SQLFunctionId::SetPos: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLSetPos); - break; - case ODBC3SQLFunctionId::BulkOperations: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLBulkOperations); - break; - case ODBC3SQLFunctionId::MoreResults: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLMoreResults); - break; - case ODBC3SQLFunctionId::GetDiagRec: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetDiagRec); - break; - case ODBC3SQLFunctionId::ColumnPrivileges: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLColumnPrivileges); - break; - case ODBC3SQLFunctionId::Columns: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLColumns); - break; - case ODBC3SQLFunctionId::ForeignKeys: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLForeignKeys); - break; - case ODBC3SQLFunctionId::PrimaryKeys: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLPrimaryKeys); - break; - case ODBC3SQLFunctionId::ProcedureColumns: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLProcedureColumns); - break; - case ODBC3SQLFunctionId::Procedures: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLProcedures); - break; - case ODBC3SQLFunctionId::SpecialColumns: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLSpecialColumns); - break; - case ODBC3SQLFunctionId::Statistics: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLStatistics); - break; - case ODBC3SQLFunctionId::TablePrivileges: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLTablePrivileges); - break; - case ODBC3SQLFunctionId::Tables: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLTables); - break; - case ODBC3SQLFunctionId::FreeStmt: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLFreeStmt); - break; - case ODBC3SQLFunctionId::CloseCursor: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLCloseCursor); - break; - case ODBC3SQLFunctionId::Cancel: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLCancel); - break; - case ODBC3SQLFunctionId::EndTran: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLEndTran); - break; - case ODBC3SQLFunctionId::Disconnect: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLDisconnect); - break; - case ODBC3SQLFunctionId::FreeHandle: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLFreeHandle); - break; - case ODBC3SQLFunctionId::GetCursorName: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLGetCursorName); - break; - case ODBC3SQLFunctionId::NativeSql: - - pFunction = reinterpret_cast<oslGenericFunction>(pODBC3SQLNativeSql); - break; - default: - OSL_FAIL("Function unknown!"); - } - return pFunction; -} - - -// ODBC Environment (common for all Connections): -SQLHANDLE ORealOdbcDriver::EnvironmentHandle(OUString &_rPath) -{ - // Is (for this instance) already an Environment made? - if (!m_pDriverHandle) - { - SQLHANDLE h = SQL_NULL_HANDLE; - // allocate Environment - - // load ODBC-DLL now: - if (!LoadLibrary_ODBC3(_rPath) || N3SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&h) != SQL_SUCCESS) - return SQL_NULL_HANDLE; - - // Save in global Structure - m_pDriverHandle = h; - N3SQLSetEnvAttr(h, SQL_ATTR_ODBC_VERSION, reinterpret_cast<SQLPOINTER>(SQL_OV_ODBC3), SQL_IS_UINTEGER); - //N3SQLSetEnvAttr(h, SQL_ATTR_CONNECTION_POOLING,(SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER); - } - - return m_pDriverHandle; -} - -} - -extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* -connectivity_odbc_ORealOdbcDriver_get_implementation( - css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const&) -{ - return cppu::acquire(new connectivity::odbc::ORealOdbcDriver(context)); -} -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/odbc/OResultSet.cxx b/connectivity/source/drivers/odbc/OResultSet.cxx index b38d81b3a4eb..1603f4396749 100644 --- a/connectivity/source/drivers/odbc/OResultSet.cxx +++ b/connectivity/source/drivers/odbc/OResultSet.cxx @@ -31,6 +31,7 @@ #include <cppuhelper/typeprovider.hxx> #include <cppuhelper/supportsservice.hxx> #include <comphelper/types.hxx> +#include <comphelper/scopeguard.hxx> #include <connectivity/dbtools.hxx> #include <connectivity/dbexception.hxx> #include <o3tl/safeint.hxx> @@ -55,21 +56,87 @@ static_assert(ODBC_SQL_NOT_DEFINED != SQL_UB_ON, "ODBC_SQL_NOT_DEFINED must be u static_assert(ODBC_SQL_NOT_DEFINED != SQL_UB_FIXED, "ODBC_SQL_NOT_DEFINED must be unique"); static_assert(ODBC_SQL_NOT_DEFINED != SQL_UB_VARIABLE, "ODBC_SQL_NOT_DEFINED must be unique"); +class connectivity::odbc::BindData +{ +public: + virtual void* data() = 0; + virtual SQLLEN len() const = 0; + + virtual ~BindData() {} +}; + namespace { - const SQLLEN nMaxBookmarkLen = 20; -} +const SQLLEN nMaxBookmarkLen = 20; + +template <typename T> class SimpleBindData : public connectivity::odbc::BindData +{ +public: + SimpleBindData(const void* p) + : value(*static_cast<const T*>(p)) + { + } + void* data() override { return &value; } + SQLLEN len() const override { return sizeof(T); } +private: + T value; +}; + +template <class CHARS_t> class CharsBindData : public connectivity::odbc::BindData +{ +public: + template <typename... Args> + CharsBindData(const void* p, Args... args) + : value(*static_cast<const OUString*>(p), args...) + { + } + template <class S> requires std::is_class_v<S> + CharsBindData(const S& val) + : value(val) + { + } + void* data() override { return value.get(); } + SQLLEN len() const override { return SQL_NTS; } // input data needs to tell it's null-terminated + +private: + CHARS_t value; +}; + +class NullBindData : public connectivity::odbc::BindData +{ +public: + void* data() override { return &value; } + SQLLEN len() const override { return SQL_NULL_DATA; } + +private: + char value[2] = {}; +}; + +class BinaryBindData : public connectivity::odbc::BindData +{ +public: + BinaryBindData(const void* p) + : value(*static_cast<const css::uno::Sequence<sal_Int8>*>(p)) + { + } + void* data() override { return const_cast<sal_Int8*>(value.getConstArray()); } + SQLLEN len() const override { return value.getLength(); } + +private: + css::uno::Sequence<sal_Int8> value; // ref-counted CoW +}; +} // IMPLEMENT_SERVICE_INFO(OResultSet,"com.sun.star.sdbcx.OResultSet","com.sun.star.sdbc.ResultSet"); OUString SAL_CALL OResultSet::getImplementationName( ) { - return "com.sun.star.sdbcx.odbc.ResultSet"; + return u"com.sun.star.sdbcx.odbc.ResultSet"_ustr; } Sequence< OUString > SAL_CALL OResultSet::getSupportedServiceNames( ) { - return { "com.sun.star.sdbc.ResultSet", "com.sun.star.sdbcx.ResultSet" }; + return { u"com.sun.star.sdbc.ResultSet"_ustr, u"com.sun.star.sdbcx.ResultSet"_ustr }; } sal_Bool SAL_CALL OResultSet::supportsService( const OUString& _rServiceName ) @@ -142,10 +209,10 @@ OResultSet::OResultSet(SQLHANDLE _pStatementHandle ,OStatement_Base* pStmt) : // We use SQLFetchScroll unconditionally in several places // the *only* difference this makes is whether ::next() uses SQLFetchScroll or SQLFetch // so this test seems pointless - if ( getOdbcFunction(ODBC3SQLFunctionId::GetFunctions) ) + if (functions().has(ODBC3SQLFunctionId::GetFunctions)) { SQLUSMALLINT nSupported = 0; - m_bUseFetchScroll = ( N3SQLGetFunctions(m_aConnectionHandle,SQL_API_SQLFETCHSCROLL,&nSupported) == SQL_SUCCESS && nSupported == 1 ); + m_bUseFetchScroll = ( functions().GetFunctions(m_aConnectionHandle,SQL_API_SQLFETCHSCROLL,&nSupported) == SQL_SUCCESS && nSupported == 1 ); } } catch(const Exception&) @@ -169,7 +236,7 @@ void OResultSet::construct() void OResultSet::disposing() { - N3SQLCloseCursor(m_aStatementHandle); + functions().CloseCursor(m_aStatementHandle); OPropertySetHelper::disposing(); ::osl::MutexGuard aGuard(m_aMutex); @@ -180,135 +247,17 @@ void OResultSet::disposing() m_xMetaData.clear(); } +// See OResultSet::updateValue SQLRETURN OResultSet::unbind(bool _bUnbindHandle) { SQLRETURN nRet = 0; if ( _bUnbindHandle ) - nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND); + nRet = functions().FreeStmt(m_aStatementHandle,SQL_UNBIND); - if ( !m_aBindVector.empty() ) - { - for(auto& [rPtrAddr, rType] : m_aBindVector) - { - switch (rType) - { - case DataType::CHAR: - case DataType::VARCHAR: - delete static_cast< OString* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::BIGINT: - delete static_cast< sal_Int64* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::DECIMAL: - case DataType::NUMERIC: - delete static_cast< OString* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::REAL: - case DataType::DOUBLE: - delete static_cast< double* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::LONGVARCHAR: - case DataType::CLOB: - delete [] static_cast< char* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::LONGVARBINARY: - case DataType::BLOB: - delete [] static_cast< char* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::DATE: - delete static_cast< DATE_STRUCT* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::TIME: - delete static_cast< TIME_STRUCT* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::TIMESTAMP: - delete static_cast< TIMESTAMP_STRUCT* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::BIT: - case DataType::TINYINT: - delete static_cast< sal_Int8* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::SMALLINT: - delete static_cast< sal_Int16* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::INTEGER: - delete static_cast< sal_Int32* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::FLOAT: - delete static_cast< float* >(reinterpret_cast< void * >(rPtrAddr)); - break; - case DataType::BINARY: - case DataType::VARBINARY: - delete static_cast< sal_Int8* >(reinterpret_cast< void * >(rPtrAddr)); - break; - } - } - m_aBindVector.clear(); - } + m_aBindVector.clear(); return nRet; } -TVoidPtr OResultSet::allocBindColumn(sal_Int32 _nType,sal_Int32 _nColumnIndex) -{ - TVoidPtr aPair; - switch (_nType) - { - case DataType::CHAR: - case DataType::VARCHAR: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new OString()),_nType); - break; - case DataType::BIGINT: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new sal_Int64(0)),_nType); - break; - case DataType::DECIMAL: - case DataType::NUMERIC: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new OString()),_nType); - break; - case DataType::REAL: - case DataType::DOUBLE: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new double(0.0)),_nType); - break; - case DataType::LONGVARCHAR: - case DataType::CLOB: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new char[2]),_nType); // only for finding - break; - case DataType::LONGVARBINARY: - case DataType::BLOB: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new char[2]),_nType); // only for finding - break; - case DataType::DATE: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new DATE_STRUCT),_nType); - break; - case DataType::TIME: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new TIME_STRUCT),_nType); - break; - case DataType::TIMESTAMP: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new TIMESTAMP_STRUCT),_nType); - break; - case DataType::BIT: - case DataType::TINYINT: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new sal_Int8(0)),_nType); - break; - case DataType::SMALLINT: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new sal_Int16(0)),_nType); - break; - case DataType::INTEGER: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new sal_Int32(0)),_nType); - break; - case DataType::FLOAT: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new float(0)),_nType); - break; - case DataType::BINARY: - case DataType::VARBINARY: - aPair = TVoidPtr(reinterpret_cast< sal_Int64 >(new sal_Int8[m_aRow[_nColumnIndex].getSequence().getLength()]),_nType); - break; - default: - SAL_WARN( "connectivity.odbc", "Unknown type"); - aPair = TVoidPtr(0,_nType); - } - return aPair; -} - void OResultSet::allocBuffer() { Reference< XResultSetMetaData > xMeta = getMetaData(); @@ -369,8 +318,6 @@ sal_Int32 SAL_CALL OResultSet::findColumn( const OUString& columnName ) } ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); - return 0; // Never reached } void OResultSet::ensureCacheForColumn(sal_Int32 columnIndex) @@ -407,9 +354,7 @@ Reference< XInputStream > SAL_CALL OResultSet::getBinaryStream( sal_Int32 /*colu ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBinaryStream", *this ); - - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBinaryStream"_ustr, *this ); } Reference< XInputStream > SAL_CALL OResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) @@ -417,9 +362,7 @@ Reference< XInputStream > SAL_CALL OResultSet::getCharacterStream( sal_Int32 /*c ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBinaryStream", *this ); - - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBinaryStream"_ustr, *this ); } template < typename T > T OResultSet::impl_getValue( const sal_Int32 _nColumnIndex, SQLSMALLINT nType ) @@ -498,7 +441,7 @@ Sequence< sal_Int8 > SAL_CALL OResultSet::getBytes( sal_Int32 columnIndex ) break; default: { - OUString const & sRet = m_aRow[columnIndex].getString(); + OUString const sRet = m_aRow[columnIndex].getString(); nRet = Sequence<sal_Int8>(reinterpret_cast<const sal_Int8*>(sRet.getStr()),sizeof(sal_Unicode)*sRet.getLength()); } } @@ -517,7 +460,7 @@ Sequence< sal_Int8 > OResultSet::impl_getBytes( sal_Int32 columnIndex ) case SQL_CHAR: case SQL_LONGVARCHAR: { - OUString const & aRet = OTools::getStringValue(m_pStatement->getOwnConnection(),m_aStatementHandle,columnIndex,nColumnType,m_bWasNull,**this,m_nTextEncoding); + OUString const aRet = OTools::getStringValue(m_pStatement->getOwnConnection(),m_aStatementHandle,columnIndex,nColumnType,m_bWasNull,**this,m_nTextEncoding); return Sequence<sal_Int8>(reinterpret_cast<const sal_Int8*>(aRet.getStr()),sizeof(sal_Unicode)*aRet.getLength()); } default: @@ -597,31 +540,24 @@ Reference< XResultSetMetaData > SAL_CALL OResultSet::getMetaData( ) Reference< XArray > SAL_CALL OResultSet::getArray( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getArray", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getArray"_ustr, *this ); } - Reference< XClob > SAL_CALL OResultSet::getClob( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getClob", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getClob"_ustr, *this ); } Reference< XBlob > SAL_CALL OResultSet::getBlob( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getBlob", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getBlob"_ustr, *this ); } - Reference< XRef > SAL_CALL OResultSet::getRef( sal_Int32 /*columnIndex*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRow::getRef", *this ); - return nullptr; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRow::getRef"_ustr, *this ); } - Any SAL_CALL OResultSet::getObject( sal_Int32 columnIndex, const Reference< css::container::XNameAccess >& /*typeMap*/ ) { return getValue<ORowSetValue>( columnIndex ).makeAny(); @@ -821,7 +757,7 @@ void SAL_CALL OResultSet::cancel( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - N3SQLCancel(m_aStatementHandle); + functions().Cancel(m_aStatementHandle); } void SAL_CALL OResultSet::clearWarnings( ) @@ -843,7 +779,7 @@ void SAL_CALL OResultSet::insertRow( ) Sequence<sal_Int8> aBookmark(nMaxBookmarkLen); static_assert(o3tl::make_unsigned(nMaxBookmarkLen) >= sizeof(SQLLEN), "must be larger"); - SQLRETURN nRet = N3SQLBindCol(m_aStatementHandle, + SQLRETURN nRet = functions().BindCol(m_aStatementHandle, 0, SQL_C_VARBOOKMARK, aBookmark.getArray(), @@ -851,47 +787,38 @@ void SAL_CALL OResultSet::insertRow( ) &nRealLen ); - bool bPositionByBookmark = ( nullptr != getOdbcFunction( ODBC3SQLFunctionId::BulkOperations ) ); + bool bPositionByBookmark = functions().has(ODBC3SQLFunctionId::BulkOperations); if ( bPositionByBookmark ) { - nRet = N3SQLBulkOperations( m_aStatementHandle, SQL_ADD ); + nRet = functions().BulkOperations( m_aStatementHandle, SQL_ADD ); fillNeededData( nRet ); } else { if(isBeforeFirst()) next(); // must be done - nRet = N3SQLSetPos( m_aStatementHandle, 1, SQL_ADD, SQL_LOCK_NO_CHANGE ); + nRet = functions().SetPos( m_aStatementHandle, 1, SQL_ADD, SQL_LOCK_NO_CHANGE ); fillNeededData( nRet ); } aBookmark.realloc(nRealLen); - try - { - OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); - } - catch(const SQLException&) - { - nRet = unbind(); - throw; - } - - nRet = unbind(); + SQLRETURN nRet2 = unbind(); OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); + OTools::ThrowException(m_pStatement->getOwnConnection(),nRet2,m_aStatementHandle,SQL_HANDLE_STMT,*this); if ( bPositionByBookmark ) { setStmtOption<SQLLEN*, SQL_IS_POINTER>(SQL_ATTR_FETCH_BOOKMARK_PTR, reinterpret_cast<SQLLEN*>(aBookmark.getArray())); - nRet = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,0); + nRet = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,0); } else - nRet = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0); // OJ 06.03.2004 + nRet = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0); // OJ 06.03.2004 // sometimes we got an error but we are not interested in anymore #106047# OJ // OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); if(m_pSkipDeletedSet) { - if(moveToBookmark(makeAny(aBookmark))) + if(moveToBookmark(Any(aBookmark))) { sal_Int32 nRowPos = getDriverPos(); if ( -1 == m_nRowPos ) @@ -918,14 +845,16 @@ void SAL_CALL OResultSet::updateRow( ) try { - bool bPositionByBookmark = ( nullptr != getOdbcFunction( ODBC3SQLFunctionId::BulkOperations ) ); + /* tdf#148367 this block is commented out, because SQLBulkOperations fails + with Access ODBC 64-bit drivers on Windows + bool bPositionByBookmark = functions().has(ODBC3SQLFunctionId::BulkOperations); if ( bPositionByBookmark ) { getBookmark(); assert(m_aRow[0].isBound()); Sequence<sal_Int8> aBookmark(m_aRow[0].getSequence()); SQLLEN nRealLen = aBookmark.getLength(); - nRet = N3SQLBindCol(m_aStatementHandle, + nRet = functions().BindCol(m_aStatementHandle, 0, SQL_C_VARBOOKMARK, aBookmark.getArray(), @@ -933,15 +862,15 @@ void SAL_CALL OResultSet::updateRow( ) &nRealLen ); OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); - nRet = N3SQLBulkOperations(m_aStatementHandle, SQL_UPDATE_BY_BOOKMARK); + nRet = functions().BulkOperations(m_aStatementHandle, SQL_UPDATE_BY_BOOKMARK); fillNeededData(nRet); // the driver should not have touched this // (neither the contents of aBookmark FWIW) assert(nRealLen == aBookmark.getLength()); } - else + else */ { - nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_UPDATE,SQL_LOCK_NO_CHANGE); + nRet = functions().SetPos(m_aStatementHandle,1,SQL_UPDATE,SQL_LOCK_NO_CHANGE); fillNeededData(nRet); } OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); @@ -965,7 +894,7 @@ void SAL_CALL OResultSet::deleteRow( ) { SQLRETURN nRet = SQL_SUCCESS; sal_Int32 nPos = getDriverPos(); - nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_DELETE,SQL_LOCK_NO_CHANGE); + nRet = functions().SetPos(m_aStatementHandle,1,SQL_DELETE,SQL_LOCK_NO_CHANGE); OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); m_bRowDeleted = ( m_pRowStatusArray[0] == SQL_ROW_DELETED ); @@ -995,7 +924,7 @@ void SAL_CALL OResultSet::moveToInsertRow( ) invalidateCache(); // first unbound all columns OSL_VERIFY( unbind() == SQL_SUCCESS ); - // SQLRETURN nRet = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)1,SQL_IS_INTEGER); + // SQLRETURN nRet = functions().SetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)1,SQL_IS_INTEGER); } @@ -1009,30 +938,115 @@ void OResultSet::updateValue(sal_Int32 columnIndex, SQLSMALLINT _nType, void con ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - m_aBindVector.push_back(allocBindColumn(OTools::MapOdbcType2Jdbc(_nType),columnIndex)); - void* pData = reinterpret_cast<void*>(m_aBindVector.rbegin()->first); - OSL_ENSURE(pData != nullptr,"Data for update is NULL!"); - OTools::bindValue( m_pStatement->getOwnConnection(), - m_aStatementHandle, - columnIndex, - _nType, - 0, - _pValue, - pData, - &m_aLengthVector[columnIndex], - **this, - m_nTextEncoding, - m_pStatement->getOwnConnection()->useOldDateFormat()); + SQLSMALLINT fCType, dummy; + OTools::getBindTypes(m_pStatement->getOwnConnection()->useOldDateFormat(), _nType, fCType, + dummy); + + SQLLEN* const pLen = &m_aLengthVector[columnIndex]; + *pLen = 0; + std::unique_ptr<BindData> bindData; + void* pData = nullptr; + + if (columnIndex != 0 && !_pValue) + { + bindData = std::make_unique<NullBindData>(); + } + else + { + assert(_pValue); + + switch (_nType) + { + case SQL_CHAR: + case SQL_VARCHAR: + case SQL_WCHAR: + case SQL_WVARCHAR: + if (fCType == SQL_C_CHAR) + bindData = std::make_unique<CharsBindData<SQLChars>>(_pValue, m_nTextEncoding); + else + bindData = std::make_unique<CharsBindData<SQLWChars>>(_pValue); + break; + case SQL_DECIMAL: + case SQL_NUMERIC: + if (fCType == SQL_C_CHAR) + bindData = std::make_unique<CharsBindData<SQLChars>>( + OString::number(*static_cast<const double*>(_pValue))); + else + bindData = std::make_unique<CharsBindData<SQLWChars>>( + OUString::number(*static_cast<const double*>(_pValue))); + break; + case SQL_BIT: + case SQL_TINYINT: + bindData = std::make_unique<SimpleBindData<sal_Int8>>(_pValue); + break; + case SQL_SMALLINT: + bindData = std::make_unique<SimpleBindData<sal_Int16>>(_pValue); + break; + case SQL_INTEGER: + bindData = std::make_unique<SimpleBindData<sal_Int32>>(_pValue); + break; + case SQL_BIGINT: + bindData = std::make_unique<SimpleBindData<sal_Int64>>(_pValue); + break; + case SQL_FLOAT: + bindData = std::make_unique<SimpleBindData<float>>(_pValue); + break; + case SQL_REAL: + case SQL_DOUBLE: + bindData = std::make_unique<SimpleBindData<double>>(_pValue); + break; + case SQL_BINARY: + case SQL_VARBINARY: + bindData = std::make_unique<BinaryBindData>(_pValue); + break; + case SQL_LONGVARBINARY: + { + /* see https://msdn.microsoft.com/en-us/library/ms716238%28v=vs.85%29.aspx + * for an explanation of that apparently weird cast */ + pData = reinterpret_cast<void*>(static_cast<sal_uIntPtr>(columnIndex)); + sal_Int32 nLen + = static_cast<const css::uno::Sequence<sal_Int8>*>(_pValue)->getLength(); + *pLen = SQL_LEN_DATA_AT_EXEC(nLen); + } + break; + case SQL_LONGVARCHAR: + case SQL_WLONGVARCHAR: + { + /* see https://msdn.microsoft.com/en-us/library/ms716238%28v=vs.85%29.aspx + * for an explanation of that apparently weird cast */ + pData = reinterpret_cast<void*>(static_cast<sal_uIntPtr>(columnIndex)); + sal_Int32 nLen = static_cast<const OUString*>(_pValue)->getLength(); + *pLen = SQL_LEN_DATA_AT_EXEC(nLen); + } + break; + case SQL_DATE: + bindData = std::make_unique<SimpleBindData<DATE_STRUCT>>(_pValue); + break; + case SQL_TIME: + bindData = std::make_unique<SimpleBindData<TIME_STRUCT>>(_pValue); + break; + case SQL_TIMESTAMP: + bindData = std::make_unique<SimpleBindData<TIMESTAMP_STRUCT>>(_pValue); + break; + } + } + + if (bindData) + { + pData = bindData->data(); + *pLen = bindData->len(); + m_aBindVector.push_back(std::move(bindData)); + } + + SQLRETURN nRetcode + = functions().BindCol(m_aStatementHandle, columnIndex, fCType, pData, 0, pLen); + OTools::ThrowException(m_pStatement->getOwnConnection(), nRetcode, m_aStatementHandle, + SQL_HANDLE_STMT, **this); } void SAL_CALL OResultSet::updateNull( sal_Int32 columnIndex ) { - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - - m_aBindVector.push_back(allocBindColumn(DataType::CHAR,columnIndex)); - void* pData = reinterpret_cast<void*>(m_aBindVector.rbegin()->first); - OTools::bindValue(m_pStatement->getOwnConnection(),m_aStatementHandle,columnIndex,SQL_CHAR,0,nullptr,pData,&m_aLengthVector[columnIndex],**this,m_nTextEncoding,m_pStatement->getOwnConnection()->useOldDateFormat()); + updateValue(columnIndex, SQL_CHAR, nullptr); } @@ -1059,7 +1073,7 @@ void SAL_CALL OResultSet::updateInt( sal_Int32 columnIndex, sal_Int32 x ) void SAL_CALL OResultSet::updateLong( sal_Int32 /*columnIndex*/, sal_Int64 /*x*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRowUpdate::updateLong", *this ); + ::dbtools::throwFunctionNotSupportedSQLException( u"XRowUpdate::updateLong"_ustr, *this ); } void SAL_CALL OResultSet::updateFloat( sal_Int32 columnIndex, float x ) @@ -1135,8 +1149,8 @@ void SAL_CALL OResultSet::refreshRow( ) checkDisposed(OResultSet_BASE::rBHelper.bDisposed); - // SQLRETURN nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_REFRESH,SQL_LOCK_NO_CHANGE); - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0); + // SQLRETURN nRet = functions().SetPos(m_aStatementHandle,1,SQL_REFRESH,SQL_LOCK_NO_CHANGE); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0); OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); } @@ -1205,7 +1219,7 @@ sal_Bool SAL_CALL OResultSet::moveToBookmark( const Any& bookmark ) if ( SQL_INVALID_HANDLE != nReturn && SQL_ERROR != nReturn ) { - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,0); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,0); OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); TBookmarkPosMap::const_iterator aFind = m_aPosToBookmarks.find(aBookmark); if(aFind != m_aPosToBookmarks.end()) @@ -1229,7 +1243,7 @@ sal_Bool SAL_CALL OResultSet::moveRelativeToBookmark( const Any& bookmark, sal_ bookmark >>= aBookmark; setStmtOption<SQLLEN*, SQL_IS_POINTER>(SQL_ATTR_FETCH_BOOKMARK_PTR, reinterpret_cast<SQLLEN*>(aBookmark.getArray())); - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,rows); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,rows); OTools::ThrowException(m_pStatement->getOwnConnection(),m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this); return m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO; } @@ -1249,8 +1263,7 @@ sal_Bool SAL_CALL OResultSet::hasOrderedBookmarks( ) sal_Int32 SAL_CALL OResultSet::hashBookmark( const Any& /*bookmark*/ ) { - ::dbtools::throwFunctionNotSupportedSQLException( "XRowLocate::hashBookmark", *this ); - return 0; + ::dbtools::throwFunctionNotSupportedSQLException( u"XRowLocate::hashBookmark"_ustr, *this ); } // XDeleteRows @@ -1284,14 +1297,14 @@ template < typename T, SQLINTEGER BufferLength > T OResultSet::getStmtOption (SQ { T result (0); OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - N3SQLGetStmtAttr(m_aStatementHandle, fOption, &result, BufferLength, nullptr); + functions().GetStmtAttr(m_aStatementHandle, fOption, &result, BufferLength, nullptr); return result; } template < typename T, SQLINTEGER BufferLength > SQLRETURN OResultSet::setStmtOption (SQLINTEGER fOption, T value) const { OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); SQLPOINTER sv = reinterpret_cast<SQLPOINTER>(value); - return N3SQLSetStmtAttr(m_aStatementHandle, fOption, sv, BufferLength); + return functions().SetStmtAttr(m_aStatementHandle, fOption, sv, BufferLength); } sal_Int32 OResultSet::getResultSetConcurrency() const @@ -1334,10 +1347,19 @@ sal_Int32 OResultSet::getFetchSize() const OUString OResultSet::getCursorName() const { - SQLCHAR pName[258]; SQLSMALLINT nRealLen = 0; - N3SQLGetCursorName(m_aStatementHandle,pName,256,&nRealLen); - return OUString::createFromAscii(reinterpret_cast<char*>(pName)); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::GetCursorNameW)) + { + SQLWCHAR pName[258]{}; + functions().GetCursorNameW(m_aStatementHandle, pName, 256, &nRealLen); + return toUString(pName, nRealLen); + } + else + { + SQLCHAR pName[258]{}; + functions().GetCursorName(m_aStatementHandle, pName, 256, &nRealLen); + return toUString(pName); + } } bool OResultSet::isBookmarkable() const @@ -1378,15 +1400,9 @@ bool OResultSet::isBookmarkable() const return (m_nUseBookmarks != SQL_UB_OFF) && (nAttr & SQL_CA1_BOOKMARK) == SQL_CA1_BOOKMARK; } -void OResultSet::setFetchDirection(sal_Int32 _par0) +void OResultSet::setFetchDirection(sal_Int32 /*_par0*/) { - ::dbtools::throwFunctionNotSupportedSQLException( "setFetchDirection", *this ); - - OSL_ENSURE(_par0>0,"Illegal fetch direction!"); - if ( _par0 > 0 ) - { - setStmtOption<SQLULEN, SQL_IS_UINTEGER>(SQL_ATTR_CURSOR_TYPE, _par0); - } + ::dbtools::throwFunctionNotSupportedSQLException( u"setFetchDirection"_ustr, *this ); } void OResultSet::setFetchSize(sal_Int32 _par0) @@ -1394,7 +1410,7 @@ void OResultSet::setFetchSize(sal_Int32 _par0) OSL_ENSURE(_par0>0,"Illegal fetch size!"); if ( _par0 != 1 ) { - throw css::beans::PropertyVetoException("SDBC/ODBC layer not prepared for fetchSize > 1", *this); + throw css::beans::PropertyVetoException(u"SDBC/ODBC layer not prepared for fetchSize > 1"_ustr, *this); } setStmtOption<SQLULEN, SQL_IS_UINTEGER>(SQL_ATTR_ROW_ARRAY_SIZE, _par0); m_pRowStatusArray.reset( new SQLUSMALLINT[_par0] ); @@ -1403,28 +1419,47 @@ void OResultSet::setFetchSize(sal_Int32 _par0) IPropertyArrayHelper* OResultSet::createArrayHelper( ) const { - Sequence< Property > aProps(6); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), - PROPERTY_ID_ISBOOKMARKABLE, cppu::UnoType<bool>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), PropertyAttribute::READONLY); - - return new OPropertyArrayHelper(aProps); + return new OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), + PROPERTY_ID_ISBOOKMARKABLE, + cppu::UnoType<bool>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + PropertyAttribute::READONLY + } + } + }; } IPropertyArrayHelper & OResultSet::getInfoHelper() @@ -1667,7 +1702,7 @@ bool OResultSet::move(IResultSetHelper::Movement _eCursorPosition, sal_Int32 _nO TBookmarkPosMap::const_iterator aIter = std::find_if(m_aPosToBookmarks.begin(), m_aPosToBookmarks.end(), [&_nOffset](const TBookmarkPosMap::value_type& rEntry) { return rEntry.second == _nOffset; }); if (aIter != m_aPosToBookmarks.end()) - return moveToBookmark(makeAny(aIter->first)); + return moveToBookmark(Any(aIter->first)); SAL_WARN( "connectivity.odbc", "Bookmark not found!"); } return false; @@ -1681,9 +1716,9 @@ bool OResultSet::move(IResultSetHelper::Movement _eCursorPosition, sal_Int32 _nO // _eCursorPosition == IResultSetHelper::NEXT/PREVIOUS // when fetchSize > 1 if ( !m_bUseFetchScroll && _eCursorPosition == IResultSetHelper::NEXT ) - m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle); + m_nCurrentFetchState = functions().Fetch(m_aStatementHandle); else - m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,nFetchOrientation,_nOffset); + m_nCurrentFetchState = functions().FetchScroll(m_aStatementHandle,nFetchOrientation,_nOffset); SAL_INFO( "connectivity.odbc", @@ -1774,7 +1809,7 @@ void OResultSet::fillNeededData(SQLRETURN _nRet) return; void* pColumnIndex = nullptr; - nRet = N3SQLParamData(m_aStatementHandle,&pColumnIndex); + nRet = functions().ParamData(m_aStatementHandle,&pColumnIndex); do { @@ -1790,26 +1825,25 @@ void OResultSet::fillNeededData(SQLRETURN _nRet) case DataType::LONGVARBINARY: case DataType::BLOB: aSeq = m_aRow[nColumnIndex].getSequence(); - N3SQLPutData (m_aStatementHandle, aSeq.getArray(), aSeq.getLength()); + functions().PutData (m_aStatementHandle, aSeq.getArray(), aSeq.getLength()); break; case SQL_WLONGVARCHAR: { - OUString const & sRet = m_aRow[nColumnIndex].getString(); - N3SQLPutData (m_aStatementHandle, static_cast<SQLPOINTER>(const_cast<sal_Unicode *>(sRet.getStr())), sizeof(sal_Unicode)*sRet.getLength()); + SQLWChars data(m_aRow[nColumnIndex].getString()); + functions().PutData(m_aStatementHandle, data.get(), data.cb()); break; } case DataType::LONGVARCHAR: case DataType::CLOB: { - OUString sRet = m_aRow[nColumnIndex].getString(); - OString aString(OUStringToOString(sRet,m_nTextEncoding)); - N3SQLPutData (m_aStatementHandle, static_cast<SQLPOINTER>(const_cast<char *>(aString.getStr())), aString.getLength()); + SQLChars data(m_aRow[nColumnIndex].getString(), m_nTextEncoding); + functions().PutData(m_aStatementHandle, data.get(), data.cb()); break; } default: SAL_WARN( "connectivity.odbc", "Not supported at the moment!"); } - nRet = N3SQLParamData(m_aStatementHandle,&pColumnIndex); + nRet = functions().ParamData(m_aStatementHandle,&pColumnIndex); } while (nRet == SQL_NEED_DATA); } diff --git a/connectivity/source/drivers/odbc/OResultSetMetaData.cxx b/connectivity/source/drivers/odbc/OResultSetMetaData.cxx index 21b95c6a7b29..260c2111fbfc 100644 --- a/connectivity/source/drivers/odbc/OResultSetMetaData.cxx +++ b/connectivity/source/drivers/odbc/OResultSetMetaData.cxx @@ -22,7 +22,6 @@ using namespace connectivity::odbc; using namespace com::sun::star::uno; -using namespace com::sun::star::lang; using namespace com::sun::star::sdbc; @@ -36,40 +35,77 @@ OUString OResultSetMetaData::getCharColAttrib(sal_Int32 _column,sal_Int32 ident) if(_column <static_cast<sal_Int32>(m_vMapping.size())) // use mapping column = m_vMapping[_column]; - SQLSMALLINT BUFFER_LEN = 128; - std::unique_ptr<char[]> pName(new char[BUFFER_LEN+1]); - SQLSMALLINT nRealLen=0; - SQLRETURN nRet = N3SQLColAttribute(m_aStatementHandle, - static_cast<SQLUSMALLINT>(column), - static_cast<SQLUSMALLINT>(ident), - static_cast<SQLPOINTER>(pName.get()), - BUFFER_LEN, - &nRealLen, - nullptr - ); OUString sValue; - if ( nRet == SQL_SUCCESS ) + SQLSMALLINT cbRealLen = 0; + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ColAttributeW)) { - if ( nRealLen < 0 ) - nRealLen = BUFFER_LEN; - sValue = OUString(pName.get(),nRealLen,m_pConnection->getTextEncoding()); + // SQLColAttributeW gets/returns count of bytes, not characters + SQLSMALLINT cbBufferLen = 128 * sizeof(SQLWCHAR); + auto pName = std::make_unique<SQLWCHAR[]>(cbBufferLen / sizeof(SQLWCHAR) + 1); + SQLRETURN nRet = functions().ColAttributeW(m_aStatementHandle, + column, + ident, + pName.get(), + cbBufferLen, + &cbRealLen, + nullptr); + OTools::ThrowException(m_pConnection, nRet, m_aStatementHandle, SQL_HANDLE_STMT, *this); + if (nRet == SQL_SUCCESS) + { + if (cbRealLen < 0) + cbRealLen = cbBufferLen; + sValue = toUString(pName.get(), cbRealLen / sizeof(SQLWCHAR)); + } + if (cbRealLen > cbBufferLen) + { + cbBufferLen = (cbRealLen + 1) & ~1; // Make sure it's even + pName = std::make_unique<SQLWCHAR[]>(cbBufferLen / sizeof(SQLWCHAR) + 1); + nRet = functions().ColAttributeW(m_aStatementHandle, + column, + ident, + pName.get(), + cbBufferLen, + &cbRealLen, + nullptr); + OTools::ThrowException(m_pConnection, nRet, m_aStatementHandle, SQL_HANDLE_STMT, *this); + if (nRet == SQL_SUCCESS && cbRealLen > 0) + sValue = toUString(pName.get(), cbRealLen / sizeof(SQLWCHAR)); + } } - pName.reset(); - OTools::ThrowException(m_pConnection,nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); - if(nRealLen > BUFFER_LEN) + else { - pName.reset(new char[nRealLen+1]); - nRet = N3SQLColAttribute(m_aStatementHandle, - static_cast<SQLUSMALLINT>(column), - static_cast<SQLUSMALLINT>(ident), - static_cast<SQLPOINTER>(pName.get()), - nRealLen, - &nRealLen, - nullptr - ); - if ( nRet == SQL_SUCCESS && nRealLen > 0) - sValue = OUString(pName.get(),nRealLen,m_pConnection->getTextEncoding()); + SQLSMALLINT BUFFER_LEN = 128; + auto pName = std::make_unique<SQLCHAR[]>(BUFFER_LEN + 1); + SQLRETURN nRet = functions().ColAttribute(m_aStatementHandle, + static_cast<SQLUSMALLINT>(column), + static_cast<SQLUSMALLINT>(ident), + static_cast<SQLPOINTER>(pName.get()), + BUFFER_LEN, + &cbRealLen, + nullptr + ); + if ( nRet == SQL_SUCCESS ) + { + if ( cbRealLen < 0 ) + cbRealLen = BUFFER_LEN; + sValue = toUString(pName.get(), cbRealLen, m_pConnection->getTextEncoding()); + } OTools::ThrowException(m_pConnection,nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); + if(cbRealLen > BUFFER_LEN) + { + pName = std::make_unique<SQLCHAR[]>(cbRealLen + 1); + nRet = functions().ColAttribute(m_aStatementHandle, + static_cast<SQLUSMALLINT>(column), + static_cast<SQLUSMALLINT>(ident), + static_cast<SQLPOINTER>(pName.get()), + cbRealLen, + &cbRealLen, + nullptr + ); + if ( nRet == SQL_SUCCESS && cbRealLen > 0) + sValue = toUString(pName.get(), cbRealLen, m_pConnection->getTextEncoding()); + OTools::ThrowException(m_pConnection,nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); + } } return sValue; @@ -82,7 +118,7 @@ SQLLEN OResultSetMetaData::getNumColAttrib(OConnection const * _pConnection ,sal_Int32 _ident) { SQLLEN nValue=0; - OTools::ThrowException(_pConnection,(*reinterpret_cast<T3SQLColAttribute>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::ColAttribute)))(_aStatementHandle, + OTools::ThrowException(_pConnection,_pConnection->functions().ColAttribute(_aStatementHandle, static_cast<SQLUSMALLINT>(_column), static_cast<SQLUSMALLINT>(_ident), nullptr, @@ -144,11 +180,10 @@ sal_Int32 SAL_CALL OResultSetMetaData::getColumnType( sal_Int32 column ) catch(SQLException& ) // in this case we have an odbc 2.0 driver { m_bUseODBC2Types = true; - nType = OTools::MapOdbcType2Jdbc(getNumColAttrib(column,SQL_DESC_CONCISE_TYPE )); } } - else - nType = OTools::MapOdbcType2Jdbc(getNumColAttrib(column,SQL_DESC_CONCISE_TYPE )); + if (m_bUseODBC2Types) + nType = OTools::MapOdbcType2Jdbc(getNumColAttrib(column, SQL_DESC_CONCISE_TYPE)); aFind = m_aColumnTypes.emplace(column,nType).first; } @@ -162,7 +197,7 @@ sal_Int32 SAL_CALL OResultSetMetaData::getColumnCount( ) if(m_nColCount != -1) return m_nColCount; sal_Int16 nNumResultCols=0; - OTools::ThrowException(m_pConnection,N3SQLNumResultCols(m_aStatementHandle,&nNumResultCols),m_aStatementHandle,SQL_HANDLE_STMT,*this); + OTools::ThrowException(m_pConnection,functions().NumResultCols(m_aStatementHandle,&nNumResultCols),m_aStatementHandle,SQL_HANDLE_STMT,*this); m_nColCount = nNumResultCols; return m_nColCount; } @@ -231,30 +266,38 @@ sal_Bool SAL_CALL OResultSetMetaData::isSigned( sal_Int32 column ) sal_Int32 SAL_CALL OResultSetMetaData::getPrecision( sal_Int32 column ) { sal_Int32 nType = 0; - try - { - nType = getNumColAttrib(column,SQL_DESC_PRECISION); - } - catch(const SQLException& ) // in this case we have an odbc 2.0 driver + if (!m_bUseODBC2Types) { - m_bUseODBC2Types = true; - nType = getNumColAttrib(column,SQL_COLUMN_PRECISION ); + try + { + nType = getNumColAttrib(column, SQL_DESC_PRECISION); + } + catch (const SQLException&) // in this case we have an odbc 2.0 driver + { + m_bUseODBC2Types = true; + } } + if (m_bUseODBC2Types) + nType = getNumColAttrib(column, SQL_COLUMN_PRECISION); return nType; } sal_Int32 SAL_CALL OResultSetMetaData::getScale( sal_Int32 column ) { sal_Int32 nType = 0; - try + if (!m_bUseODBC2Types) { - nType = getNumColAttrib(column,SQL_DESC_SCALE); - } - catch(const SQLException& ) // in this case we have an odbc 2.0 driver - { - m_bUseODBC2Types = true; - nType = getNumColAttrib(column,SQL_COLUMN_SCALE ); + try + { + nType = getNumColAttrib(column, SQL_DESC_SCALE); + } + catch (const SQLException&) // in this case we have an odbc 2.0 driver + { + m_bUseODBC2Types = true; + } } + if (m_bUseODBC2Types) + nType = getNumColAttrib(column, SQL_COLUMN_SCALE); return nType; } diff --git a/connectivity/source/drivers/odbc/OStatement.cxx b/connectivity/source/drivers/odbc/OStatement.cxx index d44f86e58469..989db77ce462 100644 --- a/connectivity/source/drivers/odbc/OStatement.cxx +++ b/connectivity/source/drivers/odbc/OStatement.cxx @@ -49,9 +49,7 @@ using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; using namespace com::sun::star::container; -using namespace com::sun::star::io; using namespace com::sun::star::util; OStatement_Base::OStatement_Base(OConnection* _pConnection ) @@ -79,16 +77,18 @@ OStatement_Base::OStatement_Base(OConnection* _pConnection ) OStatement_Base::~OStatement_Base() { - OSL_ENSURE(!m_aStatementHandle,"Sohould ne null here!"); + OSL_ENSURE(!m_aStatementHandle,"Should be null here!"); } void OStatement_Base::disposeResultSet() { // free the cursor if alive - Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OResultSet > xComp(m_xResultSet.get()); if (xComp.is()) + { xComp->dispose(); - m_xResultSet.clear(); + m_xResultSet.clear(); + } } void SAL_CALL OStatement_Base::disposing() @@ -104,7 +104,7 @@ void SAL_CALL OStatement_Base::disposing() m_pConnection->freeStatementHandle(m_aStatementHandle); m_pConnection.clear(); } - OSL_ENSURE(!m_aStatementHandle,"Sohould ne null here!"); + OSL_ENSURE(!m_aStatementHandle,"Should be null here!"); OStatement_BASE::disposing(); } @@ -163,7 +163,7 @@ void SAL_CALL OStatement_Base::cancel( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - N3SQLCancel(m_aStatementHandle); + functions().Cancel(m_aStatementHandle); } @@ -197,7 +197,7 @@ void OStatement_Base::reset() } if(m_aStatementHandle) { - THROW_SQL(N3SQLFreeStmt(m_aStatementHandle, SQL_CLOSE)); + THROW_SQL(functions().FreeStmt(m_aStatementHandle, SQL_CLOSE)); } } @@ -210,8 +210,7 @@ void OStatement_Base::clearMyResultSet() try { - Reference<XCloseable> xCloseable( - m_xResultSet.get(), css::uno::UNO_QUERY); + rtl::Reference<OResultSet> xCloseable(m_xResultSet.get()); if ( xCloseable.is() ) xCloseable->close(); } @@ -229,7 +228,7 @@ SQLLEN OStatement_Base::getRowCount() SQLLEN numRows = 0; try { - THROW_SQL(N3SQLRowCount(m_aStatementHandle,&numRows)); + THROW_SQL(functions().RowCount(m_aStatementHandle,&numRows)); } catch (const SQLException&) { @@ -301,7 +300,7 @@ sal_Int32 OStatement_Base::getColumnCount() OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); try { - THROW_SQL(N3SQLNumResultCols(m_aStatementHandle,&numCols)); + THROW_SQL(functions().NumResultCols(m_aStatementHandle,&numCols)); } catch (const SQLException&) { @@ -316,9 +315,6 @@ sal_Bool SAL_CALL OStatement_Base::execute( const OUString& sql ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); m_sSqlStatement = sql; - - OString aSql(OUStringToOString(sql,getOwnConnection()->getTextEncoding())); - bool hasResultSet = false; // Reset the statement handle and warning @@ -334,15 +330,24 @@ sal_Bool SAL_CALL OStatement_Base::execute( const OUString& sql ) OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); try { - THROW_SQL(N3SQLExecDirect(m_aStatementHandle, reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(aSql.getStr())), aSql.getLength())); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ExecDirectW)) + { + SQLWChars directSQL(sql); + THROW_SQL(functions().ExecDirectW(m_aStatementHandle, directSQL.get(), directSQL.cch())); + } + else + { + SQLChars directSQL(sql, getOwnConnection()->getTextEncoding()); + THROW_SQL(functions().ExecDirect(m_aStatementHandle, directSQL.get(), directSQL.cch())); + } } - catch (const SQLWarning&) { - + catch (const SQLWarning&) + { //TODO: Save pointer to warning and save with ResultSet // object once it is created. } - // Now determine if there is a result set associated with + // Now determine if there is a result set associated with // the SQL statement that was executed. Get the column // count, and if it is not zero, there is a result set. @@ -358,7 +363,7 @@ sal_Bool SAL_CALL OStatement_Base::execute( const OUString& sql ) // getResultSet returns the current result as a ResultSet. It // returns NULL if the current result is not a ResultSet. -Reference< XResultSet > OStatement_Base::getResultSet(bool checkCount) +rtl::Reference< OResultSet > OStatement_Base::getResultSet(bool checkCount) { ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); @@ -406,14 +411,14 @@ template < typename T, SQLINTEGER BufferLength > T OStatement_Base::getStmtOptio { T result (0); OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - N3SQLGetStmtAttr(m_aStatementHandle, fOption, &result, BufferLength, nullptr); + functions().GetStmtAttr(m_aStatementHandle, fOption, &result, BufferLength, nullptr); return result; } template < typename T, SQLINTEGER BufferLength > SQLRETURN OStatement_Base::setStmtOption (SQLINTEGER fOption, T value) const { OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); SQLPOINTER sv = reinterpret_cast<SQLPOINTER>(value); - return N3SQLSetStmtAttr(m_aStatementHandle, fOption, sv, BufferLength); + return functions().SetStmtAttr(m_aStatementHandle, fOption, sv, BufferLength); } @@ -423,15 +428,15 @@ Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery( const OUString& checkDisposed(OStatement_BASE::rBHelper.bDisposed); - Reference< XResultSet > xRS; + rtl::Reference< OResultSet > xRS; // Execute the statement. If execute returns true, a result // set exists. if (execute (sql)) { - xRS = getResultSet (false); - m_xResultSet = xRS; + xRS = getResultSet(false); + m_xResultSet = xRS.get(); } else { @@ -472,28 +477,31 @@ Sequence< sal_Int32 > SAL_CALL OStatement::executeBatch( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - OStringBuffer aBatchSql; sal_Int32 nLen = m_aBatchVector.size(); - for (auto const& elem : m_aBatchVector) - { - aBatchSql.append(OUStringToOString(elem,getOwnConnection()->getTextEncoding())); - aBatchSql.append(";"); - } - OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - auto s = aBatchSql.makeStringAndClear(); - THROW_SQL(N3SQLExecDirect(m_aStatementHandle, reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(s.getStr())), s.getLength())); + OUStringBuffer uSql; + comphelper::intersperse(m_aBatchVector.begin(), m_aBatchVector.end(), comphelper::OUStringBufferAppender(uSql), u";"); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::ExecDirectW)) + { + SQLWChars statement(uSql.makeStringAndClear()); + THROW_SQL(functions().ExecDirectW(m_aStatementHandle, statement.get(), statement.cch())); + } + else + { + SQLChars statement(uSql, getOwnConnection()->getTextEncoding()); + THROW_SQL(functions().ExecDirect(m_aStatementHandle, statement.get(), statement.cch())); + } Sequence< sal_Int32 > aRet(nLen); sal_Int32* pArray = aRet.getArray(); for(sal_Int32 j=0;j<nLen;++j) { - SQLRETURN nError = N3SQLMoreResults(m_aStatementHandle); + SQLRETURN nError = functions().MoreResults(m_aStatementHandle); if(nError == SQL_SUCCESS) { SQLLEN nRowCount=0; - N3SQLRowCount(m_aStatementHandle,&nRowCount); + functions().RowCount(m_aStatementHandle,&nRowCount); pArray[j] = nRowCount; } } @@ -535,8 +543,9 @@ Reference< XResultSet > SAL_CALL OStatement_Base::getResultSet( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); - m_xResultSet = getResultSet(true); - return m_xResultSet; + rtl::Reference<OResultSet> xRS = getResultSet(true); + m_xResultSet = xRS.get(); + return xRS; } @@ -575,7 +584,7 @@ sal_Bool SAL_CALL OStatement_Base::getMoreResults( ) OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); try { - hasResultSet = N3SQLMoreResults(m_aStatementHandle) == SQL_SUCCESS; + hasResultSet = functions().MoreResults(m_aStatementHandle) == SQL_SUCCESS; } catch (const SQLWarning &ex) { @@ -615,7 +624,7 @@ Any SAL_CALL OStatement_Base::getWarnings( ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); - return makeAny(m_aLastWarning); + return Any(m_aLastWarning); } @@ -704,10 +713,19 @@ sal_Int64 OStatement_Base::getMaxFieldSize() const OUString OStatement_Base::getCursorName() const { OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - SQLCHAR pName[258]; SQLSMALLINT nRealLen = 0; - N3SQLGetCursorName(m_aStatementHandle,pName,256,&nRealLen); - return OUString::createFromAscii(reinterpret_cast<char*>(pName)); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::GetCursorNameW)) + { + SQLWCHAR pName[258]{}; + functions().GetCursorNameW(m_aStatementHandle, pName, 256, &nRealLen); + return toUString(pName, nRealLen); + } + else + { + SQLCHAR pName[258]{}; + functions().GetCursorName(m_aStatementHandle, pName, 256, &nRealLen); + return toUString(pName); + } } void OStatement_Base::setQueryTimeOut(sal_Int64 seconds) @@ -831,11 +849,19 @@ void OStatement_Base::setMaxFieldSize(sal_Int64 _par0) setStmtOption<SQLULEN, SQL_IS_UINTEGER>(SQL_ATTR_MAX_LENGTH, _par0); } -void OStatement_Base::setCursorName(std::u16string_view _par0) +void OStatement_Base::setCursorName(const OUString& _par0) { OSL_ENSURE(m_aStatementHandle,"StatementHandle is null!"); - OString aName(OUStringToOString(_par0,getOwnConnection()->getTextEncoding())); - N3SQLSetCursorName(m_aStatementHandle, reinterpret_cast<SDB_ODBC_CHAR *>(const_cast<char *>(aName.getStr())), static_cast<SQLSMALLINT>(aName.getLength())); + if (bUseWChar && functions().has(ODBC3SQLFunctionId::SetCursorNameW)) + { + SQLWChars name(_par0); + functions().SetCursorNameW(m_aStatementHandle, name.get(), name.cch()); + } + else + { + SQLChars name(_par0, getOwnConnection()->getTextEncoding()); + functions().SetCursorName(m_aStatementHandle, name.get(), name.cch()); + } } bool OStatement_Base::isUsingBookmarks() const @@ -859,31 +885,71 @@ void OStatement_Base::setUsingBookmarks(bool _bUseBookmark) ::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const { - Sequence< Property > aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), - PROPERTY_ID_CURSORNAME, cppu::UnoType<OUString>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), - PROPERTY_ID_ESCAPEPROCESSING, cppu::UnoType<bool>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), - PROPERTY_ID_FETCHDIRECTION, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), - PROPERTY_ID_FETCHSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), - PROPERTY_ID_MAXFIELDSIZE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), - PROPERTY_ID_MAXROWS, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), - PROPERTY_ID_QUERYTIMEOUT, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), - PROPERTY_ID_RESULTSETCONCURRENCY, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), - PROPERTY_ID_RESULTSETTYPE, cppu::UnoType<sal_Int32>::get(), 0); - pProperties[nPos++] = css::beans::Property(::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), - PROPERTY_ID_USEBOOKMARKS, cppu::UnoType<bool>::get(), 0); - - return new ::cppu::OPropertyArrayHelper(aProps); + return new ::cppu::OPropertyArrayHelper + { + { + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME), + PROPERTY_ID_CURSORNAME, + cppu::UnoType<OUString>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING), + PROPERTY_ID_ESCAPEPROCESSING, + cppu::UnoType<bool>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION), + PROPERTY_ID_FETCHDIRECTION, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE), + PROPERTY_ID_FETCHSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE), + PROPERTY_ID_MAXFIELDSIZE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS), + PROPERTY_ID_MAXROWS, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT), + PROPERTY_ID_QUERYTIMEOUT, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY), + PROPERTY_ID_RESULTSETCONCURRENCY, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE), + PROPERTY_ID_RESULTSETTYPE, + cppu::UnoType<sal_Int32>::get(), + 0 + }, + { + ::connectivity::OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_USEBOOKMARKS), + PROPERTY_ID_USEBOOKMARKS, + cppu::UnoType<bool>::get(), + 0 + } + } + }; } @@ -1039,7 +1105,7 @@ void OStatement_Base::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const } } -IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbcx.OStatement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(OStatement,u"com.sun.star.sdbcx.OStatement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); void SAL_CALL OStatement_Base::acquire() noexcept { diff --git a/connectivity/source/drivers/odbc/OTools.cxx b/connectivity/source/drivers/odbc/OTools.cxx index 4781415de474..0909b03f14b2 100644 --- a/connectivity/source/drivers/odbc/OTools.cxx +++ b/connectivity/source/drivers/odbc/OTools.cxx @@ -115,7 +115,7 @@ void appendSQLWCHARs(OUStringBuffer & s, SQLWCHAR const * d, sal_Int32 n) if (sizeof (SQLWCHAR) == sizeof (sal_Unicode)) { s.append(reinterpret_cast<sal_Unicode const *>(d), n); } else { - for (sal_Int32 i = 0; i != n; ++i) { + for (sal_Int32 i = 0; i < n; ++i) { s.appendUtf32(d[i]); } } @@ -151,7 +151,7 @@ void OTools::getValue( OConnection const * _pConnection, OSL_ENSURE(o3tl::make_unsigned(_nSize) >= properSize, "memory region is too small"); SQLLEN pcbValue = SQL_NULL_DATA; OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetData>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetData)))(_aStatementHandle, + _pConnection->functions().GetData(_aStatementHandle, static_cast<SQLUSMALLINT>(columnIndex), _nType, _pValue, @@ -161,144 +161,6 @@ void OTools::getValue( OConnection const * _pConnection, _bWasNull = pcbValue == SQL_NULL_DATA; } -void OTools::bindValue( OConnection const * _pConnection, - SQLHANDLE _aStatementHandle, - sal_Int32 columnIndex, - SQLSMALLINT _nType, - SQLSMALLINT _nMaxLen, - const void* _pValue, - void* _pData, - SQLLEN * const pLen, - const css::uno::Reference< css::uno::XInterface >& _xInterface, - rtl_TextEncoding _nTextEncoding, - bool _bUseOldTimeDate) -{ - SQLRETURN nRetcode; - SQLSMALLINT fSqlType; - SQLSMALLINT fCType; - - OTools::getBindTypes( false, - _bUseOldTimeDate, - _nType, - fCType, - fSqlType); - - if (columnIndex != 0 && !_pValue) - { - *pLen = SQL_NULL_DATA; - nRetcode = (*reinterpret_cast<T3SQLBindCol>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::BindCol)))(_aStatementHandle, - static_cast<SQLUSMALLINT>(columnIndex), - fCType, - _pData, - _nMaxLen, - pLen - ); - } - else - { - try - { - switch (_nType) - { - case SQL_CHAR: - case SQL_VARCHAR: - { - OString aString(OUStringToOString(*static_cast<OUString const *>(_pValue),_nTextEncoding)); - *pLen = SQL_NTS; - *static_cast<OString*>(_pData) = aString; - - // Pointer on Char* - _pData = const_cast<char *>(aString.getStr()); - } break; - case SQL_BIGINT: - *static_cast<sal_Int64*>(_pData) = *static_cast<sal_Int64 const *>(_pValue); - *pLen = sizeof(sal_Int64); - break; - case SQL_DECIMAL: - case SQL_NUMERIC: - { - OString aString = OString::number(*static_cast<double const *>(_pValue)); - *pLen = static_cast<SQLSMALLINT>(aString.getLength()); - *static_cast<OString*>(_pData) = aString; - // Pointer on Char* - _pData = const_cast<char *>(static_cast<OString*>(_pData)->getStr()); - } break; - case SQL_BIT: - case SQL_TINYINT: - *static_cast<sal_Int8*>(_pData) = *static_cast<sal_Int8 const *>(_pValue); - *pLen = sizeof(sal_Int8); - break; - - case SQL_SMALLINT: - *static_cast<sal_Int16*>(_pData) = *static_cast<sal_Int16 const *>(_pValue); - *pLen = sizeof(sal_Int16); - break; - case SQL_INTEGER: - *static_cast<sal_Int32*>(_pData) = *static_cast<sal_Int32 const *>(_pValue); - *pLen = sizeof(sal_Int32); - break; - case SQL_FLOAT: - *static_cast<float*>(_pData) = *static_cast<float const *>(_pValue); - *pLen = sizeof(float); - break; - case SQL_REAL: - case SQL_DOUBLE: - *static_cast<double*>(_pData) = *static_cast<double const *>(_pValue); - *pLen = sizeof(double); - break; - case SQL_BINARY: - case SQL_VARBINARY: - { - _pData = const_cast<sal_Int8 *>(static_cast<const css::uno::Sequence< sal_Int8 > *>(_pValue)->getConstArray()); - *pLen = static_cast<const css::uno::Sequence< sal_Int8 > *>(_pValue)->getLength(); - } break; - case SQL_LONGVARBINARY: - { - /* see https://msdn.microsoft.com/en-us/library/ms716238%28v=vs.85%29.aspx - * for an explanation of that apparently weird cast */ - _pData = reinterpret_cast<void*>(static_cast<uintptr_t>(columnIndex)); - sal_Int32 nLen = static_cast<const css::uno::Sequence< sal_Int8 > *>(_pValue)->getLength(); - *pLen = static_cast<SQLLEN>(SQL_LEN_DATA_AT_EXEC(nLen)); - } - break; - case SQL_LONGVARCHAR: - { - /* see https://msdn.microsoft.com/en-us/library/ms716238%28v=vs.85%29.aspx - * for an explanation of that apparently weird cast */ - _pData = reinterpret_cast<void*>(static_cast<uintptr_t>(columnIndex)); - sal_Int32 nLen = static_cast<OUString const *>(_pValue)->getLength(); - *pLen = static_cast<SQLLEN>(SQL_LEN_DATA_AT_EXEC(nLen)); - } break; - case SQL_DATE: - *pLen = sizeof(DATE_STRUCT); - *static_cast<DATE_STRUCT*>(_pData) = *static_cast<DATE_STRUCT const *>(_pValue); - break; - case SQL_TIME: - *pLen = sizeof(TIME_STRUCT); - *static_cast<TIME_STRUCT*>(_pData) = *static_cast<TIME_STRUCT const *>(_pValue); - break; - case SQL_TIMESTAMP: - *pLen = sizeof(TIMESTAMP_STRUCT); - *static_cast<TIMESTAMP_STRUCT*>(_pData) = *static_cast<TIMESTAMP_STRUCT const *>(_pValue); - break; - } - } - catch ( ... ) - { - } - - nRetcode = (*reinterpret_cast<T3SQLBindCol>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::BindCol)))(_aStatementHandle, - static_cast<SQLUSMALLINT>(columnIndex), - fCType, - _pData, - _nMaxLen, - pLen - ); - } - - OTools::ThrowException(_pConnection,nRetcode,_aStatementHandle,SQL_HANDLE_STMT,_xInterface); -} - void OTools::ThrowException(const OConnection* _pConnection, const SQLRETURN _rRetCode, const SQLHANDLE _pContext, @@ -328,11 +190,10 @@ void OTools::ThrowException(const OConnection* _pConnection, // Additional Information on the latest ODBC-functioncall available // SQLError provides this Information. - SDB_ODBC_CHAR szSqlState[5]; + OUString errorMessage; + OUString sqlState; SQLINTEGER pfNativeError; - SDB_ODBC_CHAR szErrorMessage[SQL_MAX_MESSAGE_LENGTH]; - szErrorMessage[0] = '\0'; - SQLSMALLINT pcbErrorMsg = 0; + SQLRETURN n; // Information for latest operation: // when hstmt != SQL_NULL_HSTMT is (Used from SetStatus in SdbCursor, SdbTable, ...), @@ -340,22 +201,46 @@ void OTools::ThrowException(const OConnection* _pConnection, // statements of this connection [what in this case will probably be the same, but the Reference // Manual isn't totally clear in this...]. // corresponding for hdbc. - SQLRETURN n = (*reinterpret_cast<T3SQLGetDiagRec>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetDiagRec)))(_nHandleType,_pContext,1, + if (bUseWChar && _pConnection->functions().has(ODBC3SQLFunctionId::GetDiagRecW)) + { + SQLWCHAR szSqlState[6]; + SQLWCHAR szErrorMessage[SQL_MAX_MESSAGE_LENGTH]; + szErrorMessage[0] = '\0'; + SQLSMALLINT cchErrorMsg = 0; + + n = _pConnection->functions().GetDiagRecW(_nHandleType,_pContext,1, + szSqlState, + &pfNativeError, + szErrorMessage, std::size(szErrorMessage) - 1, &cchErrorMsg); + if (SQL_SUCCEEDED(n)) + { + errorMessage = toUString(szErrorMessage, cchErrorMsg); + sqlState = toUString(szSqlState, 5); + } + } + else + { + SQLCHAR szSqlState[6]; + SQLCHAR szErrorMessage[SQL_MAX_MESSAGE_LENGTH]; + szErrorMessage[0] = '\0'; + SQLSMALLINT pcbErrorMsg = 0; + + n = _pConnection->functions().GetDiagRec(_nHandleType,_pContext,1, szSqlState, &pfNativeError, szErrorMessage,sizeof szErrorMessage - 1,&pcbErrorMsg); + if (SQL_SUCCEEDED(n)) + { + rtl_TextEncoding _nTextEncoding = osl_getThreadTextEncoding(); + errorMessage = toUString(szErrorMessage, pcbErrorMsg, _nTextEncoding); + sqlState = toUString(szSqlState, 5, _nTextEncoding); + } + } OSL_ENSURE(n != SQL_INVALID_HANDLE,"SdbODBC3_SetStatus: SQLError returned SQL_INVALID_HANDLE"); OSL_ENSURE(n == SQL_SUCCESS || n == SQL_SUCCESS_WITH_INFO || n == SQL_NO_DATA_FOUND || n == SQL_ERROR,"SdbODBC3_SetStatus: SQLError failed"); - rtl_TextEncoding _nTextEncoding = osl_getThreadTextEncoding(); // For the Return Code of SQLError see ODBC 2.0 Programmer's Reference Page 287ff - throw SQLException( OUString(reinterpret_cast<char *>(szErrorMessage), pcbErrorMsg, _nTextEncoding), - _xInterface, - OUString(reinterpret_cast<char *>(szSqlState), 5, _nTextEncoding), - pfNativeError, - Any() - ); - + throw SQLException(errorMessage, _xInterface, sqlState, pfNativeError, Any()); } Sequence<sal_Int8> OTools::getBytesValue(const OConnection* _pConnection, @@ -378,7 +263,7 @@ Sequence<sal_Int8> OTools::getBytesValue(const OConnection* _pConnection, while (pcbValue == SQL_NO_TOTAL || pcbValue > nMaxLen) { OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetData>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetData)))( + _pConnection->functions().GetData( _aStatementHandle, static_cast<SQLUSMALLINT>(columnIndex), _fSqlType, @@ -438,7 +323,7 @@ OUString OTools::getStringValue(OConnection const * _pConnection, while ((pcbValue == SQL_NO_TOTAL ) || (pcbValue >= nMaxSize) ) { OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetData>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetData)))( + _pConnection->functions().GetData( _aStatementHandle, static_cast<SQLUSMALLINT>(columnIndex), SQL_C_WCHAR, @@ -482,7 +367,7 @@ OUString OTools::getStringValue(OConnection const * _pConnection, while ((pcbValue == SQL_NO_TOTAL ) || (pcbValue >= nMaxLen) ) { OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetData>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetData)))( + _pConnection->functions().GetData( _aStatementHandle, static_cast<SQLUSMALLINT>(columnIndex), SQL_C_CHAR, @@ -527,13 +412,27 @@ void OTools::GetInfo(OConnection const * _pConnection, const Reference< XInterface >& _xInterface, rtl_TextEncoding _nTextEncoding) { - char aValue[512]; - SQLSMALLINT nValueLen=0; - OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetInfo>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetInfo)))(_aConnectionHandle,_nInfo,aValue,(sizeof aValue)-1,&nValueLen), - _aConnectionHandle,SQL_HANDLE_DBC,_xInterface); + if (bUseWChar && _pConnection->functions().has(ODBC3SQLFunctionId::GetInfoW)) + { + SQLWCHAR aValue[512]; + SQLSMALLINT nValueLen=0; + // SQLGetInfoW takes / outputs count of bytes, not characters + OTools::ThrowException(_pConnection, + _pConnection->functions().GetInfoW(_aConnectionHandle,_nInfo,aValue,sizeof(aValue)-sizeof(SQLWCHAR),&nValueLen), + _aConnectionHandle,SQL_HANDLE_DBC,_xInterface); - _rValue = OUString(aValue,nValueLen,_nTextEncoding); + _rValue = toUString(aValue, nValueLen / sizeof(SQLWCHAR)); + } + else + { + SQLCHAR aValue[512]; + SQLSMALLINT nValueLen=0; + OTools::ThrowException(_pConnection, + _pConnection->functions().GetInfo(_aConnectionHandle,_nInfo,aValue,sizeof(aValue)-1,&nValueLen), + _aConnectionHandle,SQL_HANDLE_DBC,_xInterface); + + _rValue = toUString(aValue, nValueLen, _nTextEncoding); + } } void OTools::GetInfo(OConnection const * _pConnection, @@ -545,7 +444,7 @@ void OTools::GetInfo(OConnection const * _pConnection, SQLSMALLINT nValueLen; _rValue = 0; // in case the driver uses only 16 of the 32 bits (as it does, for example, for SQL_CATALOG_LOCATION) OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetInfo>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetInfo)))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen), + _pConnection->functions().GetInfo(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen), _aConnectionHandle,SQL_HANDLE_DBC,_xInterface); } @@ -558,7 +457,7 @@ void OTools::GetInfo(OConnection const * _pConnection, SQLSMALLINT nValueLen; _rValue = 0; // in case the driver uses only 16 of the 32 bits (as it does, for example, for SQL_CATALOG_LOCATION) OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetInfo>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetInfo)))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen), + _pConnection->functions().GetInfo(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen), _aConnectionHandle,SQL_HANDLE_DBC,_xInterface); } @@ -571,7 +470,7 @@ void OTools::GetInfo(OConnection const * _pConnection, SQLSMALLINT nValueLen; _rValue = 0; // in case the driver uses only 16 of the 32 bits (as it does, for example, for SQL_CATALOG_LOCATION) OTools::ThrowException(_pConnection, - (*reinterpret_cast<T3SQLGetInfo>(_pConnection->getOdbcFunction(ODBC3SQLFunctionId::GetInfo)))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen), + _pConnection->functions().GetInfo(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen), _aConnectionHandle,SQL_HANDLE_DBC,_xInterface); } @@ -683,8 +582,7 @@ SQLSMALLINT OTools::jdbcTypeToOdbc(sal_Int32 jdbcType) return odbcType; } -void OTools::getBindTypes(bool _bUseWChar, - bool _bUseOldTimeDate, +void OTools::getBindTypes(bool _bUseOldTimeDate, SQLSMALLINT _nOdbcType, SQLSMALLINT& fCType, SQLSMALLINT& fSqlType @@ -692,42 +590,36 @@ void OTools::getBindTypes(bool _bUseWChar, { switch(_nOdbcType) { - case SQL_CHAR: if(_bUseWChar) - { - fCType = SQL_C_WCHAR; - fSqlType = SQL_WCHAR; - } - else + case SQL_CHAR: if (!bUseWChar) { fCType = SQL_C_CHAR; fSqlType = SQL_CHAR; + break; } - break; - case SQL_VARCHAR: if(_bUseWChar) - { - fCType = SQL_C_WCHAR; - fSqlType = SQL_WVARCHAR; - } - else + [[fallthrough]]; + case SQL_WCHAR: fCType = SQL_C_WCHAR; + fSqlType = SQL_WCHAR; break; + case SQL_VARCHAR: if (!bUseWChar) { fCType = SQL_C_CHAR; fSqlType = SQL_VARCHAR; + break; } - break; - case SQL_LONGVARCHAR: if(_bUseWChar) - { - fCType = SQL_C_WCHAR; - fSqlType = SQL_WLONGVARCHAR; - } - else + [[fallthrough]]; + case SQL_WVARCHAR: fCType = SQL_C_WCHAR; + fSqlType = SQL_WVARCHAR; break; + case SQL_LONGVARCHAR: if (!bUseWChar) { fCType = SQL_C_CHAR; fSqlType = SQL_LONGVARCHAR; + break; } - break; - case SQL_DECIMAL: fCType = _bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR; + [[fallthrough]]; + case SQL_WLONGVARCHAR: fCType = SQL_C_WCHAR; + fSqlType = SQL_WLONGVARCHAR; break; + case SQL_DECIMAL: fCType = bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR; fSqlType = SQL_DECIMAL; break; - case SQL_NUMERIC: fCType = _bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR; + case SQL_NUMERIC: fCType = bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR; fSqlType = SQL_NUMERIC; break; case SQL_BIT: fCType = SQL_C_TINYINT; fSqlType = SQL_INTEGER; break; diff --git a/connectivity/source/drivers/postgresql/pq_array.cxx b/connectivity/source/drivers/postgresql/pq_array.cxx index 841ed70c6cb2..2b7ab3c9491f 100644 --- a/connectivity/source/drivers/postgresql/pq_array.cxx +++ b/connectivity/source/drivers/postgresql/pq_array.cxx @@ -54,7 +54,7 @@ namespace pq_sdbc_driver OUString Array::getBaseTypeName( ) { - return "varchar"; + return u"varchar"_ustr; } sal_Int32 Array::getBaseType( ) @@ -96,7 +96,7 @@ css::uno::Reference< css::sdbc::XResultSet > Array::getResultSetAtIndex( std::vector< Any > row( 2 ); row[0] <<= static_cast<sal_Int32>( i + index ); row[1] = m_data[i+index-1]; - ret[i] = row; + ret[i] = std::move(row); } return new SequenceResultSet( diff --git a/connectivity/source/drivers/postgresql/pq_array.hxx b/connectivity/source/drivers/postgresql/pq_array.hxx index b847d646a913..589fe063d234 100644 --- a/connectivity/source/drivers/postgresql/pq_array.hxx +++ b/connectivity/source/drivers/postgresql/pq_array.hxx @@ -39,6 +39,7 @@ #include <com/sun/star/sdbc/XArray.hpp> #include "pq_connection.hxx" +#include <utility> #include <vector> namespace pq_sdbc_driver @@ -53,14 +54,14 @@ class Array : public cppu::WeakImplHelper< css::sdbc::XArray > public: Array( - const rtl::Reference< comphelper::RefCountedMutex > & mutex, + rtl::Reference< comphelper::RefCountedMutex > mutex, std::vector< css::uno::Any > && data, - const css::uno::Reference< css::uno::XInterface > & owner, - const css::uno::Reference< css::script::XTypeConverter > &tc) : + css::uno::Reference< css::uno::XInterface > owner, + css::uno::Reference< css::script::XTypeConverter > tc) : m_data( std::move(data) ), - m_owner( owner ), - m_tc( tc ), - m_xMutex( mutex ) + m_owner(std::move( owner )), + m_tc(std::move( tc )), + m_xMutex(std::move( mutex )) {} public: // XArray diff --git a/connectivity/source/drivers/postgresql/pq_baseresultset.cxx b/connectivity/source/drivers/postgresql/pq_baseresultset.cxx index 9ff5e01e098a..274a0a209a17 100644 --- a/connectivity/source/drivers/postgresql/pq_baseresultset.cxx +++ b/connectivity/source/drivers/postgresql/pq_baseresultset.cxx @@ -74,25 +74,25 @@ static ::cppu::IPropertyArrayHelper & getResultSetPropertyArrayHelper() static ::cppu::OPropertyArrayHelper arrayHelper( Sequence<Property>{ Property( - "CursorName", 0, + u"CursorName"_ustr, 0, ::cppu::UnoType<OUString>::get() , 0 ), Property( - "EscapeProcessing", 1, + u"EscapeProcessing"_ustr, 1, cppu::UnoType<bool>::get() , 0 ), Property( - "FetchDirection", 2, + u"FetchDirection"_ustr, 2, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "FetchSize", 3, + u"FetchSize"_ustr, 3, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "IsBookmarkable", 4, + u"IsBookmarkable"_ustr, 4, cppu::UnoType<bool>::get() , 0 ), Property( - "ResultSetConcurrency", 5, + u"ResultSetConcurrency"_ustr, 5, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "ResultSetType", 6, + u"ResultSetType"_ustr, 6, ::cppu::UnoType<sal_Int32>::get() , 0 )}, true ); return arrayHelper; diff --git a/connectivity/source/drivers/postgresql/pq_connection.cxx b/connectivity/source/drivers/postgresql/pq_connection.cxx index 6661a97d5669..74402197a0a5 100644 --- a/connectivity/source/drivers/postgresql/pq_connection.cxx +++ b/connectivity/source/drivers/postgresql/pq_connection.cxx @@ -34,6 +34,7 @@ * ************************************************************************/ +#include <utility> #include <vector> #include <string.h> @@ -96,8 +97,8 @@ class ClosableReference : public cppu::WeakImplHelper< css::uno::XReference > rtl::Reference<Connection> m_conn; ::rtl::ByteSequence m_id; public: - ClosableReference( const ::rtl::ByteSequence & id , Connection *that ) - : m_conn( that ), m_id( id ) + ClosableReference( ::rtl::ByteSequence id , Connection *that ) + : m_conn( that ), m_id(std::move( id )) { } @@ -115,9 +116,9 @@ public: Connection::Connection( const rtl::Reference< comphelper::RefCountedMutex > &refMutex, - const css::uno::Reference< css::uno::XComponentContext > & ctx ) + css::uno::Reference< css::uno::XComponentContext > ctx ) : ConnectionBase( refMutex->GetMutex() ), - m_ctx( ctx ) , + m_ctx(std::move( ctx )) , m_xMutex( refMutex ) { } @@ -147,7 +148,6 @@ void Connection::close() vectorDispose.push_back( Reference< XComponent > ( m_settings.users, UNO_QUERY ) ); vectorDispose.push_back( Reference< XComponent > ( m_settings.tables , UNO_QUERY ) ); - vectorDispose.push_back( Reference< XComponent > ( m_meta, UNO_QUERY ) ); m_meta.clear(); m_settings.tables.clear(); m_settings.users.clear(); @@ -191,7 +191,7 @@ Reference< XStatement > Connection::createStatement() ::rtl::ByteSequence id( 16 ); rtl_createUuid( reinterpret_cast<sal_uInt8*>(id.getArray()), nullptr, false ); m_myStatements[ id ] = Reference< XCloseable > ( stmt ); - stmt->queryAdapter()->addReference( new ClosableReference( id, this ) ); + stmt->queryAdapter()->addReference( new ClosableReference( std::move(id), this ) ); return stmt; } @@ -207,14 +207,14 @@ Reference< XPreparedStatement > Connection::prepareStatement( const OUString& sq ::rtl::ByteSequence id( 16 ); rtl_createUuid( reinterpret_cast<sal_uInt8*>(id.getArray()), nullptr, false ); m_myStatements[ id ] = Reference< XCloseable > ( stmt ); - stmt->queryAdapter()->addReference( new ClosableReference( id, this ) ); + stmt->queryAdapter()->addReference(new ClosableReference(std::move(id), this)); return stmt; } Reference< XPreparedStatement > Connection::prepareCall( const OUString& ) { throw SQLException( - "pq_driver: Callable statements not supported", + u"pq_driver: Callable statements not supported"_ustr, Reference< XInterface > (), OUString() , 1, Any() ); } @@ -281,7 +281,7 @@ OUString Connection::getCatalog() MutexGuard guard( m_xMutex->GetMutex() ); if( m_settings.pConnection == nullptr ) { - throw SQLException( "pq_connection: connection is closed", *this, + throw SQLException( u"pq_connection: connection is closed"_ustr, *this, OUString(), 1, Any() ); } char * p = PQdb(m_settings.pConnection ); @@ -330,7 +330,15 @@ class cstr_vector std::vector<char*> values; std::vector<bool> acquired; public: +#if defined __GNUC__ && !defined __clang__ && __GNUC__ == 14 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif cstr_vector () { values.reserve(8); acquired.reserve(8); } +#if defined __GNUC__ && !defined __clang__ && __GNUC__ == 14 +#pragma GCC diagnostic pop +#endif ~cstr_vector () { OSL_ENSURE(values.size() == acquired.size(), "pq_connection: cstr_vector values and acquired size mismatch"); @@ -418,7 +426,7 @@ void Connection::initialize( const Sequence< Any >& aArguments ) if( ! tc.is() ) { throw RuntimeException( - "pq_driver: Couldn't instantiate converter service" ); + u"pq_driver: Couldn't instantiate converter service"_ustr ); } if( aArguments.getLength() != 2 ) { @@ -431,7 +439,7 @@ void Connection::initialize( const Sequence< Any >& aArguments ) { throw IllegalArgumentException( "pq_driver: expected string as first argument, got " - + aArguments[0].getValueType().getTypeName(), + + aArguments[0].getValueTypeName(), *this, 0 ); } @@ -470,7 +478,7 @@ void Connection::initialize( const Sequence< Any >& aArguments ) // Just the most likely error; the error might be HY024 "Invalid attribute value". throw SQLException( "Error in database URL '" + url + "':\n" + errorMessage, - *this, "HY092", 5, Any() ); + *this, u"HY092"_ustr, 5, Any() ); } for ( PQconninfoOption * opt = oOpts.get(); opt->keyword != nullptr; ++opt) @@ -489,7 +497,7 @@ void Connection::initialize( const Sequence< Any >& aArguments ) m_settings.pConnection = PQconnectdbParams( keywords.c_array(), values.c_array(), 0 ); } if( ! m_settings.pConnection ) - throw RuntimeException("pq_driver: out of memory" ); + throw RuntimeException(u"pq_driver: out of memory"_ustr ); if( PQstatus( m_settings.pConnection ) == CONNECTION_BAD ) { const char * error = PQerrorMessage( m_settings.pConnection ); @@ -506,7 +514,7 @@ void Connection::initialize( const Sequence< Any >& aArguments ) m_settings.user = OUString( p, strlen(p), RTL_TEXTENCODING_UTF8); p = PQdb( m_settings.pConnection ); m_settings.catalog = OUString( p, strlen(p), RTL_TEXTENCODING_UTF8); - m_settings.tc = tc; + m_settings.tc = std::move(tc); SAL_INFO("connectivity.postgresql", "connection to '" << url << "' successfully opened"); } @@ -519,7 +527,7 @@ void Connection::disposing() void Connection::checkClosed() { if( !m_settings.pConnection ) - throw SQLException( "pq_connection: Connection already closed", + throw SQLException( u"pq_connection: Connection already closed"_ustr, *this, OUString(), 1, Any() ); } diff --git a/connectivity/source/drivers/postgresql/pq_connection.hxx b/connectivity/source/drivers/postgresql/pq_connection.hxx index f30483f70938..2b86ce5882fd 100644 --- a/connectivity/source/drivers/postgresql/pq_connection.hxx +++ b/connectivity/source/drivers/postgresql/pq_connection.hxx @@ -66,6 +66,8 @@ namespace pq_sdbc_driver { struct ConnectionSettings; +class DatabaseMetaData; + struct ConnectionSettings { ConnectionSettings() : @@ -123,7 +125,7 @@ class Connection : public ConnectionBase css::uno::Reference< css::container::XNameAccess > m_typeMap; ConnectionSettings m_settings; ::rtl::Reference< comphelper::RefCountedMutex > m_xMutex; - css::uno::Reference< css::sdbc::XDatabaseMetaData > m_meta; + rtl::Reference< DatabaseMetaData > m_meta; WeakHashMap m_myStatements; private: @@ -134,7 +136,7 @@ private: public: Connection( const rtl::Reference< comphelper::RefCountedMutex > &refMutex, - const css::uno::Reference< css::uno::XComponentContext > & ctx ); + css::uno::Reference< css::uno::XComponentContext > ctx ); virtual ~Connection( ) override; diff --git a/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx b/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx index c3280e07bf15..76157bc4c305 100644 --- a/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx +++ b/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx @@ -84,6 +84,7 @@ #include <com/sun/star/sdbc/IndexType.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> #include <com/sun/star/sdbc/ColumnSearch.hpp> +#include <utility> using ::osl::MutexGuard; @@ -114,13 +115,13 @@ namespace pq_sdbc_driver #define DEFERRABILITY_NONE 7 DatabaseMetaData::DatabaseMetaData( - const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, - const css::uno::Reference< css::sdbc::XConnection > & origin, + ::rtl::Reference< comphelper::RefCountedMutex > refMutex, + css::uno::Reference< css::sdbc::XConnection > origin, ConnectionSettings *pSettings ) - : m_xMutex( refMutex ), + : m_xMutex(std::move( refMutex )), m_pSettings( pSettings ), - m_origin( origin ), - m_getIntSetting_stmt ( m_origin->prepareStatement("SELECT setting FROM pg_catalog.pg_settings WHERE name=?") ) + m_origin(std::move( origin )), + m_getIntSetting_stmt ( m_origin->prepareStatement(u"SELECT setting FROM pg_catalog.pg_settings WHERE name=?"_ustr) ) { init_getReferences_stmt(); init_getPrivs_stmt(); @@ -180,7 +181,7 @@ sal_Bool DatabaseMetaData::nullsAreSortedAtEnd( ) OUString DatabaseMetaData::getDatabaseProductName( ) { - return "PostgreSQL"; + return u"PostgreSQL"_ustr; } OUString DatabaseMetaData::getDatabaseProductVersion( ) @@ -189,7 +190,7 @@ OUString DatabaseMetaData::getDatabaseProductVersion( ) } OUString DatabaseMetaData::getDriverName( ) { - return "postgresql-sdbc"; + return u"postgresql-sdbc"_ustr; } OUString DatabaseMetaData::getDriverVersion( ) @@ -210,10 +211,10 @@ sal_Int32 DatabaseMetaData::getDriverMinorVersion( ) sal_Bool DatabaseMetaData::usesLocalFiles( ) { // LEM TODO: - // http://wiki.openoffice.org/wiki/Documentation/DevGuide/Database/XDatabaseMetaData_Interface + // https://wiki.documentfoundation.org/Documentation/DevGuide/Database_Access#XDatabaseMetaData_Interface // says "Returns true when the catalog name of the // database should not appear in the DatasourceBrowser - // of OpenOffice.org API, otherwise false is returned." + // of LibreOffice API, otherwise false is returned." // So, hmmm, think about it. return false; } @@ -270,7 +271,7 @@ sal_Bool DatabaseMetaData::storesMixedCaseQuotedIdentifiers( ) OUString DatabaseMetaData::getIdentifierQuoteString( ) { - return "\""; + return u"\""_ustr; } OUString DatabaseMetaData::getSQLKeywords( ) @@ -281,7 +282,7 @@ OUString DatabaseMetaData::getSQLKeywords( ) // See http://www.postgresql.org/docs/current/static/sql-keywords-appendix.html // LEM TODO: consider using pg_get_keywords(), filter on catcode return - "ANALYSE," + u"ANALYSE," "ANALYZE," "ARRAY," //SQL:1999 "ASYMMETRIC," //SQL:2003 @@ -305,19 +306,19 @@ OUString DatabaseMetaData::getSQLKeywords( ) "SIMILAR," //SQL:2003 "VARIADIC," "VERBOSE," - "WINDOW" //SQL:2003 + "WINDOW"_ustr //SQL:2003 ; } OUString DatabaseMetaData::getNumericFunctions( ) { - // See http://www.postgresql.org/docs/9.1/static/functions-math.html - // LEM TODO: Err... http://wiki.openoffice.org/wiki/Documentation/DevGuide/Database/Support_Scalar_Functions + // See https://www.postgresql.org/docs/9.1/static/functions-math.html + // LEM TODO: Err... https://wiki.documentfoundation.org/Documentation/DevGuide/Database_Access#Support_Scalar_Functions // says this should be "Open Group CLI" names, not PostgreSQL names. // Currently this is just a list of supported functions in PostgreSQL, with PostgreSQL names. // And it is my job to map from Open Group CLI names/syntax to PostgreSQL names/syntax. Where? By parsing the SQL??? // Should look at what the JDBC driver is doing. return - "abs," + u"abs," "cbrt," "ceil," "ceiling," @@ -345,7 +346,7 @@ OUString DatabaseMetaData::getNumericFunctions( ) "cos," "cot," "sin," - "tan" + "tan"_ustr ; } @@ -353,7 +354,7 @@ OUString DatabaseMetaData::getStringFunctions( ) { // See http://www.postgresql.org/docs/9.1/static/functions-string.html return - "bit_length," + u"bit_length," "char_length," "character_length," "lower," @@ -399,7 +400,7 @@ OUString DatabaseMetaData::getStringFunctions( ) "substr," "to_ascii," "to_hex," - "translate" + "translate"_ustr ; } @@ -408,7 +409,7 @@ OUString DatabaseMetaData::getSystemFunctions( ) // See http://www.postgresql.org/docs/9.1/static/functions-info.html // and http://www.postgresql.org/docs/9.1/static/functions-admin.html return - "current_catalog," + u"current_catalog," "current_database," "current_query," "current_schema," @@ -529,14 +530,14 @@ OUString DatabaseMetaData::getSystemFunctions( ) "pg_try_advisory_lock_shared," "pg_try_advisory_xact_lock," "pg_try_advisory_xact_lock_shared," - "pg_sleep" + "pg_sleep"_ustr ; } OUString DatabaseMetaData::getTimeDateFunctions( ) { // TODO return - "age," + u"age," "age," "clock_timestamp," "current_date," @@ -558,16 +559,16 @@ OUString DatabaseMetaData::getTimeDateFunctions( ) "now," "statement_timestamp," "timeofday," - "transaction_timestamp," + "transaction_timestamp,"_ustr ; } OUString DatabaseMetaData::getSearchStringEscape( ) { - return "\\"; + return u"\\"_ustr; } OUString DatabaseMetaData::getExtraNameCharacters( ) { - return "$"; + return u"$"_ustr; } sal_Bool DatabaseMetaData::supportsAlterTableWithAddColumn( ) @@ -722,17 +723,17 @@ sal_Bool DatabaseMetaData::supportsLimitedOuterJoins( ) OUString DatabaseMetaData::getSchemaTerm( ) { - return "SCHEMA"; + return u"SCHEMA"_ustr; } OUString DatabaseMetaData::getProcedureTerm( ) { - return "function"; + return u"function"_ustr; } OUString DatabaseMetaData::getCatalogTerm( ) { - return "DATABASE"; + return u"DATABASE"_ustr; } sal_Bool DatabaseMetaData::isCatalogAtStart( ) @@ -742,7 +743,7 @@ sal_Bool DatabaseMetaData::isCatalogAtStart( ) OUString DatabaseMetaData::getCatalogSeparator( ) { - return "."; + return u"."_ustr; } sal_Bool DatabaseMetaData::supportsSchemasInDataManipulation( ) @@ -909,7 +910,7 @@ sal_Int32 DatabaseMetaData::getIntSetting(const OUString& settingName) sal_Int32 DatabaseMetaData::getMaxNameLength() { if ( m_pSettings->maxNameLen == 0) - m_pSettings->maxNameLen = getIntSetting( "max_identifier_length" ); + m_pSettings->maxNameLen = getIntSetting( u"max_identifier_length"_ustr ); OSL_ENSURE(m_pSettings->maxNameLen, "postgresql-sdbc: maxNameLen is zero"); return m_pSettings->maxNameLen; } @@ -917,7 +918,7 @@ sal_Int32 DatabaseMetaData::getMaxNameLength() sal_Int32 DatabaseMetaData::getMaxIndexKeys() { if ( m_pSettings->maxIndexKeys == 0) - m_pSettings->maxIndexKeys = getIntSetting("max_index_keys"); + m_pSettings->maxIndexKeys = getIntSetting(u"max_index_keys"_ustr); OSL_ENSURE(m_pSettings->maxIndexKeys, "postgresql-sdbc: maxIndexKeys is zero"); return m_pSettings->maxIndexKeys; } @@ -1123,14 +1124,14 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getTables( // Take "inspiration" from JDBC driver // Ah, this is used to create a XResultSet manually... Try to do it directly in SQL Reference< XPreparedStatement > statement = m_origin->prepareStatement( - "SELECT " + u"SELECT " "DISTINCT ON (pg_namespace.nspname, relname ) " // avoid duplicates (pg_settings !) "pg_namespace.nspname, relname, relkind, pg_description.description " "FROM pg_namespace, pg_class LEFT JOIN pg_description ON pg_class.oid = pg_description.objoid " "WHERE relnamespace = pg_namespace.oid " "AND ( relkind = 'r' OR relkind = 'v') " "AND pg_namespace.nspname LIKE ? " - "AND relname LIKE ? " + "AND relname LIKE ? "_ustr // "ORDER BY pg_namespace.nspname || relname" ); @@ -1185,30 +1186,30 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getTables( namespace { // sort no schema first, then "public", then normal schemas, then internal schemas - int compare_schema(const OUString &nsA, std::u16string_view nsB) + int compare_schema(std::u16string_view nsA, std::u16string_view nsB) { - if (nsA.isEmpty()) + if (nsA.empty()) { return nsB.empty() ? 0 : -1; } else if (nsB.empty()) { - assert(!nsA.isEmpty()); + assert(!nsA.empty()); return 1; } - else if(nsA == "public") + else if(nsA == u"public") { return (nsB == u"public") ? 0 : -1; } else if(nsB == u"public") { - assert(nsA != "public"); + assert(nsA != u"public"); return 1; } - else if(nsA.startsWith("pg_")) + else if(o3tl::starts_with(nsA, u"pg_")) { if(o3tl::starts_with(nsB, u"pg_")) - return nsA.compareTo(nsB); + return nsA.compare(nsB); else return 1; } @@ -1218,7 +1219,7 @@ namespace } else { - return nsA.compareTo(nsB); + return nsA.compare(nsB); } } @@ -1244,7 +1245,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getSchemas( ) // <b>TABLE_SCHEM</b> string =&gt; schema name Reference< XStatement > statement = m_origin->createStatement(); Reference< XResultSet > rs = statement->executeQuery( - "SELECT nspname from pg_namespace" ); + u"SELECT nspname from pg_namespace"_ustr ); // LEM TODO: look at JDBC driver and consider doing the same // in particular, excluding temporary schemas, but maybe better through pg_is_other_temp_schema(oid) OR == pg_my_temp_schema() @@ -1364,9 +1365,9 @@ namespace { { DatabaseTypeDescription() {} - DatabaseTypeDescription( const OUString &name, const OUString & type ) : - typeName( name ), - typeType( type ) + DatabaseTypeDescription( OUString name, OUString type ) : + typeName(std::move( name )), + typeType(std::move( type )) {} DatabaseTypeDescription( const DatabaseTypeDescription &source ) : typeName( source.typeName ), @@ -1405,8 +1406,7 @@ static void columnMetaData2DatabaseTypeDescription( oidMap[row->getInt(12)] = DatabaseTypeDescription(); if( domains ) queryBuf.append( " OR " ); - queryBuf.append( "oid = " ); - queryBuf.append( row->getInt(12 ) ); + queryBuf.append( "oid = " + OUString::number( row->getInt(12 ) ) ); domains ++; } } @@ -1534,8 +1534,8 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getColumns( columnMetaData2DatabaseTypeDescription( domainMap, rs, domainTypeStmt ); sal_uInt32 colNum(0); - OUString sSchema( "#invalid#" ); - OUString sTable( "#invalid#" ); + OUString sSchema( u"#invalid#"_ustr ); + OUString sTable( u"#invalid#"_ustr ); while( rs->next() ) { @@ -1685,14 +1685,14 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getPrimaryKeys( << schema << "." << table); Reference< XPreparedStatement > statement = m_origin->prepareStatement( - "SELECT nmsp.nspname, " + u"SELECT nmsp.nspname, " "cl.relname, " "con.conkey, " "con.conname, " "con.conrelid " "FROM pg_constraint as con,pg_class as cl, pg_namespace as nmsp " "WHERE con.connamespace = nmsp.oid AND con.conrelid = cl.oid AND con.contype = 'p' " - "AND nmsp.nspname LIKE ? AND cl.relname LIKE ?" ); + "AND nmsp.nspname LIKE ? AND cl.relname LIKE ?"_ustr ); Reference< XParameters > parameters( statement, UNO_QUERY_THROW ); parameters->setString( 1 , schema ); @@ -1753,9 +1753,9 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getPrimaryKeys( row[4] >>= tableOid; row[3] >>= attnum; statement = m_origin->prepareStatement( - "SELECT att.attname FROM " + u"SELECT att.attname FROM " "pg_attribute AS att, pg_class AS cl WHERE " - "att.attrelid = ? AND att.attnum = ?" ); + "att.attrelid = ? AND att.attnum = ?"_ustr ); parameters.set( statement, UNO_QUERY_THROW ); parameters->setString( 1 , tableOid ); @@ -1778,7 +1778,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getPrimaryKeys( if( closeable.is() ) closeable->close(); } - ret[elements] = row; + ret[elements] = std::move(row); elements ++; } return new SequenceResultSet( @@ -1826,100 +1826,100 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getPrimaryKeys( #define SQL_GET_REFERENCES_ORDER_NO_PTABLE "ORDER BY pkn.nspname, pkc.relname, conkeyseq" #define SQL_GET_REFERENCES_NONE_NONE_NONE_NONE \ - SQL_GET_REFERENCES \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + u"" SQL_GET_REFERENCES \ + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_NONE_NONE_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_SOME_NONE_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PTABLE \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_SOME_NONE_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_PTABLE \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_NONE_SOME_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_FSCHEMA \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_NONE_NONE_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_NONE_SOME_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_FSCHEMA \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_NONE_SOME_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_FSCHEMA \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_NONE_NONE_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_NONE_SOME_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_FSCHEMA \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_NO_PTABLE + SQL_GET_REFERENCES_ORDER_NO_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_SOME_SOME_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PTABLE \ SQL_GET_REFERENCES_FSCHEMA \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_SOME_NONE_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PTABLE \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_NONE_SOME_SOME_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PTABLE \ SQL_GET_REFERENCES_FSCHEMA \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_SOME_SOME_NONE \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_PTABLE \ SQL_GET_REFERENCES_FSCHEMA \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_SOME_NONE_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_PTABLE \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr #define SQL_GET_REFERENCES_SOME_SOME_SOME_SOME \ - SQL_GET_REFERENCES \ + u"" SQL_GET_REFERENCES \ SQL_GET_REFERENCES_PSCHEMA \ SQL_GET_REFERENCES_PTABLE \ SQL_GET_REFERENCES_FSCHEMA \ SQL_GET_REFERENCES_FTABLE \ - SQL_GET_REFERENCES_ORDER_SOME_PTABLE + SQL_GET_REFERENCES_ORDER_SOME_PTABLE ""_ustr void DatabaseMetaData::init_getReferences_stmt () { @@ -2086,45 +2086,45 @@ namespace OUString nameB; a[0 /*TYPE_NAME*/] >>= nameA; b[0 /*TYPE_NAME*/] >>= nameB; - OUString nsA, tnA, nsB, tnB; + std::u16string_view nsA, tnA, nsB, tnB; // parse typename into schema and typename sal_Int32 nIndex=0; - nsA = nameA.getToken(0, '.', nIndex); + nsA = o3tl::getToken(nameA, 0, '.', nIndex); if (nIndex<0) { tnA = nsA; - nsA.clear(); + nsA = std::u16string_view(); } else { - tnA = nameA.getToken(0, '.', nIndex); + tnA = o3tl::getToken(nameA, 0, '.', nIndex); assert(nIndex < 0); } nIndex=0; - nsB = nameB.getToken(0, '.', nIndex); + nsB = o3tl::getToken(nameB, 0, '.', nIndex); if (nIndex<0) { tnB = nsB; - nsB.clear(); + nsB = std::u16string_view(); } else { - tnB = nameB.getToken(0, '.', nIndex); + tnB = o3tl::getToken(nameB, 0, '.', nIndex); assert(nIndex < 0); } const int ns_comp = compare_schema(nsA, nsB); if(ns_comp == 0) { - if(nsA.isEmpty()) + if(nsA.empty()) { - assert(nsB.isEmpty()); + assert(nsB.empty()); // within each type category, sort privileged choice first - if( tnA == "int4" || tnA == "varchar" || tnA == "char" || tnA == "text") + if( tnA == u"int4" || tnA == u"varchar" || tnA == u"char" || tnA == u"text") return true; - if( tnB == "int4" || tnB == "varchar" || tnB == "char" || tnB == "text") + if( tnB == u"int4" || tnB == u"varchar" || tnB == u"char" || tnB == u"text") return false; } return nameA.compareTo( nameB ) < 0; @@ -2226,12 +2226,12 @@ namespace // in postgresql the upper limit is optional, no limit means unlimited // length (=1GB). precision = 0x40000000; // about 1 GB, see character type docs in postgresql - row[CREATE_PARAMS] <<= OUString("length"); + row[CREATE_PARAMS] <<= u"length"_ustr; } else if( dataType == css::sdbc::DataType::NUMERIC ) { precision = 1000; - row[CREATE_PARAMS] <<= OUString("length, scale"); + row[CREATE_PARAMS] <<= u"length, scale"_ustr; } row[TYPE_NAME] <<= construct_full_typename(xRow->getString(6), xRow->getString(1)); @@ -2243,15 +2243,15 @@ namespace row[NULLABLE] <<= OUString::number(nullable); row[CASE_SENSITIVE] <<= OUString::number(1); row[SEARCHABLE] <<= OUString::number( calcSearchable( dataType ) ); - row[UNSIGNED_ATTRIBUTE] <<= OUString("0"); + row[UNSIGNED_ATTRIBUTE] <<= u"0"_ustr; if( css::sdbc::DataType::INTEGER == dataType || css::sdbc::DataType::BIGINT == dataType ) - row[AUTO_INCREMENT] <<= OUString("1"); // TODO + row[AUTO_INCREMENT] <<= u"1"_ustr; // TODO else - row[AUTO_INCREMENT] <<= OUString("0"); // TODO - row[MINIMUM_SCALE] <<= OUString("0"); // TODO: what is this ? + row[AUTO_INCREMENT] <<= u"0"_ustr; // TODO + row[MINIMUM_SCALE] <<= u"0"_ustr; // TODO: what is this ? row[MAXIMUM_SCALE] <<= OUString::number( getMaxScale( dataType ) ); - row[NUM_PREC_RADIX] <<= OUString("10"); // TODO: what is this ? + row[NUM_PREC_RADIX] <<= u"10"_ustr; // TODO: what is this ? vec.push_back( row ); } } @@ -2267,7 +2267,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getTypeInfo( ) Reference< XStatement > statement = m_origin->createStatement(); Reference< XResultSet > rs = statement->executeQuery( - "SELECT pg_type.typname AS typname," //1 + u"SELECT pg_type.typname AS typname," //1 "pg_type.typtype AS typtype," //2 "pg_type.typlen AS typlen," //3 "pg_type.typnotnull AS typnotnull," //4 @@ -2275,7 +2275,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getTypeInfo( ) "pg_namespace.nspname as typns " //6 "FROM pg_type LEFT JOIN pg_namespace ON pg_type.typnamespace=pg_namespace.oid " "WHERE pg_type.typtype = 'b' " - "OR pg_type.typtype = 'p'" + "OR pg_type.typtype = 'p'"_ustr ); std::vector< std::vector<Any> > vec; @@ -2283,14 +2283,14 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getTypeInfo( ) // check for domain types rs = statement->executeQuery( - "SELECT t1.typname as typname," + u"SELECT t1.typname as typname," "t2.typtype AS typtype," "t2.typlen AS typlen," "t2.typnotnull AS typnotnull," "t2.typname as realtypname, " "pg_namespace.nspname as typns " "FROM pg_type as t1 LEFT JOIN pg_type AS t2 ON t1.typbasetype=t2.oid LEFT JOIN pg_namespace ON t1.typnamespace=pg_namespace.oid " - "WHERE t1.typtype = 'd'" ); + "WHERE t1.typtype = 'd'"_ustr ); pgTypeInfo2ResultSet( vec, rs ); std::sort( vec.begin(), vec.end(), TypeInfoByDataTypeSorter() ); @@ -2362,7 +2362,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getIndexInfo( static const sal_Int32 R_COLUMN_NAME = 8; Reference< XPreparedStatement > stmt = m_origin->prepareStatement( - "SELECT nspname, " // 1 + u"SELECT nspname, " // 1 "pg_class.relname, " // 2 "class2.relname, " // 3 "indisclustered, " // 4 @@ -2372,7 +2372,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getIndexInfo( "FROM pg_index INNER JOIN pg_class ON indrelid = pg_class.oid " "INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid " "INNER JOIN pg_class as class2 ON pg_index.indexrelid = class2.oid " - "WHERE nspname = ? AND pg_class.relname = ?" ); + "WHERE nspname = ? AND pg_class.relname = ?"_ustr ); Reference< XParameters > param ( stmt, UNO_QUERY_THROW ); param->setString( 1, schema ); @@ -2385,11 +2385,11 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getIndexInfo( { std::vector< sal_Int32 > columns = parseIntArray( xRow->getString(C_COLUMNS) ); Reference< XPreparedStatement > columnsStmt = m_origin->prepareStatement( - "SELECT attnum, attname " + u"SELECT attnum, attname " "FROM pg_attribute " " INNER JOIN pg_class ON attrelid = pg_class.oid " " INNER JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid " - " WHERE pg_namespace.nspname=? AND pg_class.relname=?" ); + " WHERE pg_namespace.nspname=? AND pg_class.relname=?"_ustr ); Reference< XParameters > paramColumn ( columnsStmt, UNO_QUERY_THROW ); OUString currentSchema = xRow->getString( C_SCHEMA ); OUString currentTable = xRow->getString( C_TABLENAME ); diff --git a/connectivity/source/drivers/postgresql/pq_databasemetadata.hxx b/connectivity/source/drivers/postgresql/pq_databasemetadata.hxx index 134f72cf0186..4e8b717a96b2 100644 --- a/connectivity/source/drivers/postgresql/pq_databasemetadata.hxx +++ b/connectivity/source/drivers/postgresql/pq_databasemetadata.hxx @@ -74,8 +74,8 @@ class DatabaseMetaData : public: DatabaseMetaData( - const ::rtl::Reference< comphelper::RefCountedMutex > & reMutex, - const css::uno::Reference< css::sdbc::XConnection > & origin, + ::rtl::Reference< comphelper::RefCountedMutex > reMutex, + css::uno::Reference< css::sdbc::XConnection > origin, ConnectionSettings *pSettings ); diff --git a/connectivity/source/drivers/postgresql/pq_driver.cxx b/connectivity/source/drivers/postgresql/pq_driver.cxx index 09fe61ab2824..a1025017d8c7 100644 --- a/connectivity/source/drivers/postgresql/pq_driver.cxx +++ b/connectivity/source/drivers/postgresql/pq_driver.cxx @@ -40,12 +40,6 @@ #include "pq_driver.hxx" -using osl::MutexGuard; - -using com::sun::star::lang::XSingleComponentFactory; -using com::sun::star::lang::XServiceInfo; -using com::sun::star::lang::XComponent; - using com::sun::star::uno::Sequence; using com::sun::star::uno::Reference; using com::sun::star::uno::XInterface; @@ -73,7 +67,7 @@ Reference< XConnection > Driver::connect( Sequence< Any > seq{ Any(url), Any(info) }; return Reference< XConnection> ( m_smgr->createInstanceWithArgumentsAndContext( - "org.openoffice.comp.connectivity.pq.Connection.noext", + u"org.openoffice.comp.connectivity.pq.Connection.noext"_ustr, seq, m_ctx ), UNO_QUERY ); } @@ -103,7 +97,7 @@ sal_Int32 Driver::getMinorVersion( ) // XServiceInfo OUString SAL_CALL Driver::getImplementationName() { - return "org.openoffice.comp.connectivity.pq.Driver.noext"; + return u"org.openoffice.comp.connectivity.pq.Driver.noext"_ustr; } sal_Bool Driver::supportsService(const OUString& ServiceName) @@ -113,7 +107,7 @@ sal_Bool Driver::supportsService(const OUString& ServiceName) Sequence< OUString > Driver::getSupportedServiceNames() { - return { "com.sun.star.sdbc.Driver" }; + return { u"com.sun.star.sdbc.Driver"_ustr }; } // XComponent diff --git a/connectivity/source/drivers/postgresql/pq_driver.hxx b/connectivity/source/drivers/postgresql/pq_driver.hxx index 6be6a39484f3..31d407f36965 100644 --- a/connectivity/source/drivers/postgresql/pq_driver.hxx +++ b/connectivity/source/drivers/postgresql/pq_driver.hxx @@ -36,9 +36,9 @@ #pragma once -#include <osl/mutex.hxx> #include <sal/macros.h> #include <cppuhelper/compbase.hxx> +#include <cppuhelper/basemutex.hxx> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -54,7 +54,6 @@ namespace pq_sdbc_driver SAL_STRINGIFY(PQ_SDBC_MINOR) "." \ SAL_STRINGIFY(PQ_SDBC_MICRO) -struct MutexHolder { osl::Mutex m_mutex; }; // use this to switch off sdbc support ! // typedef cppu::WeakComponentImplHelper< // css::sdbc::XDriver, @@ -64,14 +63,14 @@ typedef cppu::WeakComponentImplHelper< css::sdbc::XDriver, css::lang::XServiceInfo, css::sdbcx::XDataDefinitionSupplier > DriverBase ; -class Driver : public MutexHolder, public DriverBase +class Driver : public cppu::BaseMutex, public DriverBase { css::uno::Reference< css::uno::XComponentContext > m_ctx; css::uno::Reference< css::lang::XMultiComponentFactory > m_smgr; public: explicit Driver ( const css::uno::Reference < css::uno::XComponentContext > & ctx ) - : DriverBase( m_mutex ), + : DriverBase( m_aMutex ), m_ctx( ctx ), m_smgr( ctx->getServiceManager() ) {} diff --git a/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.cxx b/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.cxx index a75897ccb211..216a25220355 100644 --- a/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.cxx +++ b/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.cxx @@ -38,6 +38,7 @@ #include <com/sun/star/sdbc/SQLException.hpp> #include <cppuhelper/typeprovider.hxx> #include <cppuhelper/queryinterface.hxx> +#include <utility> using com::sun::star::uno::Sequence; @@ -58,9 +59,9 @@ FakedUpdateableResultSet::FakedUpdateableResultSet( PGresult *result, const OUString &schema, const OUString &table, - const OUString &aReason ) + OUString aReason ) : ResultSet( mutex, owner, pSettings, result, schema, table ), - m_aReason( aReason ) + m_aReason(std::move( aReason )) {} diff --git a/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.hxx b/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.hxx index c2907aeb0290..44e7dc9bcf13 100644 --- a/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.hxx +++ b/connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.hxx @@ -61,7 +61,7 @@ public: PGresult *result, const OUString &schema, const OUString &table, - const OUString &aReason ); + OUString aReason ); public: // XInterface virtual void SAL_CALL acquire() noexcept override { ResultSet::acquire(); } diff --git a/connectivity/source/drivers/postgresql/pq_preparedstatement.cxx b/connectivity/source/drivers/postgresql/pq_preparedstatement.cxx index 344c27175850..0daacfbdc33f 100644 --- a/connectivity/source/drivers/postgresql/pq_preparedstatement.cxx +++ b/connectivity/source/drivers/postgresql/pq_preparedstatement.cxx @@ -40,7 +40,7 @@ #include "pq_statics.hxx" #include "pq_statement.hxx" -#include <o3tl/deleter.hxx> +#include <o3tl/safeint.hxx> #include <rtl/strbuf.hxx> #include <rtl/ustrbuf.hxx> @@ -57,6 +57,7 @@ #include <string_view> #include <connectivity/dbconversion.hxx> +#include <utility> using osl::MutexGuard; @@ -90,31 +91,31 @@ static ::cppu::IPropertyArrayHelper & getPreparedStatementPropertyArrayHelper() static ::cppu::OPropertyArrayHelper arrayHelper( Sequence<Property>{ Property( - "CursorName", 0, + u"CursorName"_ustr, 0, ::cppu::UnoType<OUString>::get() , 0 ), Property( - "EscapeProcessing", 1, + u"EscapeProcessing"_ustr, 1, cppu::UnoType<bool>::get() , 0 ), Property( - "FetchDirection", 2, + u"FetchDirection"_ustr, 2, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "FetchSize", 3, + u"FetchSize"_ustr, 3, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "MaxFieldSize", 4, + u"MaxFieldSize"_ustr, 4, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "MaxRows", 5, + u"MaxRows"_ustr, 5, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "QueryTimeOut", 6, + u"QueryTimeOut"_ustr, 6, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "ResultSetConcurrency", 7, + u"ResultSetConcurrency"_ustr, 7, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "ResultSetType", 8, + u"ResultSetType"_ustr, 8, ::cppu::UnoType<sal_Int32>::get() , 0 )}, true ); static ::cppu::IPropertyArrayHelper *pArrayHelper = &arrayHelper; @@ -149,12 +150,12 @@ PreparedStatement::PreparedStatement( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const Reference< XConnection > & conn, struct ConnectionSettings *pSettings, - const OString & stmt ) + OString stmt ) : PreparedStatement_BASE(refMutex->GetMutex()) , OPropertySetHelper(PreparedStatement_BASE::rBHelper) , m_connection(conn) , m_pSettings(pSettings) - , m_stmt(stmt) + , m_stmt(std::move(stmt)) , m_xMutex(refMutex) , m_multipleResultAvailable(false) , m_multipleResultUpdateCount(0) @@ -198,7 +199,7 @@ PreparedStatement::~PreparedStatement() void PreparedStatement::checkColumnIndex( sal_Int32 parameterIndex ) { - if( parameterIndex < 1 || parameterIndex > static_cast<sal_Int32>(m_vars.size()) ) + if( parameterIndex < 1 || o3tl::make_unsigned(parameterIndex) > m_vars.size() ) { throw SQLException( "pq_preparedstatement: parameter index out of range (expected 1 to " @@ -213,7 +214,7 @@ void PreparedStatement::checkClosed() { if( ! m_pSettings || ! m_pSettings->pConnection ) throw SQLException( - "pq_driver: PreparedStatement or connection has already been closed !", + u"pq_driver: PreparedStatement or connection has already been closed !"_ustr, *this, OUString(),1,Any()); } @@ -262,10 +263,9 @@ void PreparedStatement::close( ) void PreparedStatement::raiseSQLException( const char * errorMsg ) { OUStringBuffer buf(128); - buf.append( "pq_driver: "); - buf.append( - OUString( errorMsg, strlen(errorMsg) , ConnectionSettings::encoding ) ); - buf.append( " (caused by statement '" ); + buf.append( "pq_driver: " + + OUString( errorMsg, strlen(errorMsg) , ConnectionSettings::encoding ) + + " (caused by statement '" ); buf.appendAscii( m_executedStatement.getStr() ); buf.append( "')" ); OUString error = buf.makeStringAndClear(); @@ -390,7 +390,7 @@ void PreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 ) MutexGuard guard( m_xMutex->GetMutex() ); checkClosed(); checkColumnIndex( parameterIndex ); - m_vars[parameterIndex-1] = OString( "NULL" ); + m_vars[parameterIndex-1] = "NULL"_ostr; } void PreparedStatement::setObjectNull( @@ -399,7 +399,7 @@ void PreparedStatement::setObjectNull( MutexGuard guard( m_xMutex->GetMutex() ); checkClosed(); checkColumnIndex( parameterIndex ); - m_vars[parameterIndex-1] = OString( "NULL" ); + m_vars[parameterIndex-1] = "NULL"_ostr; } @@ -409,9 +409,9 @@ void PreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool x ) checkClosed(); checkColumnIndex( parameterIndex ); if( x ) - m_vars[parameterIndex-1] = OString( "'t'" ); + m_vars[parameterIndex-1] = "'t'"_ostr; else - m_vars[parameterIndex-1] = OString( "'f'" ); + m_vars[parameterIndex-1] = "'f'"_ostr; } void PreparedStatement::setByte( sal_Int32 parameterIndex, sal_Int8 x ) @@ -486,7 +486,7 @@ void PreparedStatement::setBytes( if( ! escapedString ) { throw SQLException( - "pq_preparedstatement.setBytes: Error during converting bytesequence to an SQL conform string", + u"pq_preparedstatement.setBytes: Error during converting bytesequence to an SQL conform string"_ustr, *this, OUString(), 1, Any() ); } m_vars[parameterIndex-1] @@ -516,7 +516,7 @@ void PreparedStatement::setBinaryStream( sal_Int32 ) { throw SQLException( - "pq_preparedstatement: setBinaryStream not implemented", + u"pq_preparedstatement: setBinaryStream not implemented"_ustr, *this, OUString(), 1, Any () ); } @@ -526,7 +526,7 @@ void PreparedStatement::setCharacterStream( sal_Int32 ) { throw SQLException( - "pq_preparedstatement: setCharacterStream not implemented", + u"pq_preparedstatement: setCharacterStream not implemented"_ustr, *this, OUString(), 1, Any () ); } @@ -581,7 +581,7 @@ void PreparedStatement::setRef( const Reference< XRef >& ) { throw SQLException( - "pq_preparedstatement: setRef not implemented", + u"pq_preparedstatement: setRef not implemented"_ustr, *this, OUString(), 1, Any () ); } @@ -590,7 +590,7 @@ void PreparedStatement::setBlob( const Reference< XBlob >& ) { throw SQLException( - "pq_preparedstatement: setBlob not implemented", + u"pq_preparedstatement: setBlob not implemented"_ustr, *this, OUString(), 1, Any () ); } @@ -599,7 +599,7 @@ void PreparedStatement::setClob( const Reference< XClob >& ) { throw SQLException( - "pq_preparedstatement: setClob not implemented", + u"pq_preparedstatement: setClob not implemented"_ustr, *this, OUString(), 1, Any () ); } diff --git a/connectivity/source/drivers/postgresql/pq_preparedstatement.hxx b/connectivity/source/drivers/postgresql/pq_preparedstatement.hxx index 4755efbe0368..ed81420cec7d 100644 --- a/connectivity/source/drivers/postgresql/pq_preparedstatement.hxx +++ b/connectivity/source/drivers/postgresql/pq_preparedstatement.hxx @@ -98,7 +98,7 @@ public: PreparedStatement( const rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection> & con, struct ConnectionSettings *pSettings, - const OString &stmt ); + OString stmt ); virtual ~PreparedStatement() override; public: // XInterface diff --git a/connectivity/source/drivers/postgresql/pq_resultset.cxx b/connectivity/source/drivers/postgresql/pq_resultset.cxx index 556bae92d5be..62b33fa10ba9 100644 --- a/connectivity/source/drivers/postgresql/pq_resultset.cxx +++ b/connectivity/source/drivers/postgresql/pq_resultset.cxx @@ -44,6 +44,7 @@ #include <com/sun/star/sdbc/ResultSetType.hpp> #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/SQLException.hpp> +#include <utility> using osl::MutexGuard; @@ -63,13 +64,13 @@ void ResultSet::checkClosed() { if( ! m_result ) { - throw SQLException( "pq_resultset: already closed", + throw SQLException( u"pq_resultset: already closed"_ustr, *this, OUString(), 1, Any() ); } if( ! m_ppSettings || ! *m_ppSettings || ! (*m_ppSettings)->pConnection ) { - throw SQLException( "pq_resultset: statement has been closed already", + throw SQLException( u"pq_resultset: statement has been closed already"_ustr, *this, OUString(), 1, Any() ); } @@ -79,14 +80,14 @@ ResultSet::ResultSet( const ::rtl::Reference< comphelper::RefCountedMutex > & re const Reference< XInterface > & owner, ConnectionSettings **ppSettings, PGresult * result, - const OUString &schema, - const OUString &table) + OUString schema, + OUString table) : BaseResultSet( refMutex, owner, PQntuples( result ), PQnfields( result ),(*ppSettings)->tc ), m_result( result ), - m_schema( schema ), - m_table( table ), + m_schema(std::move( schema )), + m_table(std::move( table )), m_ppSettings( ppSettings ) { // LEM TODO: shouldn't these things be inherited from the statement or something like that? @@ -164,7 +165,6 @@ sal_Int32 ResultSet::findColumn( const OUString& columnName ) else { ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); } return res; } diff --git a/connectivity/source/drivers/postgresql/pq_resultset.hxx b/connectivity/source/drivers/postgresql/pq_resultset.hxx index 340e34b70c3b..cf2888bf5b93 100644 --- a/connectivity/source/drivers/postgresql/pq_resultset.hxx +++ b/connectivity/source/drivers/postgresql/pq_resultset.hxx @@ -72,8 +72,8 @@ public: const css::uno::Reference< css::uno::XInterface > &owner, ConnectionSettings **pSettings, PGresult *result, - const OUString &schema, - const OUString &table ); + OUString schema, + OUString table ); virtual ~ResultSet() override; public: // XCloseable diff --git a/connectivity/source/drivers/postgresql/pq_resultsetmetadata.cxx b/connectivity/source/drivers/postgresql/pq_resultsetmetadata.cxx index fbe10f82dacb..26b11de27985 100644 --- a/connectivity/source/drivers/postgresql/pq_resultsetmetadata.cxx +++ b/connectivity/source/drivers/postgresql/pq_resultsetmetadata.cxx @@ -46,6 +46,7 @@ #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/SQLException.hpp> #include <com/sun/star/sdbc/XRow.hpp> +#include <utility> #include <string.h> @@ -113,18 +114,18 @@ static void extractPrecisionAndScale( sal_Int32 atttypmod, sal_Int32 *precision, } ResultSetMetaData::ResultSetMetaData( - const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, - const css::uno::Reference< css::sdbc::XResultSet > & origin, + ::rtl::Reference< comphelper::RefCountedMutex > refMutex, + css::uno::Reference< css::sdbc::XResultSet > origin, ResultSet * pResultSet, ConnectionSettings **ppSettings, PGresult const *pResult, - const OUString &schemaName, - const OUString &tableName ) : - m_xMutex( refMutex ), + OUString schemaName, + OUString tableName ) : + m_xMutex(std::move( refMutex )), m_ppSettings( ppSettings ), - m_origin( origin ), - m_tableName( tableName ), - m_schemaName( schemaName ), + m_origin(std::move( origin )), + m_tableName(std::move( tableName )), + m_schemaName(std::move( schemaName )), m_colDesc( PQnfields( pResult ) ), m_pResultSet( pResultSet ), m_checkedForTable( false ), @@ -166,8 +167,7 @@ void ResultSetMetaData::checkForTypes() if( i > 0 ) buf.append( " OR " ); int oid = m_colDesc[i].typeOid; - buf.append( "oid=" ); - buf.append( static_cast<sal_Int32>(oid) ); + buf.append( "oid=" + OUString::number(static_cast<sal_Int32>(oid)) ); } Reference< XResultSet > rs = stmt->executeQuery( buf.makeStringAndClear() ); Reference< XRow > xRow( rs, UNO_QUERY ); diff --git a/connectivity/source/drivers/postgresql/pq_resultsetmetadata.hxx b/connectivity/source/drivers/postgresql/pq_resultsetmetadata.hxx index 67e34d44d257..71c98190ba2b 100644 --- a/connectivity/source/drivers/postgresql/pq_resultsetmetadata.hxx +++ b/connectivity/source/drivers/postgresql/pq_resultsetmetadata.hxx @@ -89,13 +89,13 @@ class ResultSetMetaData : public: ResultSetMetaData( - const ::rtl::Reference< comphelper::RefCountedMutex > & reMutex, - const css::uno::Reference< css::sdbc::XResultSet > & origin, + ::rtl::Reference< comphelper::RefCountedMutex > reMutex, + css::uno::Reference< css::sdbc::XResultSet > origin, ResultSet *pResultSet, ConnectionSettings **pSettings, PGresult const *pResult, - const OUString &schemaName, - const OUString &tableName ); + OUString schemaName, + OUString tableName ); public: // Methods diff --git a/connectivity/source/drivers/postgresql/pq_sequenceresultset.cxx b/connectivity/source/drivers/postgresql/pq_sequenceresultset.cxx index defb99906048..84db1fa63389 100644 --- a/connectivity/source/drivers/postgresql/pq_sequenceresultset.cxx +++ b/connectivity/source/drivers/postgresql/pq_sequenceresultset.cxx @@ -95,11 +95,11 @@ Reference< XResultSetMetaData > SAL_CALL SequenceResultSet::getMetaData( ) { // Oh no, not again throw css::sdbc::SQLException( - "pq_sequenceresultset: no meta supported ", *this, + u"pq_sequenceresultset: no meta supported "_ustr, *this, // I did not find "IM001" in a specific standard, // but it seems to be used by other systems (such as ODBC) // and some parts of LibreOffice special-case it. - "IM001", 1, Any() ); + u"IM001"_ustr, 1, Any() ); } return m_meta; } @@ -117,8 +117,6 @@ sal_Int32 SAL_CALL SequenceResultSet::findColumn( } } ::dbtools::throwInvalidColumnException( columnName, *this ); - assert(false); - return 0; // Never reached } } diff --git a/connectivity/source/drivers/postgresql/pq_statement.cxx b/connectivity/source/drivers/postgresql/pq_statement.cxx index 7db4b20536e2..5867d5cdbf33 100644 --- a/connectivity/source/drivers/postgresql/pq_statement.cxx +++ b/connectivity/source/drivers/postgresql/pq_statement.cxx @@ -59,6 +59,7 @@ #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XEnumerationAccess.hpp> +#include <cstddef> #include <string.h> #include <string_view> @@ -102,31 +103,31 @@ static ::cppu::IPropertyArrayHelper & getStatementPropertyArrayHelper() static ::cppu::OPropertyArrayHelper arrayHelper( Sequence<Property>{ Property( - "CursorName", 0, + u"CursorName"_ustr, 0, ::cppu::UnoType<OUString>::get() , 0 ), Property( - "EscapeProcessing", 1, + u"EscapeProcessing"_ustr, 1, cppu::UnoType<bool>::get() , 0 ), Property( - "FetchDirection", 2, + u"FetchDirection"_ustr, 2, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "FetchSize", 3, + u"FetchSize"_ustr, 3, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "MaxFieldSize", 4, + u"MaxFieldSize"_ustr, 4, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "MaxRows", 5, + u"MaxRows"_ustr, 5, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "QueryTimeOut", 6, + u"QueryTimeOut"_ustr, 6, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "ResultSetConcurrency", 7, + u"ResultSetConcurrency"_ustr, 7, ::cppu::UnoType<sal_Int32>::get() , 0 ), Property( - "ResultSetType", 8, + u"ResultSetType"_ustr, 8, ::cppu::UnoType<sal_Int32>::get() , 0 )}, true ); @@ -161,7 +162,7 @@ void Statement::checkClosed() { if( ! m_pSettings || ! m_pSettings->pConnection ) throw SQLException( - "pq_driver: Statement or connection has already been closed !", + u"pq_driver: Statement or connection has already been closed !"_ustr, *this, OUString(),1,Any()); } @@ -252,10 +253,10 @@ static void raiseSQLException( buf.append( "]" ); } buf.append( - OUString( errorMsg, strlen(errorMsg) , ConnectionSettings::encoding ) ); - buf.append( " (caused by statement '" ); - buf.append( OStringToOUString( sql, ConnectionSettings::encoding ) ); - buf.append( "')" ); + OUString( errorMsg, strlen(errorMsg) , ConnectionSettings::encoding ) + + " (caused by statement '" + + OStringToOUString( sql, ConnectionSettings::encoding ) + + "')" ); OUString error = buf.makeStringAndClear(); SAL_WARN("connectivity.postgresql", error); throw SQLException( error, owner, OUString(), 1, Any() ); @@ -429,8 +430,8 @@ bool executePostgresCommand( const OString & cmd, struct CommandData *data ) &table); // check, whether the columns are in the result set (required !) - int i; - for( i = 0 ; i < static_cast<int>(sourceTableKeys.size()) ; i ++ ) + std::size_t i; + for( i = 0 ; i < sourceTableKeys.size() ; i ++ ) { if( -1 == PQfnumber( result, @@ -441,7 +442,7 @@ bool executePostgresCommand( const OString & cmd, struct CommandData *data ) } } - if( !sourceTableKeys.empty() && i == static_cast<int>(sourceTableKeys.size()) ) + if( !sourceTableKeys.empty() && i == sourceTableKeys.size() ) { *(data->pLastResultset) = UpdateableResultSet::createFromPGResultSet( @@ -530,12 +531,12 @@ static Sequence< OUString > getPrimaryKeyColumnNames( // retrieve the primary key ... Reference< XPreparedStatement > stmt = connection->prepareStatement( - "SELECT conkey " // 7 + u"SELECT conkey " // 7 "FROM pg_constraint INNER JOIN pg_class ON conrelid = pg_class.oid " "INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid " "LEFT JOIN pg_class AS class2 ON confrelid = class2.oid " "LEFT JOIN pg_namespace AS nmsp2 ON class2.relnamespace=nmsp2.oid " - "WHERE pg_class.relname = ? AND pg_namespace.nspname = ? AND pg_constraint.contype='p'" ); + "WHERE pg_class.relname = ? AND pg_namespace.nspname = ? AND pg_constraint.contype='p'"_ustr ); DisposeGuard guard( stmt ); Reference< XParameters > paras( stmt, UNO_QUERY ); paras->setString( 1 , tableName ); @@ -589,7 +590,7 @@ Reference< XResultSet > getGeneratedValuesFromLastInsert( ConnectionSettings *pConnectionSettings, const Reference< XConnection > &connection, sal_Int32 nLastOid, - const OUString & lastTableInserted, + std::u16string_view lastTableInserted, const OString & lastQuery ) { Reference< XResultSet > ret; @@ -598,7 +599,7 @@ Reference< XResultSet > getGeneratedValuesFromLastInsert( splitConcatenatedIdentifier( lastTableInserted, &schemaName, &tableName ); - if( nLastOid && lastTableInserted.getLength() ) + if( nLastOid && lastTableInserted.size() ) { OUStringBuffer buf( 128 ); buf.append( "SELECT * FROM " ); @@ -606,11 +607,10 @@ Reference< XResultSet > getGeneratedValuesFromLastInsert( bufferQuoteQualifiedIdentifier(buf, schemaName, tableName, pConnectionSettings ); else bufferQuoteIdentifier( buf, lastTableInserted, pConnectionSettings ); - buf.append( " WHERE oid = " ); - buf.append( nLastOid ); + buf.append( " WHERE oid = " + OUString::number(nLastOid) ); query = buf.makeStringAndClear(); } - else if ( lastTableInserted.getLength() && lastQuery.getLength() ) + else if ( lastTableInserted.size() && lastQuery.getLength() ) { // extract nameValue Pairs String2StringMap namedValues; @@ -699,8 +699,7 @@ Reference< XResultSet > getGeneratedValuesFromLastInsert( if( bAdditionalCondition ) buf.append( " AND " ); bufferQuoteIdentifier( buf, columnNameUnicode, pConnectionSettings ); - buf.append( " = " ); - buf.append( value ); + buf.append( " = " + value ); bAdditionalCondition = true; } query = buf.makeStringAndClear(); diff --git a/connectivity/source/drivers/postgresql/pq_statement.hxx b/connectivity/source/drivers/postgresql/pq_statement.hxx index fae6568bb505..816d2a55afaa 100644 --- a/connectivity/source/drivers/postgresql/pq_statement.hxx +++ b/connectivity/source/drivers/postgresql/pq_statement.hxx @@ -189,7 +189,7 @@ css::uno::Reference< css::sdbc::XResultSet > getGeneratedValuesFromLastInsert( ConnectionSettings *pConnectionSettings, const css::uno::Reference< css::sdbc::XConnection > &connection, sal_Int32 nLastOid, - const OUString & lastTableInserted, + std::u16string_view lastTableInserted, const OString & lastQuery ); diff --git a/connectivity/source/drivers/postgresql/pq_statics.cxx b/connectivity/source/drivers/postgresql/pq_statics.cxx index 7169f4617821..937e8df26686 100644 --- a/connectivity/source/drivers/postgresql/pq_statics.cxx +++ b/connectivity/source/drivers/postgresql/pq_statics.cxx @@ -35,9 +35,9 @@ ************************************************************************/ #include "pq_statics.hxx" -#include "pq_updateableresultset.hxx" #include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/beans/PropertyAttribute.hpp> +#include <utility> using com::sun::star::uno::Sequence; using com::sun::star::uno::Any; @@ -69,8 +69,8 @@ struct BaseTypeDef { const char * typeName; sal_Int32 value; }; struct PropertyDef { - PropertyDef( const OUString &str, const Type &t ) - : name( str ) , type( t ) {} + PropertyDef( OUString str, const Type &t ) + : name(std::move( str )) , type( t ) {} OUString name; css::uno::Type type; }; @@ -186,7 +186,7 @@ Statics & getStatics() // Table props set ImplementationStatics &ist = statics.refl.table; ist.implName = "org.openoffice.comp.pq.sdbcx.Table"; - ist.serviceNames = { "com.sun.star.sdbcx.Table" }; + ist.serviceNames = { u"com.sun.star.sdbcx.Table"_ustr }; PropertyDef tableDef[] = { PropertyDef( statics.CATALOG_NAME , tString ), @@ -197,11 +197,11 @@ Statics & getStatics() PropertyDef( statics.TYPE , tString ) }; ist.pProps = createPropertyArrayHelper( - tableDef, SAL_N_ELEMENTS(tableDef), READONLY ); + tableDef, std::size(tableDef), READONLY ); statics.refl.tableDescriptor.implName = "org.openoffice.comp.pq.sdbcx.TableDescriptor"; - statics.refl.tableDescriptor.serviceNames = { "com.sun.star.sdbcx.TableDescriptor" }; + statics.refl.tableDescriptor.serviceNames = { u"com.sun.star.sdbcx.TableDescriptor"_ustr }; PropertyDef tableDescDef[] = { PropertyDef( statics.CATALOG_NAME , tString ), @@ -211,11 +211,11 @@ Statics & getStatics() PropertyDef( statics.SCHEMA_NAME , tString ) }; statics.refl.tableDescriptor.pProps = createPropertyArrayHelper( - tableDescDef, SAL_N_ELEMENTS(tableDescDef), 0 ); + tableDescDef, std::size(tableDescDef), 0 ); // Column props set statics.refl.column.implName = "org.openoffice.comp.pq.sdbcx.Column"; - statics.refl.column.serviceNames = { "com.sun.star.sdbcx.Column" }; + statics.refl.column.serviceNames = { u"com.sun.star.sdbcx.Column"_ustr }; PropertyDefEx columnDef[] = { PropertyDefEx( statics.CATALOG_NAME , tString, READONLY ), @@ -233,11 +233,11 @@ Statics & getStatics() PropertyDefEx( statics.TYPE_NAME , tString ,READONLY) }; statics.refl.column.pProps = createPropertyArrayHelper( - columnDef, SAL_N_ELEMENTS(columnDef) ); + columnDef, std::size(columnDef) ); statics.refl.columnDescriptor.implName = "org.openoffice.comp.pq.sdbcx.ColumnDescriptor"; - statics.refl.columnDescriptor.serviceNames = { "com.sun.star.sdbcx.ColumnDescriptor" }; + statics.refl.columnDescriptor.serviceNames = { u"com.sun.star.sdbcx.ColumnDescriptor"_ustr }; PropertyDef columnDescDef[] = { PropertyDef( statics.CATALOG_NAME , tString ), @@ -256,11 +256,11 @@ Statics & getStatics() }; statics.refl.columnDescriptor.pProps = createPropertyArrayHelper( - columnDescDef, SAL_N_ELEMENTS(columnDescDef), 0 ); + columnDescDef, std::size(columnDescDef), 0 ); // Key properties statics.refl.key.implName = "org.openoffice.comp.pq.sdbcx.Key"; - statics.refl.key.serviceNames = { "com.sun.star.sdbcx.Key" }; + statics.refl.key.serviceNames = { u"com.sun.star.sdbcx.Key"_ustr }; PropertyDef keyDef[] = { PropertyDef( statics.DELETE_RULE, tInt ), @@ -272,13 +272,13 @@ Statics & getStatics() PropertyDef( statics.UPDATE_RULE, tInt ) }; statics.refl.key.pProps = createPropertyArrayHelper( - keyDef, SAL_N_ELEMENTS(keyDef), READONLY ); + keyDef, std::size(keyDef), READONLY ); // Key properties statics.refl.keyDescriptor.implName = "org.openoffice.comp.pq.sdbcx.KeyDescriptor"; - statics.refl.keyDescriptor.serviceNames = { "com.sun.star.sdbcx.KeyDescriptor" }; + statics.refl.keyDescriptor.serviceNames = { u"com.sun.star.sdbcx.KeyDescriptor"_ustr }; PropertyDef keyDescDef[] = { PropertyDef( statics.DELETE_RULE, tInt ), @@ -288,12 +288,12 @@ Statics & getStatics() PropertyDef( statics.UPDATE_RULE, tInt ) }; statics.refl.keyDescriptor.pProps = createPropertyArrayHelper( - keyDescDef, SAL_N_ELEMENTS(keyDescDef), 0 ); + keyDescDef, std::size(keyDescDef), 0 ); // KeyColumn props set statics.refl.keycolumn.implName = "org.openoffice.comp.pq.sdbcx.KeyColumn"; - statics.refl.keycolumn.serviceNames = { "com.sun.star.sdbcx.KeyColumn" }; + statics.refl.keycolumn.serviceNames = { u"com.sun.star.sdbcx.KeyColumn"_ustr }; PropertyDef keycolumnDef[] = { PropertyDef( statics.CATALOG_NAME , tString ), @@ -311,24 +311,24 @@ Statics & getStatics() PropertyDef( statics.TYPE_NAME , tString ) }; statics.refl.keycolumn.pProps = createPropertyArrayHelper( - keycolumnDef, SAL_N_ELEMENTS(keycolumnDef), READONLY ); + keycolumnDef, std::size(keycolumnDef), READONLY ); // KeyColumn props set statics.refl.keycolumnDescriptor.implName = "org.openoffice.comp.pq.sdbcx.KeyColumnDescriptor"; statics.refl.keycolumnDescriptor.serviceNames = - { "com.sun.star.sdbcx.KeyColumnDescriptor" }; + { u"com.sun.star.sdbcx.KeyColumnDescriptor"_ustr }; PropertyDef keycolumnDescDef[] = { PropertyDef( statics.NAME , tString ), PropertyDef( statics.RELATED_COLUMN, tString ) }; statics.refl.keycolumnDescriptor.pProps = createPropertyArrayHelper( - keycolumnDescDef, SAL_N_ELEMENTS(keycolumnDescDef), 0 ); + keycolumnDescDef, std::size(keycolumnDescDef), 0 ); // view props set statics.refl.view.implName = "org.openoffice.comp.pq.sdbcx.View"; - statics.refl.view.serviceNames = { "com.sun.star.sdbcx.View" }; + statics.refl.view.serviceNames = { u"com.sun.star.sdbcx.View"_ustr }; PropertyDef viewDef[] = { PropertyDef( statics.CATALOG_NAME , tString ), @@ -338,38 +338,38 @@ Statics & getStatics() PropertyDef( statics.SCHEMA_NAME , tString ) }; statics.refl.view.pProps = createPropertyArrayHelper( - viewDef, SAL_N_ELEMENTS(viewDef), READONLY ); + viewDef, std::size(viewDef), READONLY ); // view props set statics.refl.viewDescriptor.implName = "org.openoffice.comp.pq.sdbcx.ViewDescriptor"; - statics.refl.viewDescriptor.serviceNames = { "com.sun.star.sdbcx.ViewDescriptor" }; + statics.refl.viewDescriptor.serviceNames = { u"com.sun.star.sdbcx.ViewDescriptor"_ustr }; statics.refl.viewDescriptor.pProps = createPropertyArrayHelper( - viewDef, SAL_N_ELEMENTS(viewDef), 0 ); // reuse view, as it is identical + viewDef, std::size(viewDef), 0 ); // reuse view, as it is identical // user props set statics.refl.user.implName = "org.openoffice.comp.pq.sdbcx.User"; - statics.refl.user.serviceNames = { "com.sun.star.sdbcx.User" }; + statics.refl.user.serviceNames = { u"com.sun.star.sdbcx.User"_ustr }; PropertyDef userDefRO[] = { PropertyDef( statics.NAME , tString ) }; statics.refl.user.pProps = createPropertyArrayHelper( - userDefRO, SAL_N_ELEMENTS(userDefRO), READONLY ); + userDefRO, std::size(userDefRO), READONLY ); // user props set statics.refl.userDescriptor.implName = "org.openoffice.comp.pq.sdbcx.UserDescriptor"; - statics.refl.userDescriptor.serviceNames = { "com.sun.star.sdbcx.UserDescriptor" }; + statics.refl.userDescriptor.serviceNames = { u"com.sun.star.sdbcx.UserDescriptor"_ustr }; PropertyDef userDefWR[] = { PropertyDef( statics.NAME , tString ), PropertyDef( statics.PASSWORD , tString ) }; statics.refl.userDescriptor.pProps = createPropertyArrayHelper( - userDefWR, SAL_N_ELEMENTS(userDefWR), 0 ); + userDefWR, std::size(userDefWR), 0 ); // index props set statics.refl.index.implName = "org.openoffice.comp.pq.sdbcx.Index"; - statics.refl.index.serviceNames = { "com.sun.star.sdbcx.Index" }; + statics.refl.index.serviceNames = { u"com.sun.star.sdbcx.Index"_ustr }; PropertyDef indexDef[] = { PropertyDef( statics.CATALOG , tString ), @@ -380,18 +380,18 @@ Statics & getStatics() PropertyDef( statics.PRIVATE_COLUMN_INDEXES, tStringSequence ) }; statics.refl.index.pProps = createPropertyArrayHelper( - indexDef, SAL_N_ELEMENTS(indexDef), READONLY ); + indexDef, std::size(indexDef), READONLY ); // index props set statics.refl.indexDescriptor.implName = "org.openoffice.comp.pq.sdbcx.IndexDescriptor"; - statics.refl.indexDescriptor.serviceNames = { "com.sun.star.sdbcx.IndexDescriptor" }; + statics.refl.indexDescriptor.serviceNames = { u"com.sun.star.sdbcx.IndexDescriptor"_ustr }; statics.refl.indexDescriptor.pProps = createPropertyArrayHelper( - indexDef, SAL_N_ELEMENTS(indexDef), 0 ); + indexDef, std::size(indexDef), 0 ); // indexColumn props set statics.refl.indexColumn.implName = "org.openoffice.comp.pq.sdbcx.IndexColumn"; - statics.refl.indexColumn.serviceNames = { "com.sun.star.sdbcx.IndexColumn" }; + statics.refl.indexColumn.serviceNames = { u"com.sun.star.sdbcx.IndexColumn"_ustr }; PropertyDef indexColumnDef[] = { PropertyDef( statics.CATALOG_NAME , tString ), @@ -409,44 +409,20 @@ Statics & getStatics() PropertyDef( statics.TYPE_NAME , tString ) }; statics.refl.indexColumn.pProps = createPropertyArrayHelper( - indexColumnDef, SAL_N_ELEMENTS(indexColumnDef), READONLY ); + indexColumnDef, std::size(indexColumnDef), READONLY ); // indexColumn props set statics.refl.indexColumnDescriptor.implName = "org.openoffice.comp.pq.sdbcx.IndexColumnDescriptor"; statics.refl.indexColumnDescriptor.serviceNames = - { "com.sun.star.sdbcx.IndexColumnDescriptor" }; + { u"com.sun.star.sdbcx.IndexColumnDescriptor"_ustr }; PropertyDef indexColumnDescDef[] = { PropertyDef( statics.IS_ASCENDING, tBool ), PropertyDef( statics.NAME , tString ) }; statics.refl.indexColumnDescriptor.pProps = createPropertyArrayHelper( - indexColumnDescDef, SAL_N_ELEMENTS(indexColumnDescDef), 0 ); - - // resultset - statics.refl.resultSet.implName = "org.openoffice.comp.pq.ResultSet"; - statics.refl.resultSet.serviceNames = { "com.sun.star.sdbc.ResultSet" }; - statics.refl.resultSet.types = UpdateableResultSet::getStaticTypes( false /* updateable */ ); - PropertyDef resultSet[] = - { - PropertyDef( statics.CURSOR_NAME , tString ), - PropertyDef( statics.ESCAPE_PROCESSING , tBool ), - PropertyDef( statics.FETCH_DIRECTION , tInt ), - PropertyDef( statics.FETCH_SIZE , tInt ), - PropertyDef( statics.IS_BOOKMARKABLE , tBool ), - PropertyDef( statics.RESULT_SET_CONCURRENCY , tInt ), - PropertyDef( statics.RESULT_SET_TYPE , tInt ) - }; - statics.refl.resultSet.pProps = createPropertyArrayHelper( - resultSet, SAL_N_ELEMENTS(resultSet), 0 ); - - // updateableResultset - statics.refl.updateableResultSet.implName = "org.openoffice.comp.pq.UpdateableResultSet"; - statics.refl.updateableResultSet.serviceNames = { "com.sun.star.sdbc.ResultSet" }; - statics.refl.updateableResultSet.types = UpdateableResultSet::getStaticTypes( true /* updateable */ ); - statics.refl.updateableResultSet.pProps = createPropertyArrayHelper( - resultSet, SAL_N_ELEMENTS(resultSet), 0 ); + indexColumnDescDef, std::size(indexColumnDescDef), 0 ); // databasemetadata statics.tablesRowNames = std::vector< OUString > ( 5 ); @@ -497,32 +473,32 @@ Statics & getStatics() statics.columnRowNames = { - "TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME", - "DATA_TYPE", "TYPE_NAME", "COLUMN_SIZE", "BUFFER_LENGTH", - "DECIMAL_DIGITS", "NUM_PREC_RADIX", "NULLABLE", "REMARKS", - "COLUMN_DEF", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", "CHAR_OCTET_LENGTH", - "ORDINAL_POSITION", "IS_NULLABLE" + u"TABLE_CAT"_ustr, u"TABLE_SCHEM"_ustr, u"TABLE_NAME"_ustr, u"COLUMN_NAME"_ustr, + u"DATA_TYPE"_ustr, u"TYPE_NAME"_ustr, u"COLUMN_SIZE"_ustr, u"BUFFER_LENGTH"_ustr, + u"DECIMAL_DIGITS"_ustr, u"NUM_PREC_RADIX"_ustr, u"NULLABLE"_ustr, u"REMARKS"_ustr, + u"COLUMN_DEF"_ustr, u"SQL_DATA_TYPE"_ustr, u"SQL_DATETIME_SUB"_ustr, u"CHAR_OCTET_LENGTH"_ustr, + u"ORDINAL_POSITION"_ustr, u"IS_NULLABLE"_ustr }; statics.typeinfoColumnNames = { - "TYPE_NAME", "DATA_TYPE", "PRECISION", "LITERAL_PREFIX", - "LITERAL_SUFFIX", "CREATE_PARAMS", "NULLABLE", "CASE_SENSITIVE", - "SEARCHABLE", "UNSIGNED_ATTRIBUTE", "FIXED_PREC_SCALE", - "AUTO_INCREMENT", "LOCAL_TYPE_NAME", "MINIMUM_SCALE", - "MAXIMUM_SCALE", "SQL_DATA_TYPE", "SQL_DATETIME_SUB", - "NUM_PREC_RADIX" + u"TYPE_NAME"_ustr, u"DATA_TYPE"_ustr, u"PRECISION"_ustr, u"LITERAL_PREFIX"_ustr, + u"LITERAL_SUFFIX"_ustr, u"CREATE_PARAMS"_ustr, u"NULLABLE"_ustr, u"CASE_SENSITIVE"_ustr, + u"SEARCHABLE"_ustr, u"UNSIGNED_ATTRIBUTE"_ustr, u"FIXED_PREC_SCALE"_ustr, + u"AUTO_INCREMENT"_ustr, u"LOCAL_TYPE_NAME"_ustr, u"MINIMUM_SCALE"_ustr, + u"MAXIMUM_SCALE"_ustr, u"SQL_DATA_TYPE"_ustr, u"SQL_DATETIME_SUB"_ustr, + u"NUM_PREC_RADIX"_ustr }; statics.indexinfoColumnNames = { - "TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", - "NON_UNIQUE", "INDEX_QUALIFIER", "INDEX_NAME", - "TYPE", "ORDINAL_POSITION", "COLUMN_NAME", - "ASC_OR_DESC", "CARDINALITY", "PAGES", "FILTER_CONDITION" + u"TABLE_CAT"_ustr, u"TABLE_SCHEM"_ustr, u"TABLE_NAME"_ustr, + u"NON_UNIQUE"_ustr, u"INDEX_QUALIFIER"_ustr, u"INDEX_NAME"_ustr, + u"TYPE"_ustr, u"ORDINAL_POSITION"_ustr, u"COLUMN_NAME"_ustr, + u"ASC_OR_DESC"_ustr, u"CARDINALITY"_ustr, u"PAGES"_ustr, u"FILTER_CONDITION"_ustr }; - statics.resultSetArrayColumnNames = { "INDEX" , "VALUE" }; + statics.resultSetArrayColumnNames = { u"INDEX"_ustr , u"VALUE"_ustr }; // LEM TODO see if a refresh is needed; obtain automatically from pg_catalog.pg_type? BaseTypeDef baseTypeDefs[] = diff --git a/connectivity/source/drivers/postgresql/pq_statics.hxx b/connectivity/source/drivers/postgresql/pq_statics.hxx index 7b776ff84308..4e745e4086ee 100644 --- a/connectivity/source/drivers/postgresql/pq_statics.hxx +++ b/connectivity/source/drivers/postgresql/pq_statics.hxx @@ -37,6 +37,7 @@ #pragma once #include <unordered_map> +#include <utility> #include <vector> #include <com/sun/star/uno/Any.hxx> @@ -50,20 +51,20 @@ namespace pq_sdbc_driver struct ColumnMetaData { ColumnMetaData( - const OUString &_columnName, - const OUString &_tableName, - const OUString &_schemaTableName, - const OUString &_typeName, + OUString _columnName, + OUString _tableName, + OUString _schemaTableName, + OUString _typeName, sal_Int32 _type, sal_Int32 _precision, sal_Int32 _scale, bool _isCurrency, bool _isNullable, bool _isAutoIncrement ) : - columnName( _columnName ), - tableName( _tableName ), - schemaTableName( _schemaTableName ), - typeName( _typeName ), + columnName(std::move( _columnName )), + tableName(std::move( _tableName )), + schemaTableName(std::move( _schemaTableName )), + typeName(std::move( _typeName )), type( _type ), precision( _precision ), scale( _scale ), @@ -122,9 +123,6 @@ struct ReflectionImplementations struct ImplementationStatics indexDescriptor; struct ImplementationStatics indexColumn; struct ImplementationStatics indexColumnDescriptor; - - struct ImplementationStatics updateableResultSet; - struct ImplementationStatics resultSet; }; const sal_Int32 TABLE_INDEX_CATALOG = 0; diff --git a/connectivity/source/drivers/postgresql/pq_tools.cxx b/connectivity/source/drivers/postgresql/pq_tools.cxx index 9b75d69ba46c..b6e5d28f938e 100644 --- a/connectivity/source/drivers/postgresql/pq_tools.cxx +++ b/connectivity/source/drivers/postgresql/pq_tools.cxx @@ -37,6 +37,7 @@ #include <sal/config.h> #include <o3tl/any.hxx> +#include <o3tl/string_view.hxx> #include <rtl/strbuf.hxx> #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> @@ -79,7 +80,6 @@ using com::sun::star::uno::Reference; using com::sun::star::uno::Sequence; using com::sun::star::uno::XInterface; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::container::XEnumeration; using com::sun::star::container::XEnumerationAccess; @@ -118,14 +118,14 @@ void bufferEscapeConstant( OUStringBuffer & buf, std::u16string_view value, Conn // We have no good XInterface Reference to pass here, so just give NULL throw SQLException(OUString(errstr, strlen(errstr), ConnectionSettings::encoding), nullptr, - "22018", + u"22018"_ustr, -1, Any()); } strbuf.setLength( len ); // Previously here RTL_TEXTENCODING_ASCII_US; as we set the PostgreSQL client_encoding to UTF8, // we get UTF8 here, too. I'm not sure why it worked well before... - buf.append( OStringToOUString( strbuf.makeStringAndClear(), RTL_TEXTENCODING_UTF8 ) ); + buf.append( OStringToOUString( strbuf, RTL_TEXTENCODING_UTF8 ) ); } static void ibufferQuoteConstant( OUStringBuffer & buf, std::u16string_view value, ConnectionSettings *settings ) @@ -154,7 +154,7 @@ void bufferQuoteAnyConstant( OUStringBuffer & buf, const Any &val, ConnectionSet static void ibufferQuoteIdentifier( OUStringBuffer & buf, std::u16string_view toQuote, ConnectionSettings *settings ) { - OSL_ENSURE(settings, "pgsql-sdbc: bufferQuoteIdentifier got NULL settings"); + assert(settings && "pgsql-sdbc: bufferQuoteIdentifier got NULL settings"); OString y = iOUStringToOString( toQuote, settings ); char *cstr = PQescapeIdentifier(settings->pConnection, y.getStr(), y.getLength()); @@ -164,7 +164,7 @@ static void ibufferQuoteIdentifier( OUStringBuffer & buf, std::u16string_view to // Implementation-defined SQLACCESS error throw SQLException(OUString(errstr, strlen(errstr), ConnectionSettings::encoding), nullptr, - "22018", + u"22018"_ustr, -1, Any()); } @@ -259,7 +259,7 @@ Reference< XConnection > extractConnectionFromStatement( const Reference< XInter ret = myowner->getConnection(); if( ! ret.is() ) throw SQLException( - "PQSDBC: Couldn't retrieve connection from statement", + u"PQSDBC: Couldn't retrieve connection from statement"_ustr, Reference< XInterface > () , OUString(), 0 , css::uno::Any() ); } @@ -315,30 +315,30 @@ bool isWhitespace( sal_Unicode c ) return ' ' == c || 9 == c || 10 == c || 13 == c; } -OUString extractTableFromInsert( const OUString & sql ) +OUString extractTableFromInsert( std::u16string_view sql ) { OUString ret; - int i = 0; - while (i < sql.getLength() && isWhitespace(sql[i])) { i++; } + size_t i = 0; + while (i < sql.size() && isWhitespace(sql[i])) { i++; } - if( sql.matchIgnoreAsciiCase("insert", i) ) + if( o3tl::matchIgnoreAsciiCase(sql, u"insert", i) ) { i += 6; - while (i < sql.getLength() && isWhitespace(sql[i])) { i++; } - if( sql.matchIgnoreAsciiCase("into", i) ) + while (i < sql.size() && isWhitespace(sql[i])) { i++; } + if( o3tl::matchIgnoreAsciiCase(sql, u"into", i) ) { i +=4; - while (i < sql.getLength() && isWhitespace(sql[i])) { i++; } + while (i < sql.size() && isWhitespace(sql[i])) { i++; } int start = i; bool quote = (sql[i] == '"'); - for( i++ ; i < sql.getLength() ; i ++ ) + for( i++ ; i < sql.size() ; i ++ ) { if( quote && sql[i] == '"' ) { - while (i < sql.getLength() && isWhitespace(sql[i])) { i++; } + while (i < sql.size() && isWhitespace(sql[i])) { i++; } if( '.' == sql[i] ) { - while (i < sql.getLength() && isWhitespace(sql[i])) { i++; } + while (i < sql.size() && isWhitespace(sql[i])) { i++; } if( '"' == sql[i] ) { // the second part of the table name does not use quotes @@ -361,7 +361,7 @@ OUString extractTableFromInsert( const OUString & sql ) } } } - ret = sql.copy(start, i - start ).trim(); + ret = o3tl::trim(sql.substr(start, i - start )); // printf( "pq_statement: parsed table name %s from insert\n" , // OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US).getStr() ); } @@ -416,7 +416,7 @@ void splitSQL( const OString & sql, std::vector< OString > &vec ) { if( '"' == c ) { - vec.push_back( OString( &sql.getStr()[start], i-start+1 ) ); + vec.emplace_back( &sql.getStr()[start], i-start+1 ); start = i + 1; doubleQuote = false; } @@ -431,7 +431,7 @@ void splitSQL( const OString & sql, std::vector< OString > &vec ) } else if( '\'' == c ) { - vec.push_back( OString( &sql.getStr()[start], i - start +1 ) ); + vec.emplace_back( &sql.getStr()[start], i - start +1 ); start = i + 1; // leave single quotes ! singleQuote = false; } @@ -440,20 +440,20 @@ void splitSQL( const OString & sql, std::vector< OString > &vec ) { if( '"' == c ) { - vec.push_back( OString( &sql.getStr()[start], i - start ) ); + vec.emplace_back( &sql.getStr()[start], i - start ); doubleQuote = true; start = i; } else if( '\'' == c ) { - vec.push_back( OString( &sql.getStr()[start], i - start ) ); + vec.emplace_back( &sql.getStr()[start], i - start ); singleQuote = true; start = i; } } } if( start < i ) - vec.push_back( OString( &sql.getStr()[start] , i - start ) ); + vec.emplace_back( &sql.getStr()[start] , i - start ); // for( i = 0 ; i < vec.size() ; i ++ ) // printf( "%s!" , vec[i].getStr() ); @@ -476,7 +476,7 @@ void tokenizeSQL( const OString & sql, std::vector< OString > &vec ) { if( '"' == c ) { - vec.push_back( OString( &sql.getStr()[start], i-start ) ); + vec.emplace_back( &sql.getStr()[start], i-start ); start = i + 1; doubleQuote = false; } @@ -485,7 +485,7 @@ void tokenizeSQL( const OString & sql, std::vector< OString > &vec ) { if( '\'' == c ) { - vec.push_back( OString( &sql.getStr()[start], i - start +1 ) ); + vec.emplace_back( &sql.getStr()[start], i - start +1 ); start = i + 1; // leave single quotes ! singleQuote = false; } @@ -508,15 +508,15 @@ void tokenizeSQL( const OString & sql, std::vector< OString > &vec ) start ++; // skip additional whitespace else { - vec.push_back( OString( &sql.getStr()[start], i - start ) ); + vec.emplace_back( &sql.getStr()[start], i - start ); start = i +1; } } else if( ',' == c || isOperator( c ) || '(' == c || ')' == c ) { if( i - start ) - vec.push_back( OString( &sql.getStr()[start], i - start ) ); - vec.push_back( OString( &sql.getStr()[i], 1 ) ); + vec.emplace_back( &sql.getStr()[start], i - start ); + vec.emplace_back( &sql.getStr()[i], 1 ); start = i + 1; } else if( '.' == c ) @@ -529,15 +529,15 @@ void tokenizeSQL( const OString & sql, std::vector< OString > &vec ) else { if( i - start ) - vec.push_back( OString( &sql.getStr()[start], i - start ) ); - vec.push_back( OString( "." ) ); + vec.emplace_back( &sql.getStr()[start], i - start ); + vec.emplace_back( "." ); start = i + 1; } } } } if( start < i ) - vec.push_back( OString( &sql.getStr()[start] , i - start ) ); + vec.emplace_back( &sql.getStr()[start] , i - start ); // for( i = 0 ; i < vec.size() ; i ++ ) // printf( "%s!" , vec[i].getStr() ); @@ -596,12 +596,12 @@ OUString array2String( const css::uno::Sequence< Any > &seq ) } -std::vector< Any > parseArray( const OUString & str ) +std::vector< Any > parseArray( std::u16string_view str ) { - int len = str.getLength(); + size_t len = str.size(); bool doubleQuote = false; int brackets = 0; - int i = 0; + size_t i = 0; OUStringBuffer current; std::vector<Any> elements; @@ -644,7 +644,7 @@ std::vector< Any > parseArray( const OUString & str ) if( brackets == 0 ) { if( !current.isEmpty() || doubleQuotedValue ) - elements.push_back( makeAny( current.makeStringAndClear() ) ); + elements.emplace_back( current.makeStringAndClear() ); } else { @@ -673,7 +673,7 @@ std::vector< Any > parseArray( const OUString & str ) else if( ',' == c && brackets == 1) { doubleQuotedValue = false; - elements.push_back( makeAny( current.makeStringAndClear() ) ); + elements.emplace_back( current.makeStringAndClear() ); } else if( isWhitespace( c ) ) { @@ -711,11 +711,11 @@ void fillAttnum2attnameMap( const OUString &table ) { Reference< XPreparedStatement > prep = conn->prepareStatement( - "SELECT attname,attnum " + u"SELECT attname,attnum " "FROM pg_attribute " "INNER JOIN pg_class ON attrelid = pg_class.oid " "INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid " - "WHERE relname=? AND nspname=?" ); + "WHERE relname=? AND nspname=?"_ustr ); Reference< XParameters > paras( prep, UNO_QUERY_THROW ); paras->setString( 1 , table ); @@ -836,21 +836,21 @@ OString extractSingleTableFromSelect( const std::vector< OString > &vec ) OUString getColExprForDefaultSettingVal(ConnectionSettings const *settings) { return (PQserverVersion( settings->pConnection ) < 80000)? - OUString("pg_attrdef.adsrc"): - OUString("pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid, true)"); + u"pg_attrdef.adsrc"_ustr: + u"pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid, true)"_ustr; } -css::uno::Sequence< sal_Int32 > string2intarray( const OUString & str ) +css::uno::Sequence< sal_Int32 > string2intarray( std::u16string_view str ) { css::uno::Sequence< sal_Int32 > ret; - const sal_Int32 strlen = str.getLength(); - if( str.getLength() > 1 ) + const sal_Int32 strlen = str.size(); + if( strlen > 1 ) { sal_Int32 start = 0; sal_uInt32 c; for (;;) { - c = str.iterateCodePoints(&start); + c = o3tl::iterateCodePoints(str, &start); if (!iswspace(c)) break; if ( start == strlen) @@ -860,7 +860,7 @@ css::uno::Sequence< sal_Int32 > string2intarray( const OUString & str ) return ret; for (;;) { - c = str.iterateCodePoints(&start); + c = o3tl::iterateCodePoints(str, &start); if ( !iswspace(c) ) break; if ( start == strlen) @@ -879,7 +879,7 @@ css::uno::Sequence< sal_Int32 > string2intarray( const OUString & str ) break; if ( start == strlen) return ret; - c=str.iterateCodePoints(&start); + c = o3tl::iterateCodePoints(str, &start); } while ( c ); do { @@ -888,20 +888,20 @@ css::uno::Sequence< sal_Int32 > string2intarray( const OUString & str ) if ( start == strlen) return ret; digits.append(OUString(&c, 1)); - c = str.iterateCodePoints(&start); + c = o3tl::iterateCodePoints(str, &start); } while ( c ); - vec.push_back( digits.makeStringAndClear().toInt32() ); + vec.push_back( o3tl::toInt32(digits) ); do { if(!iswspace(c)) break; if ( start == strlen) return ret; - c = str.iterateCodePoints(&start); + c = o3tl::iterateCodePoints(str, &start); } while ( c ); if ( c == L'}' ) break; - if ( str.iterateCodePoints(&start) != L',' ) + if ( o3tl::iterateCodePoints(str, &start) != L',' ) return ret; if ( start == strlen) return ret; @@ -943,19 +943,17 @@ OUString sqltype2string( const Reference< XPropertySet > & desc ) case css::sdbc::DataType::VARCHAR: case css::sdbc::DataType::CHAR: { - typeName.append( "(" ); - typeName.append( precision ); - typeName.append( ")" ); + typeName.append( "(" + OUString::number(precision) + ")" ); break; } case css::sdbc::DataType::DECIMAL: case css::sdbc::DataType::NUMERIC: { - typeName.append( "(" ); - typeName.append( precision ); - typeName.append( "," ); - typeName.append( extractIntProperty( desc, getStatics().SCALE ) ); - typeName.append( ")" ); + typeName.append( "(" + + OUString::number(precision) + + "," + + OUString::number(extractIntProperty( desc, getStatics().SCALE )) + + ")" ); break; } default: diff --git a/connectivity/source/drivers/postgresql/pq_tools.hxx b/connectivity/source/drivers/postgresql/pq_tools.hxx index 1f9356ed41d3..c5f9174111ca 100644 --- a/connectivity/source/drivers/postgresql/pq_tools.hxx +++ b/connectivity/source/drivers/postgresql/pq_tools.hxx @@ -106,7 +106,7 @@ bool extractBoolProperty( void disposeNoThrow( const css::uno::Reference< css::uno::XInterface > & r ); void disposeObject( const css::uno::Reference< css::uno::XInterface > & r ); -OUString extractTableFromInsert( const OUString & sql ); +OUString extractTableFromInsert( std::u16string_view sql ); OString extractSingleTableFromSelect( const std::vector< OString > &vec ); OUString getColExprForDefaultSettingVal(ConnectionSettings const *settings); @@ -115,7 +115,7 @@ void tokenizeSQL( const OString & sql, std::vector< OString > &vec ); void splitSQL( const OString & sql, std::vector< OString > &vec ); std::vector< sal_Int32 > parseIntArray( const OUString & str ); /// @throws css::sdbc::SQLException -std::vector< css::uno::Any > parseArray( const OUString & str ); +std::vector< css::uno::Any > parseArray( std::u16string_view str ); OUString array2String( const css::uno::Sequence< css::uno::Any > &seq ); @@ -131,7 +131,7 @@ void fillAttnum2attnameMap( const OUString &schema, const OUString &table ); -css::uno::Sequence< sal_Int32 > string2intarray( const OUString & str ); +css::uno::Sequence< sal_Int32 > string2intarray( std::u16string_view str ); css::uno::Sequence< OUString > convertMappedIntArray2StringArray( const Int2StringMap &map, const css::uno::Sequence< sal_Int32> &source ); diff --git a/connectivity/source/drivers/postgresql/pq_updateableresultset.cxx b/connectivity/source/drivers/postgresql/pq_updateableresultset.cxx index 5c1b23e82175..d8d2edfc6c04 100644 --- a/connectivity/source/drivers/postgresql/pq_updateableresultset.cxx +++ b/connectivity/source/drivers/postgresql/pq_updateableresultset.cxx @@ -116,7 +116,7 @@ css::uno::Reference< css::sdbc::XCloseable > UpdateableResultSet::createFromPGRe OUString( val, strlen( val ), ConnectionSettings::encoding ); } } - data[row] = aRow; + data[row] = std::move(aRow); } rtl::Reference<UpdateableResultSet> pRS = new UpdateableResultSet( @@ -187,7 +187,7 @@ void UpdateableResultSet::insertRow( ) if( ! m_insertRow ) throw SQLException( - "pq_resultset.insertRow: moveToInsertRow has not been called !", + u"pq_resultset.insertRow: moveToInsertRow has not been called !"_ustr, *this, OUString(), 1, Any() ); OUStringBuffer buf( 128 ); @@ -279,7 +279,7 @@ void UpdateableResultSet::updateRow( ) if( m_insertRow ) throw SQLException( - "pq_resultset.updateRow: moveToCurrentRow has not been called !", + u"pq_resultset.updateRow: moveToCurrentRow has not been called !"_ustr, *this, OUString(), 1, Any() ); OUStringBuffer buf( 128 ); @@ -296,8 +296,8 @@ void UpdateableResultSet::updateRow( ) buf.append( ", " ); columns ++; - buf.append( m_columnNames[i] ); - buf.append( " = " ); + buf.append( m_columnNames[i] + + " = " ); bufferQuoteAnyConstant( buf, m_updateableField[i].value, *m_ppSettings ); // OUString val; // m_updateableField[i].value >>= val; @@ -326,7 +326,7 @@ void UpdateableResultSet::deleteRow( ) if( m_insertRow ) throw SQLException( - "pq_resultset.deleteRow: deleteRow cannot be called when on insert row !", + u"pq_resultset.deleteRow: deleteRow cannot be called when on insert row !"_ustr, *this, OUString(), 1, Any() ); if( m_row < 0 || m_row >= m_rowCount ) @@ -342,8 +342,8 @@ void UpdateableResultSet::deleteRow( ) OUStringBuffer buf( 128 ); buf.append( "DELETE FROM " ); bufferQuoteQualifiedIdentifier( buf, m_schema, m_table, *m_ppSettings ); - buf.append( " " ); - buf.append( buildWhereClause() ); + buf.append( " " + + buildWhereClause() ); stmt->executeUpdate( buf.makeStringAndClear() ); @@ -473,7 +473,7 @@ void UpdateableResultSet::updateBytes( sal_Int32 columnIndex, const css::uno::Se if( ! escapedString ) { throw SQLException( - "pq_preparedstatement.setBytes: Error during converting bytesequence to an SQL conform string", + u"pq_preparedstatement.setBytes: Error during converting bytesequence to an SQL conform string"_ustr, *this, OUString(), 1, Any() ); } // buf.append( (const char *)escapedString, len -1 ); diff --git a/connectivity/source/drivers/postgresql/pq_updateableresultset.hxx b/connectivity/source/drivers/postgresql/pq_updateableresultset.hxx index 1beeadc31e98..52cb513a5856 100644 --- a/connectivity/source/drivers/postgresql/pq_updateableresultset.hxx +++ b/connectivity/source/drivers/postgresql/pq_updateableresultset.hxx @@ -44,6 +44,7 @@ #include <com/sun/star/sdbc/ResultSetType.hpp> #include <com/sun/star/sdbc/XResultSetUpdate.hpp> #include <com/sun/star/sdbc/XRowUpdate.hpp> +#include <utility> namespace pq_sdbc_driver { @@ -78,13 +79,13 @@ private: std::vector< OUString >&& colNames, std::vector< std::vector< css::uno::Any > >&& data, ConnectionSettings **ppSettings, - const OUString &schema, - const OUString &table, + OUString schema, + OUString table, std::vector< OUString >&& primaryKey) : SequenceResultSet( mutex, owner, std::move(colNames), std::move(data), (*ppSettings)->tc ), m_ppSettings( ppSettings ), - m_schema( schema ), - m_table( table ), + m_schema(std::move( schema )), + m_table(std::move( table )), m_primaryKey( std::move(primaryKey) ), m_insertRow( false ) { diff --git a/connectivity/source/drivers/postgresql/pq_xbase.cxx b/connectivity/source/drivers/postgresql/pq_xbase.cxx index 1fec4130a9db..dd9579fce0da 100644 --- a/connectivity/source/drivers/postgresql/pq_xbase.cxx +++ b/connectivity/source/drivers/postgresql/pq_xbase.cxx @@ -36,7 +36,9 @@ #include <cppuhelper/supportsservice.hxx> #include <comphelper/sequence.hxx> +#include <utility> +#include "pq_statics.hxx" #include "pq_tools.hxx" #include "pq_xbase.hxx" @@ -55,18 +57,18 @@ namespace pq_sdbc_driver { ReflectionBase::ReflectionBase( - const OUString &implName, + OUString implName, const css::uno::Sequence< OUString > &supportedServices, const ::rtl::Reference< comphelper::RefCountedMutex >& refMutex, - const css::uno::Reference< css::sdbc::XConnection > &conn, + css::uno::Reference< css::sdbc::XConnection > conn, ConnectionSettings *pSettings, cppu::IPropertyArrayHelper & props /* must survive this object !*/ ) : ReflectionBase_BASE( refMutex->GetMutex() ), OPropertySetHelper( ReflectionBase_BASE::rBHelper ), - m_implName( implName ), + m_implName(std::move( implName )), m_supportedServices( supportedServices ), m_xMutex( refMutex ), - m_conn( conn ), + m_conn(std::move( conn )), m_pSettings( pSettings ), m_propsDesc( props ), m_values( props.getProperties().getLength() ) @@ -203,7 +205,7 @@ OUString ReflectionBase::getName( ) void ReflectionBase::setName( const OUString& /* aName */ ) { throw RuntimeException( - "pq_sdbc::ReflectionBase::setName not implemented", + u"pq_sdbc::ReflectionBase::setName not implemented"_ustr, *this ); //setPropertyValue( getStatics().NAME , makeAny( aName ) ); } diff --git a/connectivity/source/drivers/postgresql/pq_xbase.hxx b/connectivity/source/drivers/postgresql/pq_xbase.hxx index 80e553325c93..e4ca16fd5e6a 100644 --- a/connectivity/source/drivers/postgresql/pq_xbase.hxx +++ b/connectivity/source/drivers/postgresql/pq_xbase.hxx @@ -36,7 +36,6 @@ #pragma once #include <cppuhelper/propshlp.hxx> -#include <cppuhelper/component.hxx> #include <cppuhelper/compbase.hxx> #include <com/sun/star/lang/XServiceInfo.hpp> @@ -66,10 +65,10 @@ protected: std::vector< css::uno::Any > m_values; public: ReflectionBase( - const OUString &implName, + OUString implName, const css::uno::Sequence< OUString > &supportedServices, const ::rtl::Reference< comphelper::RefCountedMutex >& refMutex, - const css::uno::Reference< css::sdbc::XConnection > &conn, + css::uno::Reference< css::sdbc::XConnection > conn, ConnectionSettings *pSettings, cppu::IPropertyArrayHelper & props /* must survive this object !*/ ); diff --git a/connectivity/source/drivers/postgresql/pq_xcolumn.cxx b/connectivity/source/drivers/postgresql/pq_xcolumn.cxx index 33e57a1a5445..b19d95c3c994 100644 --- a/connectivity/source/drivers/postgresql/pq_xcolumn.cxx +++ b/connectivity/source/drivers/postgresql/pq_xcolumn.cxx @@ -38,6 +38,7 @@ #include <rtl/ref.hxx> +#include "pq_statics.hxx" #include "pq_xcolumn.hxx" using com::sun::star::uno::Reference; diff --git a/connectivity/source/drivers/postgresql/pq_xcolumns.cxx b/connectivity/source/drivers/postgresql/pq_xcolumns.cxx index 82d595628db3..5d98a452bfd7 100644 --- a/connectivity/source/drivers/postgresql/pq_xcolumns.cxx +++ b/connectivity/source/drivers/postgresql/pq_xcolumns.cxx @@ -38,6 +38,7 @@ #include <string_view> +#include <o3tl/safeint.hxx> #include <o3tl/string_view.hxx> #include <rtl/ref.hxx> #include <rtl/ustrbuf.hxx> @@ -49,6 +50,7 @@ #include <com/sun/star/sdbc/ColumnValue.hpp> #include <cppuhelper/exc_hlp.hxx> +#include <utility> #include "pq_xcolumns.hxx" #include "pq_xcolumn.hxx" @@ -61,7 +63,6 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; using com::sun::star::uno::RuntimeException; @@ -75,9 +76,9 @@ using com::sun::star::sdbc::SQLException; namespace pq_sdbc_driver { -static Any isCurrency( const OUString & typeName ) +static Any isCurrency( std::u16string_view typeName ) { - return Any( typeName.equalsIgnoreAsciiCase("money") ); + return Any( o3tl::equalsIgnoreAsciiCase(typeName, u"money") ); } // static sal_Bool isAutoIncrement8( const OUString & typeName ) @@ -109,11 +110,11 @@ Columns::Columns( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName) - : Container( refMutex, origin, pSettings, "COLUMN" ), - m_schemaName( schemaName ), - m_tableName( tableName ) + OUString schemaName, + OUString tableName) + : Container( refMutex, origin, pSettings, u"COLUMN"_ustr ), + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )) {} Columns::~Columns() @@ -185,25 +186,25 @@ OUString columnMetaData2SDBCX( OUString typeName = xRow->getString( TYPE_NAME ); pBase->setPropertyValue_NoBroadcast_public( - st.NAME, makeAny( name ) ); + st.NAME, Any( name ) ); pBase->setPropertyValue_NoBroadcast_public( - st.TYPE, makeAny( xRow->getInt( DATA_TYPE ) ) ); + st.TYPE, Any( xRow->getInt( DATA_TYPE ) ) ); pBase->setPropertyValue_NoBroadcast_public( - st.TYPE_NAME, makeAny( typeName ) ); + st.TYPE_NAME, Any( typeName ) ); pBase->setPropertyValue_NoBroadcast_public( - st.PRECISION, makeAny( xRow->getInt( COLUMN_SIZE ) ) ); + st.PRECISION, Any( xRow->getInt( COLUMN_SIZE ) ) ); pBase->setPropertyValue_NoBroadcast_public( - st.SCALE, makeAny( xRow->getInt( DECIMAL_DIGITS ) ) ); + st.SCALE, Any( xRow->getInt( DECIMAL_DIGITS ) ) ); pBase->setPropertyValue_NoBroadcast_public( - st.IS_NULLABLE, makeAny( xRow->getInt( IS_NULLABLE ) ) ); + st.IS_NULLABLE, Any( xRow->getInt( IS_NULLABLE ) ) ); pBase->setPropertyValue_NoBroadcast_public( - st.DEFAULT_VALUE, makeAny( xRow->getString( DEFAULT_VALUE ) ) ); + st.DEFAULT_VALUE, Any( xRow->getString( DEFAULT_VALUE ) ) ); // pBase->setPropertyValue_NoBroadcast_public( // st.DESCRIPTION, makeAny( xRow->getString( DESCRIPTION ) ) ); @@ -213,7 +214,7 @@ OUString columnMetaData2SDBCX( // st.HELP_TEXT, makeAny( xRow->getString( DESCRIPTION ) ) ); // else // for key columns, etc. ... pBase->setPropertyValue_NoBroadcast_public( - st.DESCRIPTION, makeAny( xRow->getString( DESCRIPTION ) ) ); + st.DESCRIPTION, Any( xRow->getString( DESCRIPTION ) ) ); // maybe a better criterion than the type name can be found in future @@ -302,7 +303,6 @@ void Columns::refresh() { rtl::Reference<Column> pColumn = new Column( m_xMutex, m_origin, m_pSettings ); - Reference< css::beans::XPropertySet > prop = pColumn; OUString name = columnMetaData2SDBCX( pColumn.get(), xRow ); // pColumn->addPropertyChangeListener( @@ -316,7 +316,7 @@ void Columns::refresh() // name ) ); { - m_values.push_back( makeAny( prop ) ); + m_values.emplace_back(Reference< css::beans::XPropertySet >(pColumn)); map[ name ] = columnIndex; ++columnIndex; } @@ -381,7 +381,7 @@ void alterColumnByDescriptor( if( pastTypeName != futureTypeName ) { throw RuntimeException( - "Can't modify column types, drop the column and create a new one" ); + u"Can't modify column types, drop the column and create a new one"_ustr ); } if( pastColumnName != futureColumnName ) @@ -405,11 +405,10 @@ void alterColumnByDescriptor( bufferQuoteQualifiedIdentifier( buf, schemaName, tableName, settings ); buf.append( "ALTER COLUMN" ); bufferQuoteIdentifier( buf, futureColumnName, settings ); - buf.append( "SET DEFAULT " ); // LEM TODO: check out // default value is not quoted, caller needs to quote himself (otherwise // how to pass e.g. nextval('something' ) ???? - buf.append( futureDefaultValue ); + buf.append( "SET DEFAULT " + futureDefaultValue ); // bufferQuoteConstant( buf, defaultValue, encoding ); transaction.executeUpdate( buf.makeStringAndClear() ); } @@ -461,7 +460,7 @@ void Columns::appendByDescriptor( osl::MutexGuard guard( m_xMutex->GetMutex() ); Statics & st = getStatics(); Reference< XPropertySet > past = createDataDescriptor(); - past->setPropertyValue( st.IS_NULLABLE, makeAny( css::sdbc::ColumnValue::NULLABLE ) ); + past->setPropertyValue( st.IS_NULLABLE, Any( css::sdbc::ColumnValue::NULLABLE ) ); alterColumnByDescriptor( m_schemaName, m_tableName, m_pSettings, m_origin->createStatement() , past, future ); @@ -493,7 +492,7 @@ void Columns::appendByDescriptor( void Columns::dropByIndex( sal_Int32 index ) { osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >= static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >= m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "COLUMNS: Index out of range (allowed 0 to " @@ -546,7 +545,7 @@ ColumnDescriptors::ColumnDescriptors( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings ) - : Container( refMutex, origin, pSettings, "COLUMN-DESCRIPTOR" ) + : Container( refMutex, origin, pSettings, u"COLUMN-DESCRIPTOR"_ustr ) {} diff --git a/connectivity/source/drivers/postgresql/pq_xcolumns.hxx b/connectivity/source/drivers/postgresql/pq_xcolumns.hxx index aa91a9754218..8ff8fcfbd95c 100644 --- a/connectivity/source/drivers/postgresql/pq_xcolumns.hxx +++ b/connectivity/source/drivers/postgresql/pq_xcolumns.hxx @@ -80,8 +80,8 @@ private: const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName); + OUString schemaName, + OUString tableName); virtual ~Columns() override; diff --git a/connectivity/source/drivers/postgresql/pq_xcontainer.cxx b/connectivity/source/drivers/postgresql/pq_xcontainer.cxx index d2bcf941a68d..eec72bac8feb 100644 --- a/connectivity/source/drivers/postgresql/pq_xcontainer.cxx +++ b/connectivity/source/drivers/postgresql/pq_xcontainer.cxx @@ -36,7 +36,10 @@ #include <com/sun/star/container/ElementExistException.hpp> #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> +#include <comphelper/diagnose_ex.hxx> #include <cppuhelper/implbase.hxx> +#include <o3tl/safeint.hxx> +#include <utility> #include "pq_xcontainer.hxx" #include "pq_statics.hxx" @@ -47,7 +50,6 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::Type; using com::sun::star::uno::XInterface; using com::sun::star::uno::Reference; @@ -76,7 +78,7 @@ public: const OUString & name, const Any & newElement, const OUString & oldElement ) : - m_event( source, makeAny( name ), newElement, makeAny(oldElement) ) + m_event( source, Any( name ), newElement, Any(oldElement) ) {} virtual void fire( XEventListener * listener ) const override @@ -97,7 +99,7 @@ public: const Reference< XInterface > & source, const OUString & name, const Any & newElement ) : - m_event( source, makeAny( name ), newElement, Any() ) + m_event( source, Any( name ), newElement, Any() ) {} virtual void fire( XEventListener * listener ) const override @@ -118,7 +120,7 @@ public: RemovedBroadcaster( const Reference< XInterface > & source, const OUString & name) : - m_event( source, makeAny( name ), Any(), Any() ) + m_event( source, Any( name ), Any(), Any() ) {} virtual void fire( XEventListener * listener ) const override @@ -136,14 +138,14 @@ public: Container::Container( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, - const css::uno::Reference< css::sdbc::XConnection > & origin, + css::uno::Reference< css::sdbc::XConnection > origin, ConnectionSettings *pSettings, - const OUString &type) + OUString type) : ContainerBase( refMutex->GetMutex() ), m_xMutex( refMutex ), m_pSettings( pSettings ), - m_origin( origin ), - m_type( type ) + m_origin(std::move( origin )), + m_type(std::move( type )) { } @@ -156,7 +158,7 @@ Any Container::getByName( const OUString& aName ) "Element " + aName + " unknown in " + m_type + "-Container", *this ); } - OSL_ASSERT( ii->second >= 0 && ii->second < static_cast<int>(m_values.size()) ); + OSL_ASSERT( ii->second >= 0 && o3tl::make_unsigned(ii->second) < m_values.size() ); return m_values[ ii->second ]; } @@ -189,7 +191,7 @@ sal_Bool Container::hasElements( ) Any Container::getByIndex( sal_Int32 Index ) { - if( Index < 0 || Index >= static_cast<sal_Int32>(m_values.size()) ) + if( Index < 0 || o3tl::make_unsigned(Index) >= m_values.size() ) { throw IndexOutOfBoundsException( "Index " + OUString::number( Index ) @@ -236,7 +238,7 @@ css::uno::Any ContainerEnumeration::nextElement() if( ! hasMoreElements() ) { throw NoSuchElementException( - "NoSuchElementException during enumeration", *this ); + u"NoSuchElementException during enumeration"_ustr, *this ); } m_index ++; return m_vec[m_index]; @@ -299,7 +301,7 @@ void Container::dropByName( const OUString& elementName ) void Container::dropByIndex( sal_Int32 index ) { osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >=static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >=m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "Index out of range (allowed 0 to " @@ -350,10 +352,10 @@ void Container::append( } int index = m_values.size(); - m_values.push_back( makeAny( descriptor ) ); + m_values.emplace_back(descriptor); m_name2index[name] = index; - fire( InsertedBroadcaster( *this, name, makeAny( descriptor ) ) ); + fire( InsertedBroadcaster( *this, name, Any( descriptor ) ) ); } void Container::appendByDescriptor( @@ -391,13 +393,13 @@ void Container::fire( const EventBroadcastHelper &helper ) } catch ( css::uno::RuntimeException & ) { - OSL_ENSURE( false, "exception caught" ); + TOOLS_WARN_EXCEPTION( "connectivity.postgresql", "exception caught" ); // loose coupling, a runtime exception shall not break anything // TODO: log away as warning ! } catch( css::uno::Exception & ) { - OSL_ENSURE( false, "exception from listener flying through" ); + TOOLS_WARN_EXCEPTION( "connectivity.postgresql", "exception from listener flying through" ); throw; } } diff --git a/connectivity/source/drivers/postgresql/pq_xcontainer.hxx b/connectivity/source/drivers/postgresql/pq_xcontainer.hxx index 1e17fef28db5..4b6c190b0a59 100644 --- a/connectivity/source/drivers/postgresql/pq_xcontainer.hxx +++ b/connectivity/source/drivers/postgresql/pq_xcontainer.hxx @@ -53,8 +53,6 @@ #include <unordered_map> -#include "pq_statics.hxx" - namespace pq_sdbc_driver { @@ -119,9 +117,9 @@ protected: public: Container( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, - const css::uno::Reference< css::sdbc::XConnection > & origin, + css::uno::Reference< css::sdbc::XConnection > origin, ConnectionSettings *pSettings, - const OUString & type // for exception messages + OUString type // for exception messages ); public: // XIndexAccess diff --git a/connectivity/source/drivers/postgresql/pq_xindex.cxx b/connectivity/source/drivers/postgresql/pq_xindex.cxx index 5a96eeeb119d..4753b5fd4e3c 100644 --- a/connectivity/source/drivers/postgresql/pq_xindex.cxx +++ b/connectivity/source/drivers/postgresql/pq_xindex.cxx @@ -37,6 +37,7 @@ #include <cppuhelper/typeprovider.hxx> #include <cppuhelper/queryinterface.hxx> #include <rtl/ref.hxx> +#include <utility> #include "pq_xindex.hxx" #include "pq_xindexcolumns.hxx" @@ -58,8 +59,8 @@ namespace pq_sdbc_driver Index::Index( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const Reference< css::sdbc::XConnection > & connection, ConnectionSettings *pSettings, - const OUString & schemaName, - const OUString & tableName ) + OUString schemaName, + OUString tableName ) : ReflectionBase( getStatics().refl.index.implName, getStatics().refl.index.serviceNames, @@ -67,8 +68,8 @@ Index::Index( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, connection, pSettings, * getStatics().refl.index.pProps ), - m_schemaName( schemaName ), - m_tableName( tableName ) + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )) {} Reference< XPropertySet > Index::createDataDescriptor( ) diff --git a/connectivity/source/drivers/postgresql/pq_xindex.hxx b/connectivity/source/drivers/postgresql/pq_xindex.hxx index 46275ad3aafa..8ccf45660467 100644 --- a/connectivity/source/drivers/postgresql/pq_xindex.hxx +++ b/connectivity/source/drivers/postgresql/pq_xindex.hxx @@ -61,8 +61,8 @@ public: Index( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & connection, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName); + OUString schemaName, + OUString tableName); public: // XInterface virtual void SAL_CALL acquire() noexcept override { ReflectionBase::acquire(); } diff --git a/connectivity/source/drivers/postgresql/pq_xindexcolumn.cxx b/connectivity/source/drivers/postgresql/pq_xindexcolumn.cxx index 58cae851f441..fe72059bc15a 100644 --- a/connectivity/source/drivers/postgresql/pq_xindexcolumn.cxx +++ b/connectivity/source/drivers/postgresql/pq_xindexcolumn.cxx @@ -38,6 +38,7 @@ #include <rtl/ref.hxx> +#include "pq_statics.hxx" #include "pq_xindexcolumn.hxx" using com::sun::star::uno::Reference; diff --git a/connectivity/source/drivers/postgresql/pq_xindexcolumns.cxx b/connectivity/source/drivers/postgresql/pq_xindexcolumns.cxx index 1e0039ecc6e1..eb004b565c3e 100644 --- a/connectivity/source/drivers/postgresql/pq_xindexcolumns.cxx +++ b/connectivity/source/drivers/postgresql/pq_xindexcolumns.cxx @@ -37,6 +37,7 @@ #include <sal/log.hxx> #include <string_view> +#include <utility> #include <vector> #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp> @@ -56,7 +57,6 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; using com::sun::star::uno::Sequence; @@ -73,14 +73,14 @@ IndexColumns::IndexColumns( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName, - const OUString &indexName, + OUString schemaName, + OUString tableName, + OUString indexName, const css::uno::Sequence< OUString > &columns ) - : Container( refMutex, origin, pSettings, "INDEX_COLUMN" ), - m_schemaName( schemaName ), - m_tableName( tableName ), - m_indexName( indexName ), + : Container( refMutex, origin, pSettings, u"INDEX_COLUMN"_ustr ), + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )), + m_indexName(std::move( indexName )), m_columns( columns ) {} @@ -127,13 +127,12 @@ void IndexColumns::refresh() rtl::Reference<IndexColumn> pIndexColumn = new IndexColumn( m_xMutex, m_origin, m_pSettings ); - Reference< css::beans::XPropertySet > prop = pIndexColumn; columnMetaData2SDBCX( pIndexColumn.get(), xRow ); pIndexColumn->setPropertyValue_NoBroadcast_public( - st.IS_ASCENDING , makeAny( false ) ); + st.IS_ASCENDING , Any( false ) ); - m_values[ index ] <<= prop; + m_values[ index ] <<= Reference< css::beans::XPropertySet >(pIndexColumn); m_name2index[ columnName ] = index; } } @@ -152,7 +151,7 @@ void IndexColumns::appendByDescriptor( const css::uno::Reference< css::beans::XPropertySet >& /*future*/ ) { throw css::sdbc::SQLException( - "SDBC-POSTGRESQL: IndexesColumns.appendByDescriptor not yet implemented", + u"SDBC-POSTGRESQL: IndexesColumns.appendByDescriptor not yet implemented"_ustr, *this, OUString(), 1, Any() ); // osl::MutexGuard guard( m_xMutex->GetMutex() ); // Statics & st = getStatics(); @@ -166,7 +165,7 @@ void IndexColumns::appendByDescriptor( void IndexColumns::dropByName( const OUString& ) { throw css::sdbc::SQLException( - "SDBC-POSTGRESQL: IndexesColumns.dropByName not yet implemented", + u"SDBC-POSTGRESQL: IndexesColumns.dropByName not yet implemented"_ustr, *this, OUString(), 1, Any() ); // String2IntMap::const_iterator ii = m_name2index.find( elementName ); // if( ii == m_name2index.end() ) @@ -188,7 +187,7 @@ void IndexColumns::dropByName( const OUString& ) void IndexColumns::dropByIndex( sal_Int32 ) { throw css::sdbc::SQLException( - "SDBC-POSTGRESQL: IndexesColumns.dropByIndex not yet implemented", + u"SDBC-POSTGRESQL: IndexesColumns.dropByIndex not yet implemented"_ustr, *this, OUString(), 1, Any() ); // osl::MutexGuard guard( m_xMutex->GetMutex() ); // if( index < 0 || index >= m_values.getLength() ) diff --git a/connectivity/source/drivers/postgresql/pq_xindexcolumns.hxx b/connectivity/source/drivers/postgresql/pq_xindexcolumns.hxx index eaaa709e671a..a838d5d66908 100644 --- a/connectivity/source/drivers/postgresql/pq_xindexcolumns.hxx +++ b/connectivity/source/drivers/postgresql/pq_xindexcolumns.hxx @@ -63,9 +63,9 @@ private: const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName, - const OUString &indexName, + OUString schemaName, + OUString tableName, + OUString indexName, const css::uno::Sequence< OUString > &columns ); virtual ~IndexColumns() override; diff --git a/connectivity/source/drivers/postgresql/pq_xindexes.cxx b/connectivity/source/drivers/postgresql/pq_xindexes.cxx index 332a9a9e5311..c74929eab2fa 100644 --- a/connectivity/source/drivers/postgresql/pq_xindexes.cxx +++ b/connectivity/source/drivers/postgresql/pq_xindexes.cxx @@ -43,6 +43,8 @@ #include <com/sun/star/sdbc/XRow.hpp> #include <com/sun/star/sdbc/XParameters.hpp> #include <cppuhelper/exc_hlp.hxx> +#include <o3tl/safeint.hxx> +#include <utility> #include "pq_xindexes.hxx" #include "pq_xindex.hxx" @@ -55,7 +57,6 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; using com::sun::star::uno::Sequence; @@ -78,11 +79,11 @@ Indexes::Indexes( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName) + OUString schemaName, + OUString tableName) : Container( refMutex, origin, pSettings, getStatics().KEY ), - m_schemaName( schemaName ), - m_tableName( tableName ) + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )) { } @@ -103,7 +104,7 @@ void Indexes::refresh() // see XDatabaseMetaData::getIndexInfo() Reference< XPreparedStatement > stmt = m_origin->prepareStatement( - "SELECT nspname, " // 1 + u"SELECT nspname, " // 1 "pg_class.relname, " // 2 "class2.relname, " // 3 "indisclustered, " // 4 @@ -113,7 +114,7 @@ void Indexes::refresh() "FROM pg_index INNER JOIN pg_class ON indrelid = pg_class.oid " "INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid " "INNER JOIN pg_class as class2 ON pg_index.indexrelid = class2.oid " - "WHERE nspname = ? AND pg_class.relname = ?" ); + "WHERE nspname = ? AND pg_class.relname = ?"_ustr ); Reference< XParameters > params( stmt, UNO_QUERY); params->setString( 1, m_schemaName ); @@ -141,7 +142,6 @@ void Indexes::refresh() bool isUnique = row->getBoolean( C_IS_UNIQUE ); bool isPrimary = row->getBoolean( C_IS_PRIMARY ); bool isClusterd = row->getBoolean( C_IS_CLUSTERED ); - Reference< css::beans::XPropertySet > prop = pIndex; pIndex->setPropertyValue_NoBroadcast_public( st.IS_UNIQUE, Any( isUnique ) ); pIndex->setPropertyValue_NoBroadcast_public( @@ -149,7 +149,7 @@ void Indexes::refresh() pIndex->setPropertyValue_NoBroadcast_public( st.IS_CLUSTERED, Any( isClusterd ) ); pIndex->setPropertyValue_NoBroadcast_public( - st.NAME, makeAny( currentIndexName ) ); + st.NAME, Any( currentIndexName ) ); std::vector< sal_Int32 > seq = parseIntArray( row->getString( C_COLUMNS ) ); Sequence< OUString > columnNames(seq.size()); @@ -160,10 +160,10 @@ void Indexes::refresh() } pIndex->setPropertyValue_NoBroadcast_public( - st.PRIVATE_COLUMN_INDEXES, makeAny( columnNames )); + st.PRIVATE_COLUMN_INDEXES, Any( columnNames )); { - m_values.push_back( makeAny( prop ) ); + m_values.emplace_back(Reference< css::beans::XPropertySet >(pIndex)); map[ currentIndexName ] = index; ++index; } @@ -235,7 +235,7 @@ void Indexes::dropByIndex( sal_Int32 index ) osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >= static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >= m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "Indexes: Index out of range (allowed 0 to " diff --git a/connectivity/source/drivers/postgresql/pq_xindexes.hxx b/connectivity/source/drivers/postgresql/pq_xindexes.hxx index c2e81f61751f..536d17b96198 100644 --- a/connectivity/source/drivers/postgresql/pq_xindexes.hxx +++ b/connectivity/source/drivers/postgresql/pq_xindexes.hxx @@ -58,8 +58,8 @@ private: const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName); + OUString schemaName, + OUString tableName); virtual ~Indexes() override; diff --git a/connectivity/source/drivers/postgresql/pq_xkey.cxx b/connectivity/source/drivers/postgresql/pq_xkey.cxx index e2777824568f..81d1f7a86eb6 100644 --- a/connectivity/source/drivers/postgresql/pq_xkey.cxx +++ b/connectivity/source/drivers/postgresql/pq_xkey.cxx @@ -37,6 +37,7 @@ #include <cppuhelper/typeprovider.hxx> #include <cppuhelper/queryinterface.hxx> #include <rtl/ref.hxx> +#include <utility> #include "pq_xkey.hxx" #include "pq_xkeycolumns.hxx" @@ -57,8 +58,8 @@ namespace pq_sdbc_driver Key::Key( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const Reference< css::sdbc::XConnection > & connection, ConnectionSettings *pSettings, - const OUString & schemaName, - const OUString & tableName ) + OUString schemaName, + OUString tableName ) : ReflectionBase( getStatics().refl.key.implName, getStatics().refl.key.serviceNames, @@ -66,8 +67,8 @@ Key::Key( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, connection, pSettings, * getStatics().refl.key.pProps ), - m_schemaName( schemaName ), - m_tableName( tableName ) + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )) {} Reference< XPropertySet > Key::createDataDescriptor( ) diff --git a/connectivity/source/drivers/postgresql/pq_xkey.hxx b/connectivity/source/drivers/postgresql/pq_xkey.hxx index d231e1e89945..d162fde24270 100644 --- a/connectivity/source/drivers/postgresql/pq_xkey.hxx +++ b/connectivity/source/drivers/postgresql/pq_xkey.hxx @@ -48,6 +48,7 @@ namespace pq_sdbc_driver { +class KeyColumnDescriptors; class Key : public ReflectionBase, public css::sdbcx::XColumnsSupplier @@ -61,8 +62,8 @@ public: Key( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & connection, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName); + OUString schemaName, + OUString tableName); public: // XInterface virtual void SAL_CALL acquire() noexcept override { ReflectionBase::acquire(); } @@ -87,7 +88,7 @@ public: // XDataDescriptorFactory class KeyDescriptor : public ReflectionBase, public css::sdbcx::XColumnsSupplier { - css::uno::Reference< css::container::XNameAccess > m_keyColumns; + rtl::Reference<KeyColumnDescriptors> m_keyColumns; public: KeyDescriptor( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, diff --git a/connectivity/source/drivers/postgresql/pq_xkeycolumn.cxx b/connectivity/source/drivers/postgresql/pq_xkeycolumn.cxx index 10c3dbb474cd..30eef179716c 100644 --- a/connectivity/source/drivers/postgresql/pq_xkeycolumn.cxx +++ b/connectivity/source/drivers/postgresql/pq_xkeycolumn.cxx @@ -38,6 +38,7 @@ #include <rtl/ref.hxx> +#include "pq_statics.hxx" #include "pq_xkeycolumn.hxx" using com::sun::star::uno::Reference; diff --git a/connectivity/source/drivers/postgresql/pq_xkeycolumns.cxx b/connectivity/source/drivers/postgresql/pq_xkeycolumns.cxx index 6dcbe07d4117..e53e84605aa8 100644 --- a/connectivity/source/drivers/postgresql/pq_xkeycolumns.cxx +++ b/connectivity/source/drivers/postgresql/pq_xkeycolumns.cxx @@ -40,6 +40,7 @@ #include <com/sun/star/sdbc/XRow.hpp> #include <cppuhelper/exc_hlp.hxx> #include <rtl/ref.hxx> +#include <utility> #include "pq_xcolumns.hxx" #include "pq_xkeycolumns.hxx" @@ -52,7 +53,6 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; using com::sun::star::uno::Sequence; @@ -69,13 +69,13 @@ KeyColumns::KeyColumns( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName, + OUString schemaName, + OUString tableName, const Sequence< OUString > &columnNames, const Sequence< OUString > &foreignColumnNames ) - : Container( refMutex, origin, pSettings, "KEY_COLUMN" ), - m_schemaName( schemaName ), - m_tableName( tableName ), + : Container( refMutex, origin, pSettings, u"KEY_COLUMN"_ustr ), + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )), m_columnNames( columnNames ), m_foreignColumnNames( foreignColumnNames ) {} @@ -120,17 +120,16 @@ void KeyColumns::refresh() rtl::Reference<KeyColumn> pKeyColumn = new KeyColumn( m_xMutex, m_origin, m_pSettings ); - Reference< css::beans::XPropertySet > prop = pKeyColumn; OUString name = columnMetaData2SDBCX( pKeyColumn.get(), xRow ); if( keyindex < m_foreignColumnNames.getLength() ) { pKeyColumn->setPropertyValue_NoBroadcast_public( - st.RELATED_COLUMN, makeAny( m_foreignColumnNames[keyindex]) ); + st.RELATED_COLUMN, Any( m_foreignColumnNames[keyindex]) ); } { - m_values.push_back( makeAny( prop ) ); + m_values.emplace_back(Reference< css::beans::XPropertySet >(pKeyColumn)); map[ name ] = columnIndex; ++columnIndex; } @@ -152,7 +151,7 @@ void KeyColumns::appendByDescriptor( const css::uno::Reference< css::beans::XPropertySet >& ) { throw css::sdbc::SQLException( - "KeyColumns::appendByDescriptor not implemented yet", + u"KeyColumns::appendByDescriptor not implemented yet"_ustr, *this, OUString(), 1, Any() ); // osl::MutexGuard guard( m_xMutex->GetMutex() ); @@ -168,7 +167,7 @@ void KeyColumns::appendByDescriptor( void KeyColumns::dropByIndex( sal_Int32 ) { throw css::sdbc::SQLException( - "KeyColumns::dropByIndex not implemented yet", + u"KeyColumns::dropByIndex not implemented yet"_ustr, *this, OUString(), 1, Any() ); // osl::MutexGuard guard( m_xMutex->GetMutex() ); // if( index < 0 || index >= m_values.getLength() ) @@ -227,7 +226,7 @@ KeyColumnDescriptors::KeyColumnDescriptors( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings ) - : Container( refMutex, origin, pSettings, "KEY_COLUMN" ) + : Container( refMutex, origin, pSettings, u"KEY_COLUMN"_ustr ) {} Reference< css::beans::XPropertySet > KeyColumnDescriptors::createDataDescriptor() diff --git a/connectivity/source/drivers/postgresql/pq_xkeycolumns.hxx b/connectivity/source/drivers/postgresql/pq_xkeycolumns.hxx index 0c56fd189e9a..60bbd0c0de36 100644 --- a/connectivity/source/drivers/postgresql/pq_xkeycolumns.hxx +++ b/connectivity/source/drivers/postgresql/pq_xkeycolumns.hxx @@ -63,8 +63,8 @@ private: const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName, + OUString schemaName, + OUString tableName, const css::uno::Sequence< OUString > &keyColumns, const css::uno::Sequence< OUString > &foreignColumnNames); diff --git a/connectivity/source/drivers/postgresql/pq_xkeys.cxx b/connectivity/source/drivers/postgresql/pq_xkeys.cxx index 84507202fa9a..5dde7d22fdf5 100644 --- a/connectivity/source/drivers/postgresql/pq_xkeys.cxx +++ b/connectivity/source/drivers/postgresql/pq_xkeys.cxx @@ -49,6 +49,8 @@ #include <com/sun/star/sdbc/KeyRule.hpp> #include <com/sun/star/sdbcx/KeyType.hpp> #include <cppuhelper/exc_hlp.hxx> +#include <o3tl/safeint.hxx> +#include <utility> #include "pq_xkeys.hxx" #include "pq_xkey.hxx" @@ -60,7 +62,7 @@ using osl::MutexGuard; using css::beans::XPropertySet; -using com::sun::star::uno::makeAny; +using com::sun::star::uno::Any; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; @@ -78,11 +80,11 @@ Keys::Keys( const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName) + OUString schemaName, + OUString tableName) : Container( refMutex, origin, pSettings, getStatics().KEY ), - m_schemaName( schemaName ), - m_tableName( tableName ) + m_schemaName(std::move( schemaName )), + m_tableName(std::move( tableName )) {} Keys::~Keys() @@ -125,7 +127,7 @@ void Keys::refresh() fillAttnum2attnameMap( mainMap, m_origin, m_schemaName, m_tableName ); Reference< XPreparedStatement > stmt = m_origin->prepareStatement( - "SELECT conname, " // 1 + u"SELECT conname, " // 1 "contype, " // 2 "confupdtype, " // 3 "confdeltype, " // 4 @@ -137,7 +139,7 @@ void Keys::refresh() "INNER JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid " "LEFT JOIN pg_class AS class2 ON confrelid = class2.oid " "LEFT JOIN pg_namespace AS nmsp2 ON class2.relnamespace=nmsp2.oid " - "WHERE pg_class.relname = ? AND pg_namespace.nspname = ?" ); + "WHERE pg_class.relname = ? AND pg_namespace.nspname = ?"_ustr ); Reference< XParameters > paras( stmt, UNO_QUERY ); paras->setString( 1 , m_tableName ); @@ -153,19 +155,18 @@ void Keys::refresh() { rtl::Reference<Key> pKey = new Key( m_xMutex, m_origin, m_pSettings , m_schemaName, m_tableName ); - Reference< css::beans::XPropertySet > prop = pKey; pKey->setPropertyValue_NoBroadcast_public( - st.NAME, makeAny( xRow->getString( 1 ) ) ); + st.NAME, Any( xRow->getString( 1 ) ) ); sal_Int32 keyType = string2keytype( xRow->getString(2) ); - pKey->setPropertyValue_NoBroadcast_public( st.TYPE, makeAny( keyType ) ); + pKey->setPropertyValue_NoBroadcast_public( st.TYPE, Any( keyType ) ); pKey->setPropertyValue_NoBroadcast_public( - st.UPDATE_RULE, makeAny( string2keyrule( xRow->getString(3) ) ) ); + st.UPDATE_RULE, Any( string2keyrule( xRow->getString(3) ) ) ); pKey->setPropertyValue_NoBroadcast_public( - st.DELETE_RULE, makeAny( string2keyrule( xRow->getString(4) ) ) ); + st.DELETE_RULE, Any( string2keyrule( xRow->getString(4) ) ) ); pKey->setPropertyValue_NoBroadcast_public( st.PRIVATE_COLUMNS, - makeAny( + Any( convertMappedIntArray2StringArray( mainMap, string2intarray( xRow->getString( 7 ) ) ) ) ); @@ -174,13 +175,13 @@ void Keys::refresh() { OUString buf = xRow->getString( 6 ) + "." + xRow->getString( 5 ); pKey->setPropertyValue_NoBroadcast_public( - st.REFERENCED_TABLE, makeAny( buf ) ); + st.REFERENCED_TABLE, Any( buf ) ); Int2StringMap foreignMap; fillAttnum2attnameMap( foreignMap, m_origin, xRow->getString(6), xRow->getString(5)); pKey->setPropertyValue_NoBroadcast_public( st.PRIVATE_FOREIGN_COLUMNS, - makeAny( + Any( convertMappedIntArray2StringArray( foreignMap, string2intarray( xRow->getString(8) ) ) ) ); @@ -189,7 +190,7 @@ void Keys::refresh() { map[ xRow->getString( 1 ) ] = keyIndex; - m_values.push_back( makeAny( prop ) ); + m_values.push_back( Any( Reference< css::beans::XPropertySet >(pKey) ) ); ++keyIndex; } } @@ -226,7 +227,7 @@ void Keys::appendByDescriptor( void Keys::dropByIndex( sal_Int32 index ) { osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >= static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >= m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "TABLES: Index out of range (allowed 0 to " + OUString::number(m_values.size() -1) diff --git a/connectivity/source/drivers/postgresql/pq_xkeys.hxx b/connectivity/source/drivers/postgresql/pq_xkeys.hxx index fe1afef35a4b..ef6376d4d780 100644 --- a/connectivity/source/drivers/postgresql/pq_xkeys.hxx +++ b/connectivity/source/drivers/postgresql/pq_xkeys.hxx @@ -58,8 +58,8 @@ private: const ::rtl::Reference< comphelper::RefCountedMutex > & refMutex, const css::uno::Reference< css::sdbc::XConnection > & origin, ConnectionSettings *pSettings, - const OUString &schemaName, - const OUString &tableName); + OUString schemaName, + OUString tableName); virtual ~Keys() override; diff --git a/connectivity/source/drivers/postgresql/pq_xtable.cxx b/connectivity/source/drivers/postgresql/pq_xtable.cxx index 9ac52f1df0ff..de8196f9fecd 100644 --- a/connectivity/source/drivers/postgresql/pq_xtable.cxx +++ b/connectivity/source/drivers/postgresql/pq_xtable.cxx @@ -60,7 +60,6 @@ using com::sun::star::uno::Reference; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Sequence; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::Type; using com::sun::star::beans::XPropertySet; @@ -168,7 +167,7 @@ void Table::rename( const OUString& newName ) if( Xrename.is() ) { Xrename->rename( newName ); - setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME, makeAny(newSchemaName) ); + setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME, Any(newSchemaName) ); } } else @@ -185,14 +184,13 @@ void Table::rename( const OUString& newName ) bufferQuoteIdentifier( buf, newSchemaName, m_pSettings ); Reference< XStatement > statement = m_conn->createStatement(); statement->executeUpdate( buf.makeStringAndClear() ); - setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME, makeAny(newSchemaName) ); + setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME, Any(newSchemaName) ); disposeNoThrow( statement ); schema = newSchemaName; } catch( css::sdbc::SQLException &e ) { - OUString buf( e.Message + "(NOTE: Only postgresql server >= V8.1 support changing a table's schema)" ); - e.Message = buf; + e.Message += "(NOTE: Only postgresql server >= V8.1 support changing a table's schema)"; throw; } @@ -209,7 +207,7 @@ void Table::rename( const OUString& newName ) disposeNoThrow( statement ); } } - setPropertyValue_NoBroadcast_public( st.NAME, makeAny(newTableName) ); + setPropertyValue_NoBroadcast_public( st.NAME, Any(newTableName) ); // inform the container of the name change ! if( m_pSettings->tables.is() ) { diff --git a/connectivity/source/drivers/postgresql/pq_xtable.hxx b/connectivity/source/drivers/postgresql/pq_xtable.hxx index dc1577612db8..178bc9d04888 100644 --- a/connectivity/source/drivers/postgresql/pq_xtable.hxx +++ b/connectivity/source/drivers/postgresql/pq_xtable.hxx @@ -36,25 +36,18 @@ #pragma once -#include <cppuhelper/component.hxx> -#include <cppuhelper/propshlp.hxx> - -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> #include <com/sun/star/sdbcx/XIndexesSupplier.hpp> #include <com/sun/star/sdbcx/XKeysSupplier.hpp> #include <com/sun/star/sdbcx/XRename.hpp> #include <com/sun/star/sdbcx/XAlterTable.hpp> -#include <com/sun/star/container/XNamed.hpp> #include "pq_xbase.hxx" +#include "pq_xcolumns.hxx" namespace pq_sdbc_driver { -class Columns; - class Table : public ReflectionBase, public css::sdbcx::XColumnsSupplier, public css::sdbcx::XIndexesSupplier, @@ -122,7 +115,7 @@ class TableDescriptor public css::sdbcx::XIndexesSupplier, public css::sdbcx::XKeysSupplier { - css::uno::Reference< css::container::XNameAccess > m_columns; + rtl::Reference<ColumnDescriptors> m_columns; css::uno::Reference< css::container::XIndexAccess > m_keys; css::uno::Reference< css::container::XNameAccess > m_indexes; diff --git a/connectivity/source/drivers/postgresql/pq_xtables.cxx b/connectivity/source/drivers/postgresql/pq_xtables.cxx index 47606669dd40..6b5214bf9596 100644 --- a/connectivity/source/drivers/postgresql/pq_xtables.cxx +++ b/connectivity/source/drivers/postgresql/pq_xtables.cxx @@ -43,6 +43,7 @@ #include <com/sun/star/sdbcx/Privilege.hpp> #include <com/sun/star/sdbc/DataType.hpp> #include <cppuhelper/exc_hlp.hxx> +#include <o3tl/safeint.hxx> #include "pq_xtables.hxx" #include "pq_xviews.hxx" @@ -55,7 +56,6 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; using com::sun::star::uno::Sequence; @@ -106,21 +106,20 @@ void Tables::refresh() // instead offer a factory interface rtl::Reference<Table> pTable = new Table( m_xMutex, m_origin, m_pSettings ); - Reference< css::beans::XPropertySet > prop = pTable; OUString name = xRow->getString( TABLE_INDEX_NAME+1); OUString schema = xRow->getString( TABLE_INDEX_SCHEMA+1); pTable->setPropertyValue_NoBroadcast_public( - st.CATALOG_NAME , makeAny(xRow->getString( TABLE_INDEX_CATALOG+1) ) ); - pTable->setPropertyValue_NoBroadcast_public( st.NAME , makeAny( name ) ); - pTable->setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME , makeAny( schema )); + st.CATALOG_NAME , Any(xRow->getString( TABLE_INDEX_CATALOG+1) ) ); + pTable->setPropertyValue_NoBroadcast_public( st.NAME , Any( name ) ); + pTable->setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME , Any( schema )); pTable->setPropertyValue_NoBroadcast_public( - st.TYPE , makeAny( xRow->getString( TABLE_INDEX_TYPE+1) ) ); + st.TYPE , Any( xRow->getString( TABLE_INDEX_TYPE+1) ) ); pTable->setPropertyValue_NoBroadcast_public( - st.DESCRIPTION , makeAny( xRow->getString( TABLE_INDEX_REMARKS+1) ) ); + st.DESCRIPTION , Any( xRow->getString( TABLE_INDEX_REMARKS+1) ) ); pTable->setPropertyValue_NoBroadcast_public( st.PRIVILEGES , - makeAny( sal_Int32( css::sdbcx::Privilege::SELECT | + Any( sal_Int32( css::sdbcx::Privilege::SELECT | css::sdbcx::Privilege::INSERT | css::sdbcx::Privilege::UPDATE | css::sdbcx::Privilege::DELETE | @@ -131,7 +130,7 @@ void Tables::refresh() css::sdbcx::Privilege::DROP ) ) ); { - m_values.push_back( makeAny( prop ) ); + m_values.push_back( Any( Reference< css::beans::XPropertySet >(pTable) ) ); map[ schema + "." + name ] = tableIndex; ++tableIndex; } @@ -311,7 +310,7 @@ void Tables::appendByDescriptor( void Tables::dropByIndex( sal_Int32 index ) { osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >= static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >= m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "TABLES: Index out of range (allowed 0 to " + OUString::number(m_values.size() -1) diff --git a/connectivity/source/drivers/postgresql/pq_xuser.cxx b/connectivity/source/drivers/postgresql/pq_xuser.cxx index 4d0a01f6366f..2165c7e3d528 100644 --- a/connectivity/source/drivers/postgresql/pq_xuser.cxx +++ b/connectivity/source/drivers/postgresql/pq_xuser.cxx @@ -134,13 +134,13 @@ sal_Int32 User::getGrantablePrivileges( const OUString&, sal_Int32 ) void User::grantPrivileges( const OUString&, sal_Int32, sal_Int32 ) { - throw css::sdbc::SQLException("pq_driver: privilege change not implemented yet", + throw css::sdbc::SQLException(u"pq_driver: privilege change not implemented yet"_ustr, *this, OUString(), 1, Any() ); } void User::revokePrivileges( const OUString&, sal_Int32, sal_Int32 ) { - throw css::sdbc::SQLException("pq_driver: privilege change not implemented yet", + throw css::sdbc::SQLException(u"pq_driver: privilege change not implemented yet"_ustr, *this, OUString(), 1, Any() ); } diff --git a/connectivity/source/drivers/postgresql/pq_xuser.hxx b/connectivity/source/drivers/postgresql/pq_xuser.hxx index 8072cae415bb..702787a67496 100644 --- a/connectivity/source/drivers/postgresql/pq_xuser.hxx +++ b/connectivity/source/drivers/postgresql/pq_xuser.hxx @@ -36,11 +36,6 @@ #pragma once -#include <cppuhelper/component.hxx> -#include <cppuhelper/propshlp.hxx> - -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> #include <com/sun/star/sdbcx/XUser.hpp> #include "pq_xbase.hxx" diff --git a/connectivity/source/drivers/postgresql/pq_xusers.cxx b/connectivity/source/drivers/postgresql/pq_xusers.cxx index bc8b62b1d5b4..5a80ee8727ab 100644 --- a/connectivity/source/drivers/postgresql/pq_xusers.cxx +++ b/connectivity/source/drivers/postgresql/pq_xusers.cxx @@ -41,6 +41,7 @@ #include <com/sun/star/sdbc/SQLException.hpp> #include <com/sun/star/sdbc/XRow.hpp> #include <cppuhelper/exc_hlp.hxx> +#include <o3tl/safeint.hxx> #include "pq_xusers.hxx" #include "pq_xuser.hxx" @@ -51,7 +52,7 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; -using com::sun::star::uno::makeAny; +using com::sun::star::uno::Any; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; @@ -82,7 +83,7 @@ void Users::refresh() Reference< XStatement > stmt = m_origin->createStatement(); - Reference< XResultSet > rs = stmt->executeQuery( "SELECT usename FROM pg_shadow" ); + Reference< XResultSet > rs = stmt->executeQuery( u"SELECT usename FROM pg_shadow"_ustr ); Reference< XRow > xRow( rs , UNO_QUERY ); @@ -94,14 +95,13 @@ void Users::refresh() { rtl::Reference<User> pUser = new User( m_xMutex, m_origin, m_pSettings ); - Reference< css::beans::XPropertySet > prop = pUser; OUString name = xRow->getString( 1); pUser->setPropertyValue_NoBroadcast_public( - st.NAME , makeAny(xRow->getString( TABLE_INDEX_CATALOG+1) ) ); + st.NAME , Any(xRow->getString( TABLE_INDEX_CATALOG+1) ) ); { - m_values.push_back( makeAny( prop ) ); + m_values.push_back( Any( Reference< css::beans::XPropertySet >(pUser) ) ); map[ name ] = tableIndex; ++tableIndex; } @@ -151,7 +151,7 @@ void Users::dropByIndex( sal_Int32 index ) { osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >= static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >= m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "USERS: Index out of range (allowed 0 to " diff --git a/connectivity/source/drivers/postgresql/pq_xview.cxx b/connectivity/source/drivers/postgresql/pq_xview.cxx index 3652cdee634f..c2e936e9a314 100644 --- a/connectivity/source/drivers/postgresql/pq_xview.cxx +++ b/connectivity/source/drivers/postgresql/pq_xview.cxx @@ -52,7 +52,6 @@ using osl::MutexGuard; using com::sun::star::uno::Reference; using com::sun::star::uno::Sequence; using com::sun::star::uno::Any; -using com::sun::star::uno::makeAny; using com::sun::star::uno::Type; using com::sun::star::beans::XPropertySet; @@ -121,14 +120,13 @@ void View::rename( const OUString& newName ) bufferQuoteIdentifier( buf, newSchemaName, m_pSettings ); Reference< XStatement > statement = m_conn->createStatement(); statement->executeUpdate( buf.makeStringAndClear() ); - setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME, makeAny(newSchemaName) ); + setPropertyValue_NoBroadcast_public( st.SCHEMA_NAME, Any(newSchemaName) ); disposeNoThrow( statement ); schema = newSchemaName; } catch( css::sdbc::SQLException &e ) { - OUString buf( e.Message + "(NOTE: Only postgresql server >= V8.1 support changing a table's schema)" ); - e.Message = buf; + e.Message += "(NOTE: Only postgresql server >= V8.1 support changing a table's schema)"; throw; } @@ -142,7 +140,7 @@ void View::rename( const OUString& newName ) bufferQuoteIdentifier( buf, newTableName, m_pSettings ); Reference< XStatement > statement = m_conn->createStatement(); statement->executeUpdate( buf.makeStringAndClear() ); - setPropertyValue_NoBroadcast_public( st.NAME, makeAny(newTableName) ); + setPropertyValue_NoBroadcast_public( st.NAME, Any(newTableName) ); } // inform the container of the name change ! diff --git a/connectivity/source/drivers/postgresql/pq_xview.hxx b/connectivity/source/drivers/postgresql/pq_xview.hxx index 055fd921864f..f68b5535a8d7 100644 --- a/connectivity/source/drivers/postgresql/pq_xview.hxx +++ b/connectivity/source/drivers/postgresql/pq_xview.hxx @@ -36,13 +36,7 @@ #pragma once -#include <cppuhelper/component.hxx> -#include <cppuhelper/propshlp.hxx> - -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> #include <com/sun/star/sdbcx/XRename.hpp> -#include <com/sun/star/container/XNamed.hpp> #include "pq_xbase.hxx" diff --git a/connectivity/source/drivers/postgresql/pq_xviews.cxx b/connectivity/source/drivers/postgresql/pq_xviews.cxx index d71219fa6420..9d0d875510ad 100644 --- a/connectivity/source/drivers/postgresql/pq_xviews.cxx +++ b/connectivity/source/drivers/postgresql/pq_xviews.cxx @@ -41,6 +41,7 @@ #include <com/sun/star/sdbc/SQLException.hpp> #include <com/sun/star/sdbc/XRow.hpp> #include <cppuhelper/exc_hlp.hxx> +#include <o3tl/safeint.hxx> #include "pq_xviews.hxx" #include "pq_xview.hxx" @@ -52,7 +53,7 @@ using osl::MutexGuard; using com::sun::star::beans::XPropertySet; -using com::sun::star::uno::makeAny; +using com::sun::star::uno::Any; using com::sun::star::uno::UNO_QUERY; using com::sun::star::uno::Reference; @@ -84,7 +85,7 @@ void Views::refresh() Reference< XStatement > stmt = m_origin->createStatement(); - Reference< XResultSet > rs = stmt->executeQuery("SELECT " + Reference< XResultSet > rs = stmt->executeQuery(u"SELECT " "DISTINCT ON( pg_namespace.nspname, relname) " // needed because of duplicates "pg_namespace.nspname," // 1 "relname," // 2 @@ -92,7 +93,7 @@ void Views::refresh() "FROM pg_namespace, pg_class, pg_rewrite " "WHERE pg_namespace.oid = relnamespace " "AND pg_class.oid = ev_class " - "AND relkind=\'v\'" ); + "AND relkind=\'v\'"_ustr ); Reference< XRow > xRow( rs , UNO_QUERY ); @@ -108,14 +109,13 @@ void Views::refresh() command = xRow->getString( 3 ); rtl::Reference<View> pView = new View (m_xMutex, m_origin, m_pSettings ); - Reference< css::beans::XPropertySet > prop = pView; - pView->setPropertyValue_NoBroadcast_public(st.NAME , makeAny(table) ); - pView->setPropertyValue_NoBroadcast_public(st.SCHEMA_NAME, makeAny(schema) ); - pView->setPropertyValue_NoBroadcast_public(st.COMMAND, makeAny(command) ); + pView->setPropertyValue_NoBroadcast_public(st.NAME , Any(table) ); + pView->setPropertyValue_NoBroadcast_public(st.SCHEMA_NAME, Any(schema) ); + pView->setPropertyValue_NoBroadcast_public(st.COMMAND, Any(command) ); { - m_values.push_back( makeAny( prop ) ); + m_values.push_back( Any( Reference< css::beans::XPropertySet >(pView) ) ); map[ schema + "." + table ] = viewIndex; ++viewIndex; } @@ -175,7 +175,7 @@ void Views::dropByName( const OUString& elementName ) void Views::dropByIndex( sal_Int32 index ) { osl::MutexGuard guard( m_xMutex->GetMutex() ); - if( index < 0 || index >= static_cast<sal_Int32>(m_values.size()) ) + if( index < 0 || o3tl::make_unsigned(index) >= m_values.size() ) { throw css::lang::IndexOutOfBoundsException( "VIEWS: Index out of range (allowed 0 to " + OUString::number(m_values.size() -1) diff --git a/connectivity/source/drivers/writer/WCatalog.cxx b/connectivity/source/drivers/writer/WCatalog.cxx index 8671af7bd5d9..b0e326d96d6f 100644 --- a/connectivity/source/drivers/writer/WCatalog.cxx +++ b/connectivity/source/drivers/writer/WCatalog.cxx @@ -41,7 +41,8 @@ void OWriterCatalog::refreshTables() ::std::vector<OUString> aVector; uno::Sequence<OUString> aTypes; OWriterConnection::ODocHolder aDocHolder(static_cast<OWriterConnection*>(m_pConnection)); - uno::Reference<sdbc::XResultSet> xResult = m_xMetaData->getTables(uno::Any(), "%", "%", aTypes); + uno::Reference<sdbc::XResultSet> xResult + = m_xMetaData->getTables(uno::Any(), u"%"_ustr, u"%"_ustr, aTypes); if (xResult.is()) { diff --git a/connectivity/source/drivers/writer/WConnection.cxx b/connectivity/source/drivers/writer/WConnection.cxx index 385692951518..0f23b315beca 100644 --- a/connectivity/source/drivers/writer/WConnection.cxx +++ b/connectivity/source/drivers/writer/WConnection.cxx @@ -32,7 +32,7 @@ #include <unotools/pathoptions.hxx> #include <connectivity/dbexception.hxx> #include <cppuhelper/exc_hlp.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> using namespace ::com::sun::star; @@ -42,7 +42,6 @@ namespace connectivity::writer { OWriterConnection::OWriterConnection(ODriver* _pDriver) : OConnection(_pDriver) - , m_nDocCount(0) { } @@ -55,9 +54,9 @@ void OWriterConnection::construct(const OUString& rURL, sal_Int32 nLen = rURL.indexOf(':'); nLen = rURL.indexOf(':', nLen + 1); - OUString aDSN(rURL.copy(nLen + 1)); - m_aFileName = aDSN; + m_aFileName = rURL.copy(nLen + 1); // DSN + INetURLObject aURL; aURL.SetSmartProtocol(INetProtocol::File); { @@ -116,7 +115,7 @@ uno::Reference<text::XTextDocument> const& OWriterConnection::acquireDoc() uno::Any aLoaderException; try { - xComponent = xDesktop->loadComponentFromURL(m_aFileName, "_blank", 0, aArgs); + xComponent = xDesktop->loadComponentFromURL(m_aFileName, u"_blank"_ustr, 0, aArgs); } catch (const uno::Exception&) { @@ -178,8 +177,8 @@ void OWriterConnection::disposing() // XServiceInfo -IMPLEMENT_SERVICE_INFO(OWriterConnection, "com.sun.star.sdbc.drivers.writer.Connection", - "com.sun.star.sdbc.Connection") +IMPLEMENT_SERVICE_INFO(OWriterConnection, u"com.sun.star.sdbc.drivers.writer.Connection"_ustr, + u"com.sun.star.sdbc.Connection"_ustr) uno::Reference<sdbc::XDatabaseMetaData> SAL_CALL OWriterConnection::getMetaData() { @@ -199,11 +198,11 @@ uno::Reference<sdbc::XDatabaseMetaData> SAL_CALL OWriterConnection::getMetaData( css::uno::Reference<css::sdbcx::XTablesSupplier> OWriterConnection::createCatalog() { ::osl::MutexGuard aGuard(m_aMutex); - uno::Reference<css::sdbcx::XTablesSupplier> xTab = m_xCatalog; + rtl::Reference<connectivity::sdbcx::OCatalog> xTab = m_xCatalog; if (!xTab.is()) { xTab = new OWriterCatalog(this); - m_xCatalog = xTab; + m_xCatalog = xTab.get(); } return xTab; } @@ -214,7 +213,7 @@ uno::Reference<sdbc::XStatement> SAL_CALL OWriterConnection::createStatement() checkDisposed(OConnection_BASE::rBHelper.bDisposed); uno::Reference<sdbc::XStatement> xReturn = new component::OComponentStatement(this); - m_aStatements.push_back(uno::WeakReferenceHelper(xReturn)); + m_aStatements.emplace_back(xReturn); return xReturn; } @@ -227,7 +226,7 @@ uno::Reference<sdbc::XPreparedStatement> rtl::Reference<component::OComponentPreparedStatement> pStmt = new component::OComponentPreparedStatement(this); pStmt->construct(sql); - m_aStatements.push_back(uno::WeakReferenceHelper(*pStmt)); + m_aStatements.emplace_back(*pStmt); return pStmt; } @@ -237,8 +236,7 @@ uno::Reference<sdbc::XPreparedStatement> ::osl::MutexGuard aGuard(m_aMutex); checkDisposed(OConnection_BASE::rBHelper.bDisposed); - ::dbtools::throwFeatureNotImplementedSQLException("XConnection::prepareCall", *this); - return nullptr; + ::dbtools::throwFeatureNotImplementedSQLException(u"XConnection::prepareCall"_ustr, *this); } } // namespace diff --git a/connectivity/source/drivers/writer/WDatabaseMetaData.cxx b/connectivity/source/drivers/writer/WDatabaseMetaData.cxx index e9b230be3fb5..29a6ab9379e2 100644 --- a/connectivity/source/drivers/writer/WDatabaseMetaData.cxx +++ b/connectivity/source/drivers/writer/WDatabaseMetaData.cxx @@ -53,7 +53,7 @@ uno::Reference<sdbc::XResultSet> SAL_CALL OWriterDatabaseMetaData::getTables( // check if ORowSetValue type is given // when no types are given then we have to return all tables e.g. TABLE - OUString aTable("TABLE"); + OUString aTable(u"TABLE"_ustr); bool bTableFound = true; sal_Int32 nLength = types.getLength(); @@ -90,14 +90,15 @@ uno::Reference<sdbc::XResultSet> SAL_CALL OWriterDatabaseMetaData::getTables( sal_Int32 nTableCount = aTableNames.getLength(); for (sal_Int32 nTable = 0; nTable < nTableCount; nTable++) { - OUString aName = aTableNames[nTable]; - if (match(tableNamePattern, aName, '\0')) + const OUString& rName = aTableNames[nTable]; + if (match(tableNamePattern, rName, '\0')) { - ODatabaseMetaDataResultSet::ORow aRow{ nullptr, nullptr, nullptr }; - aRow.reserve(6); - aRow.push_back(new ORowSetValueDecorator(aName)); - aRow.push_back(new ORowSetValueDecorator(aTable)); - aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + ODatabaseMetaDataResultSet::ORow aRow{ nullptr, + nullptr, + nullptr, + new ORowSetValueDecorator(rName), + new ORowSetValueDecorator(aTable), + ODatabaseMetaDataResultSet::getEmptyValue() }; aRows.push_back(aRow); } } diff --git a/connectivity/source/drivers/writer/WDriver.cxx b/connectivity/source/drivers/writer/WDriver.cxx index fa3a3dcf685a..daa94aa43f9c 100644 --- a/connectivity/source/drivers/writer/WDriver.cxx +++ b/connectivity/source/drivers/writer/WDriver.cxx @@ -31,24 +31,21 @@ namespace connectivity::writer { OUString SAL_CALL ODriver::getImplementationName() { - return "com.sun.star.comp.sdbc.writer.ODriver"; + return u"com.sun.star.comp.sdbc.writer.ODriver"_ustr; } extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* connectivity_writer_ODriver(css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const& /*rArguments*/) { - rtl::Reference<ODriver> ret; try { - ret = new ODriver(context); + return acquire(new ODriver(context)); } catch (...) { } - if (ret) - ret->acquire(); - return static_cast<cppu::OWeakObject*>(ret.get()); + return nullptr; } uno::Reference<sdbc::XConnection> @@ -63,7 +60,7 @@ uno::Reference<sdbc::XConnection> rtl::Reference<OWriterConnection> pCon = new OWriterConnection(this); pCon->construct(url, info); - m_xConnections.push_back(uno::WeakReferenceHelper(*pCon)); + m_xConnections.push_back(pCon.get()); return pCon; } diff --git a/connectivity/source/drivers/writer/WTable.cxx b/connectivity/source/drivers/writer/WTable.cxx index 2f76fc4a09d0..2f0f44855d86 100644 --- a/connectivity/source/drivers/writer/WTable.cxx +++ b/connectivity/source/drivers/writer/WTable.cxx @@ -30,7 +30,6 @@ #include <writer/WConnection.hxx> #include <connectivity/sdbcx/VColumn.hxx> #include <sal/log.hxx> -#include <comphelper/servicehelper.hxx> namespace com::sun::star::text { @@ -171,9 +170,6 @@ OWriterTable::OWriterTable(sdbcx::OCollection* _pTables, OWriterConnection* _pCo : OWriterTable_BASE(_pTables, _pConnection, Name, Type, OUString() /*Description*/, OUString() /*SchemaName*/, OUString() /*CatalogName*/) , m_pWriterConnection(_pConnection) - , m_nStartCol(0) - , m_nDataCols(0) - , m_bHasHeaders(false) { } @@ -210,18 +206,6 @@ void SAL_CALL OWriterTable::disposing() m_pWriterConnection = nullptr; } -uno::Sequence<sal_Int8> OWriterTable::getUnoTunnelId() -{ - static const comphelper::UnoIdInit implId; - return implId.getSeq(); -} - -sal_Int64 OWriterTable::getSomething(const uno::Sequence<sal_Int8>& rId) -{ - return comphelper::getSomethingImpl(rId, this, - comphelper::FallbackToGetSomethingOf<OWriterTable_BASE>{}); -} - bool OWriterTable::fetchRow(OValueRefRow& _rRow, const OSQLColumns& _rCols, bool bRetrieveData) { // read the bookmark diff --git a/connectivity/source/drivers/writer/WTables.cxx b/connectivity/source/drivers/writer/WTables.cxx index 8b2692d93a01..0d98471217f6 100644 --- a/connectivity/source/drivers/writer/WTables.cxx +++ b/connectivity/source/drivers/writer/WTables.cxx @@ -29,13 +29,13 @@ using namespace ::com::sun::star; namespace connectivity::writer { -sdbcx::ObjectType OWriterTables::createObject(const OUString& rName) +css::uno::Reference<css::beans::XPropertySet> OWriterTables::createObject(const OUString& rName) { rtl::Reference<OWriterTable> pTable = new OWriterTable(this, static_cast<OWriterConnection*>( static_cast<file::OFileCatalog&>(m_rParent).getConnection()), - rName, "TABLE"); + rName, u"TABLE"_ustr); pTable->construct(); return pTable; } |