/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "mysqlc_driver.hxx" #include "mysqlc_connection.hxx" #include "mysqlc_general.hxx" 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 connectivity::mysqlc; using ::rtl::OUString; #include #include #include #include #include /* {{{ MysqlCDriver::MysqlCDriver() -I- */ MysqlCDriver::MysqlCDriver(const Reference< XMultiServiceFactory >& _rxFactory) : ODriver_BASE(m_aMutex) ,m_xFactory(_rxFactory) { OSL_TRACE("MysqlCDriver::MysqlCDriver"); cppDriver = NULL; } /* }}} */ /* {{{ MysqlCDriver::disposing() -I- */ void MysqlCDriver::disposing() { OSL_TRACE("MysqlCDriver::disposing"); ::osl::MutexGuard aGuard(m_aMutex); // when driver will be destroied so all our connections have to be destroied as well for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i) { Reference< XComponent > xComp(i->get(), UNO_QUERY); if (xComp.is()) { xComp->dispose(); } } m_xConnections.clear(); ODriver_BASE::disposing(); } /* }}} */ // static ServiceInfo /* {{{ MysqlCDriver::getImplementationName_Static() -I- */ OUString MysqlCDriver::getImplementationName_Static() throw(RuntimeException) { OSL_TRACE("MysqlCDriver::getImplementationName_Static"); return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.sdbc.mysqlc.MysqlCDriver" ) ); } /* }}} */ /* {{{ MysqlCDriver::getSupportedServiceNames_Static() -I- */ Sequence< OUString > MysqlCDriver::getSupportedServiceNames_Static() throw(RuntimeException) { OSL_TRACE("MysqlCDriver::getSupportedServiceNames_Static"); // which service is supported // for more information @see com.sun.star.sdbc.Driver Sequence< OUString > aSNS(1); aSNS[0] = OUString::createFromAscii("com.sun.star.sdbc.Driver"); return aSNS; } /* }}} */ /* {{{ MysqlCDriver::getImplementationName() -I- */ OUString SAL_CALL MysqlCDriver::getImplementationName() throw(RuntimeException) { OSL_TRACE("MysqlCDriver::getImplementationName"); return getImplementationName_Static(); } /* }}} */ /* {{{ MysqlCDriver::supportsService() -I- */ sal_Bool SAL_CALL MysqlCDriver::supportsService(const OUString& _rServiceName) throw(RuntimeException) { OSL_TRACE("MysqlCDriver::supportsService"); Sequence< OUString > aSupported(getSupportedServiceNames()); const OUString* pSupported = aSupported.getConstArray(); const OUString* pEnd = pSupported + aSupported.getLength(); for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported){} return (pSupported != pEnd); } /* }}} */ /* {{{ MysqlCDriver::getSupportedServiceNames() -I- */ Sequence< OUString > SAL_CALL MysqlCDriver::getSupportedServiceNames() throw(RuntimeException) { OSL_TRACE("MysqlCDriver::getSupportedServiceNames"); return getSupportedServiceNames_Static(); } /* }}} */ extern "C" { static void SAL_CALL thisModule() {} } void MysqlCDriver::impl_initCppConn_lck_throw() { cppDriver = get_driver_instance(); if ( !cppDriver ) { throw SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Unable to obtain the MySQL_Driver instance from Connector/C++." ) ), *this, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "08001" ) ), // "unable to connect" 0, Any() ); } } /* {{{ MysqlCDriver::connect() -I- */ Reference< XConnection > SAL_CALL MysqlCDriver::connect(const OUString& url, const Sequence< PropertyValue >& info) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); OSL_TRACE("MysqlCDriver::connect"); if (!acceptsURL(url)) { return NULL; } if ( !cppDriver ) { impl_initCppConn_lck_throw(); OSL_POSTCOND( cppDriver, "MySQLCDriver::connect: internal error." ); if ( !cppDriver ) throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MySQLCDriver::connect: internal error." ) ), *this ); } Reference< XConnection > xConn; // create a new connection with the given properties and append it to our vector try { OConnection* pCon = new OConnection(*this, cppDriver); xConn = pCon; pCon->construct(url,info); m_xConnections.push_back(WeakReferenceHelper(*pCon)); } catch (sql::SQLException &e) { mysqlc_sdbc_driver::translateAndThrow(e, *this, getDefaultEncoding()); } return xConn; } /* }}} */ /* {{{ MysqlCDriver::acceptsURL() -I- */ sal_Bool SAL_CALL MysqlCDriver::acceptsURL(const OUString& url) throw(SQLException, RuntimeException) { OSL_TRACE("MysqlCDriver::acceptsURL"); return (!url.compareTo(OUString::createFromAscii("sdbc:mysqlc:"), sizeof("sdbc:mysqlc:")-1)); } /* }}} */ /* {{{ MysqlCDriver::getPropertyInfo() -I- */ Sequence< DriverPropertyInfo > SAL_CALL MysqlCDriver::getPropertyInfo(const OUString& url, const Sequence< PropertyValue >& /* info */) throw(SQLException, RuntimeException) { OSL_TRACE("MysqlCDriver::getPropertyInfo"); if (acceptsURL(url)) { ::std::vector< DriverPropertyInfo > aDriverInfo; aDriverInfo.push_back(DriverPropertyInfo( OUString(RTL_CONSTASCII_USTRINGPARAM("Hostname")) ,OUString(RTL_CONSTASCII_USTRINGPARAM("Name of host")) ,sal_True ,OUString::createFromAscii("localhost") ,Sequence< OUString >()) ); aDriverInfo.push_back(DriverPropertyInfo( OUString(RTL_CONSTASCII_USTRINGPARAM("Port")) ,OUString(RTL_CONSTASCII_USTRINGPARAM("Port")) ,sal_True ,OUString::createFromAscii("3306") ,Sequence< OUString >()) ); return Sequence< DriverPropertyInfo >(&(aDriverInfo[0]),aDriverInfo.size()); } return Sequence< DriverPropertyInfo >(); } /* }}} */ /* {{{ MysqlCDriver::getMajorVersion() -I- */ sal_Int32 SAL_CALL MysqlCDriver::getMajorVersion() throw(RuntimeException) { OSL_TRACE("MysqlCDriver::getMajorVersion"); return MYSQLC_VERSION_MAJOR; } /* }}} */ /* {{{ MysqlCDriver::getMinorVersion() -I- */ sal_Int32 SAL_CALL MysqlCDriver::getMinorVersion() throw(RuntimeException) { OSL_TRACE("MysqlCDriver::getMinorVersion"); return MYSQLC_VERSION_MINOR; } /* }}} */ namespace connectivity { namespace mysqlc { Reference< XInterface > SAL_CALL MysqlCDriver_CreateInstance(const Reference< XMultiServiceFactory >& _rxFactory) throw(::com::sun::star::uno::Exception) { return(*(new MysqlCDriver(_rxFactory))); } /* {{{ connectivity::mysqlc::release() -I- */ void release(oslInterlockedCount& _refCount, ::cppu::OBroadcastHelper& rBHelper, Reference< XInterface >& _xInterface, ::com::sun::star::lang::XComponent* _pObject) { if (osl_decrementInterlockedCount(&_refCount) == 0) { osl_incrementInterlockedCount(&_refCount); if (!rBHelper.bDisposed && !rBHelper.bInDispose) { // remember the parent Reference< XInterface > xParent; { ::osl::MutexGuard aGuard(rBHelper.rMutex); xParent = _xInterface; _xInterface = NULL; } // First dispose _pObject->dispose(); // only the alive ref holds the object OSL_ASSERT(_refCount == 1); // release the parent in the destructor if (xParent.is()) { ::osl::MutexGuard aGuard(rBHelper.rMutex); _xInterface = xParent; } } } else { osl_incrementInterlockedCount(&_refCount); } } /* }}} */ /* {{{ connectivity::mysqlc::checkDisposed() -I- */ void checkDisposed(sal_Bool _bThrow) throw (DisposedException) { if (_bThrow) { throw DisposedException(); } } /* }}} */ } /* mysqlc */ } /* connectivity */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */