/**************************************************************
 * 
 * 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_general.hxx"
#include "mysqlc_resultsetmetadata.hxx"

#include <cppconn/exception.h>
#include <cppconn/datatype.h>

using com::sun::star::sdbc::SQLException;

using com::sun::star::uno::UNO_QUERY;
using com::sun::star::uno::Reference;
using com::sun::star::uno::XInterface;
using com::sun::star::uno::Any;
using ::rtl::OUString;

namespace mysqlc_sdbc_driver
{
// -----------------------------------------------------------------------------
void throwFeatureNotImplementedException( const sal_Char* _pAsciiFeatureName, const Reference< XInterface >& _rxContext, const Any* _pNextException )
    throw (SQLException)
{
    const ::rtl::OUString sMessage = ::rtl::OUString::createFromAscii( _pAsciiFeatureName ) + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": feature not implemented." ) );
    throw SQLException(
        sMessage,
        _rxContext,
        ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HYC00")),
        0,
        _pNextException ? *_pNextException : Any()
    );
}


void throwInvalidArgumentException( const sal_Char* _pAsciiFeatureName, const Reference< XInterface >& _rxContext, const Any* _pNextException )
    throw (SQLException)
{
    const ::rtl::OUString sMessage = ::rtl::OUString::createFromAscii( _pAsciiFeatureName ) + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": invalid arguments." ) );
    throw SQLException(
        sMessage,
        _rxContext,
        ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HYC00")),
        0,
        _pNextException ? *_pNextException : Any()
    );
}

void translateAndThrow(const ::sql::SQLException& _error, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _context, const rtl_TextEncoding encoding)
{
	throw SQLException(
			convert(_error.what(), encoding),
			_context,
			convert(_error.getSQLState(), encoding),
			_error.getErrorCode(),
			Any()
		);
}


OUString getStringFromAny(const Any& _rAny)
{
	OUString nReturn;
	OSL_VERIFY( _rAny >>= nReturn );
	return nReturn;
}


int mysqlToOOOType(int cppConnType)
	throw ()
{
	switch (cppConnType) {
		case sql::DataType::BIT:
			return com::sun::star::sdbc::DataType::VARCHAR;

		case sql::DataType::TINYINT:
			return com::sun::star::sdbc::DataType::TINYINT;

		case sql::DataType::SMALLINT:
			return com::sun::star::sdbc::DataType::SMALLINT;

		case sql::DataType::INTEGER:
			return com::sun::star::sdbc::DataType::INTEGER;

		case sql::DataType::BIGINT:
			return com::sun::star::sdbc::DataType::BIGINT;

		case sql::DataType::REAL:
			return com::sun::star::sdbc::DataType::REAL;

		case sql::DataType::DOUBLE:
			return com::sun::star::sdbc::DataType::DOUBLE;

		case sql::DataType::DECIMAL:
			return com::sun::star::sdbc::DataType::DECIMAL;

		case sql::DataType::CHAR:
			return com::sun::star::sdbc::DataType::CHAR;

		case sql::DataType::BINARY:
			return com::sun::star::sdbc::DataType::BINARY;

		case sql::DataType::ENUM:
		case sql::DataType::SET:
		case sql::DataType::VARCHAR:
			return com::sun::star::sdbc::DataType::VARCHAR;
		
		case sql::DataType::VARBINARY:
			return com::sun::star::sdbc::DataType::VARBINARY;

		case sql::DataType::LONGVARCHAR:
			return com::sun::star::sdbc::DataType::LONGVARCHAR;
		
		case sql::DataType::LONGVARBINARY:
			return com::sun::star::sdbc::DataType::LONGVARBINARY;

		case sql::DataType::TIMESTAMP:
			return com::sun::star::sdbc::DataType::TIMESTAMP;
		
		case sql::DataType::DATE:
			return com::sun::star::sdbc::DataType::DATE;

		case sql::DataType::TIME:
			return com::sun::star::sdbc::DataType::TIME;

		case sql::DataType::GEOMETRY:
			return com::sun::star::sdbc::DataType::VARCHAR;
		
		case sql::DataType::SQLNULL:
			return com::sun::star::sdbc::DataType::SQLNULL;

		case sql::DataType::UNKNOWN:
			return com::sun::star::sdbc::DataType::VARCHAR;
	}

    OSL_ENSURE( false, "mysqlToOOOType: unhandled case, falling back to VARCHAR" );
    return com::sun::star::sdbc::DataType::VARCHAR;
}


::rtl::OUString convert(const ::ext_std::string& _string, const rtl_TextEncoding encoding)
{
	return ::rtl::OUString( _string.c_str(), _string.size(), encoding );
}

::ext_std::string convert(const ::rtl::OUString& _string, const rtl_TextEncoding encoding)
{
	return ::ext_std::string( ::rtl::OUStringToOString( _string, encoding ).getStr() );
}


} /* namespace */
