/**************************************************************
 *
 * 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 <stdio.h>

#include <preextstl.h>
#include <cppconn/exception.h>
#include <mysql_driver.h>
#include <postextstl.h>


/* {{{ 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
 */
