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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_connectivity.hxx"
#include "odbc/ODatabaseMetaData.hxx"
#include "odbc/OTools.hxx"
#ifndef _CONNECTIVITY_ODBC_ORESULTSET_HXX_
#include "odbc/ODatabaseMetaDataResultSet.hxx"
#endif
#include "FDatabaseMetaDataResultSet.hxx"
#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/sdbc/ResultSetType.hpp>
#include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
#include "odbc/OFunctiondefs.hxx"
#include "stdio.h"
#include "TPrivilegesResultSet.hxx"
#include <connectivity/dbexception.hxx>
#include <rtl/ustrbuf.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)
						: ::connectivity::ODatabaseMetaDataBase(_pCon,_pCon->getConnectionInfo())
						,m_aConnectionHandle(_pHandle)
						,m_pConnection(_pCon)
						,m_bUseCatalog(sal_True)
						,m_bOdbc3(sal_True)
{
	OSL_ENSURE(m_pConnection,"ODatabaseMetaData::ODatabaseMetaData: No connection set!");
	if(!m_pConnection->isCatalogUsed())
	{
		osl_incrementInterlockedCount( &m_refCount );
		try
		{
			m_bUseCatalog	= !(usesLocalFiles() || usesLocalFilePerTable());
			::rtl::OUString sVersion = getDriverVersion();
			m_bOdbc3		=  sVersion != ::rtl::OUString::createFromAscii("02.50") && sVersion != ::rtl::OUString::createFromAscii("02.00");
		}
		catch(SQLException& )
		{ // doesn't matter here
		}
		osl_decrementInterlockedCount( &m_refCount );
	}
}
// -------------------------------------------------------------------------
ODatabaseMetaData::~ODatabaseMetaData()
{
}
// -------------------------------------------------------------------------
Reference< XResultSet > ODatabaseMetaData::impl_getTypeInfo_throw(  )
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openTypeInfo();
	}
	catch(SQLException&)
	{
        xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo);
	}

	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCatalogs(  ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	if(!m_bUseCatalog)
	{
        xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eCatalogs);
	}
	else
	{
		try
		{
			ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
			xRef = pResult;
			pResult->openCatalogs();
		}
		catch(SQLException&)
		{
			xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eCatalogs);
		}
	}

	return xRef;
}
// -------------------------------------------------------------------------
::rtl::OUString ODatabaseMetaData::impl_getCatalogSeparator_throw(  )
{
    ::rtl::OUString aVal;
	if ( m_bUseCatalog )
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_NAME_SEPARATOR,aVal,*this,m_pConnection->getTextEncoding());

	return aVal;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSchemas(  ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openSchemas();
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eSchemas);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table,
	const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openColumnPrivileges(m_bUseCatalog ? catalog : Any(),schema,table,columnNamePattern);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumnPrivileges);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns(
	const Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern,
	const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openColumns(m_bUseCatalog ? catalog : Any(),schemaPattern,tableNamePattern,columnNamePattern);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables(
	const Any& catalog, const ::rtl::OUString& schemaPattern,
	const ::rtl::OUString& tableNamePattern, const Sequence< ::rtl::OUString >& types ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openTables(m_bUseCatalog ? catalog : Any(),schemaPattern,tableNamePattern,types);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTables);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedureColumns(
	const Any& catalog, const ::rtl::OUString& schemaPattern,
	const ::rtl::OUString& procedureNamePattern, const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openProcedureColumns(m_bUseCatalog ? catalog : Any(),schemaPattern,procedureNamePattern,columnNamePattern);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eProcedureColumns);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedures(
	const Any& catalog, const ::rtl::OUString& schemaPattern,
	const ::rtl::OUString& procedureNamePattern ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openProcedures(m_bUseCatalog ? catalog : Any(),schemaPattern,procedureNamePattern);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eProcedures);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getVersionColumns(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
    bool bSuccess = false;
	try
	{
        if ( !m_pConnection->preventGetVersionColumns() )
        {
		    ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		    xRef = pResult;
		    pResult->openVersionColumns(m_bUseCatalog ? catalog : Any(),schema,table);
            bSuccess = true;
        }
	}
	catch(SQLException&)
	{
	}

    if ( !bSuccess )
    {
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eVersionColumns);
    }

    return xRef;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxBinaryLiteralLength(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_BINARY_LITERAL_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxRowSize(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_ROW_SIZE,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCatalogNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_CATALOG_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCharLiteralLength(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_CHAR_LITERAL_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_COLUMN_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInIndex(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_COLUMNS_IN_INDEX,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCursorNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_CURSOR_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxConnections(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_DRIVER_CONNECTIONS/*SQL_ACTIVE_CONNECTIONS*/,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInTable(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_COLUMNS_IN_TABLE,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatementLength(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_STATEMENT_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTableNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_TABLE_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 ODatabaseMetaData::impl_getMaxTablesInSelect_throw(  ) 
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_TABLES_IN_SELECT,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getExportedKeys(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openExportedKeys(m_bUseCatalog ? catalog : Any(),schema,table);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eExportedKeys);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getImportedKeys(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openImportedKeys(m_bUseCatalog ? catalog : Any(),schema,table);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eImportedKeys);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPrimaryKeys(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openPrimaryKeys(m_bUseCatalog ? catalog : Any(),schema,table);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::ePrimaryKeys);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table,
	sal_Bool unique, sal_Bool approximate ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openIndexInfo(m_bUseCatalog ? catalog : Any(),schema,table,unique,approximate);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eIndexInfo);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getBestRowIdentifier(
	const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Int32 scope,
	sal_Bool nullable ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openBestRowIdentifier(m_bUseCatalog ? catalog : Any(),schema,table,scope,nullable);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eBestRowIdentifier);
	}
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges(
	const Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern ) throw(SQLException, RuntimeException)
{
	if ( m_pConnection->isIgnoreDriverPrivilegesEnabled() )
	{
		return new OResultSetPrivileges(this,catalog,schemaPattern,tableNamePattern);
	}
	ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
	Reference< XResultSet > xRef = pResult;
	pResult->openTablePrivileges(m_bUseCatalog ? catalog : Any(),schemaPattern,tableNamePattern);
	return xRef;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCrossReference(
	const Any& primaryCatalog, const ::rtl::OUString& primarySchema,
	const ::rtl::OUString& primaryTable, const Any& foreignCatalog,
	const ::rtl::OUString& foreignSchema, const ::rtl::OUString& foreignTable ) throw(SQLException, RuntimeException)
{
	Reference< XResultSet > xRef;
	try
	{
		ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(m_pConnection);
		xRef = pResult;
		pResult->openForeignKeys(m_bUseCatalog ? primaryCatalog : Any(),primarySchema.toChar() == '%' ? &primarySchema : NULL,&primaryTable,
			m_bUseCatalog ? foreignCatalog : Any(), foreignSchema.toChar() == '%' ? &foreignSchema : NULL,&foreignTable);
	}
	catch(SQLException&)
	{
		xRef = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eCrossReference);
	}
	return xRef;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::doesMaxRowSizeIncludeBlobs(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aVal;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_ROW_SIZE_INCLUDES_LONG,aVal,*this,m_pConnection->getTextEncoding());
	return aVal.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseQuotedIdentifiers(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_LOWER;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseIdentifiers(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_LOWER;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_storesMixedCaseQuotedIdentifiers_throw(  ) 
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_MIXED;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseIdentifiers(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_MIXED;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseQuotedIdentifiers(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_UPPER;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseIdentifiers(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_UPPER;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsAlterTableWithAddColumn_throw(  )
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ALTER_TABLE,nValue,*this);
	return (nValue & SQL_AT_ADD_COLUMN) == SQL_AT_ADD_COLUMN;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsAlterTableWithDropColumn_throw(  )
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ALTER_TABLE,nValue,*this);
	return	((nValue & SQL_AT_DROP_COLUMN)			== SQL_AT_DROP_COLUMN)			||
			((nValue & SQL_AT_DROP_COLUMN_CASCADE)	== SQL_AT_DROP_COLUMN_CASCADE)	||
			((nValue & SQL_AT_DROP_COLUMN_RESTRICT) == SQL_AT_DROP_COLUMN_RESTRICT);
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxIndexLength(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_INDEX_SIZE,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_NON_NULLABLE_COLUMNS,nValue,*this);
	return nValue == SQL_NNC_NON_NULL;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogTerm(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aVal;
	if(m_bUseCatalog)
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_TERM,aVal,*this,m_pConnection->getTextEncoding());
	return aVal;
}
// -------------------------------------------------------------------------
::rtl::OUString ODatabaseMetaData::impl_getIdentifierQuoteString_throw(  )
{
	::rtl::OUString aVal;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_IDENTIFIER_QUOTE_CHAR,aVal,*this,m_pConnection->getTextEncoding());
	return aVal;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aVal;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SPECIAL_CHARACTERS,aVal,*this,m_pConnection->getTextEncoding());
	return aVal;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
	return nValue != SQL_CN_NONE;
}
// -------------------------------------------------------------------------
sal_Bool        ODatabaseMetaData::impl_isCatalogAtStart_throw(  )
{
	SQLUSMALLINT nValue=0;
	if ( m_bUseCatalog )
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_LOCATION,nValue,*this);
	return nValue == SQL_CL_START;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionIgnoredInTransactions(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
	return nValue == SQL_TC_DDL_IGNORE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionCausesTransactionCommit(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
	return nValue == SQL_TC_DDL_COMMIT;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsDataManipulationTransactionsOnly(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
	return nValue == SQL_TC_DML;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
	return nValue == SQL_TC_ALL;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedDelete(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nValue,*this);
	return (nValue & SQL_CA1_POS_DELETE) == SQL_CA1_POS_DELETE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedUpdate(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nValue,*this);
	return (nValue & SQL_CA1_POS_UPDATE) == SQL_CA1_POS_UPDATE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossRollback(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CURSOR_ROLLBACK_BEHAVIOR,nValue,*this);
	return nValue == SQL_CB_PRESERVE || nValue == SQL_CB_CLOSE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossCommit(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CURSOR_COMMIT_BEHAVIOR,nValue,*this);
	return nValue == SQL_CB_PRESERVE || nValue == SQL_CB_CLOSE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossCommit(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CURSOR_COMMIT_BEHAVIOR,nValue,*this);
	return nValue == SQL_CB_PRESERVE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossRollback(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CURSOR_ROLLBACK_BEHAVIOR,nValue,*this);
	return nValue == SQL_CB_PRESERVE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactionIsolationLevel( sal_Int32 level ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TXN_ISOLATION_OPTION,nValue,*this);
	return (nValue & static_cast<SQLUINTEGER>(level)) == static_cast<SQLUINTEGER>(level);
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsSchemasInDataManipulation_throw(  )
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
	return (nValue & SQL_SU_DML_STATEMENTS) == SQL_SU_DML_STATEMENTS;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92FullSQL(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SQL_CONFORMANCE,nValue,*this);
	return nValue == SQL_SC_SQL92_FULL;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92EntryLevelSQL(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SQL_CONFORMANCE,nValue,*this);
	return nValue == SQL_SC_SQL92_ENTRY;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsIntegrityEnhancementFacility(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aStr;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_INTEGRITY,aStr,*this,m_pConnection->getTextEncoding());
	return aStr.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInIndexDefinitions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
	return (nValue & SQL_SU_INDEX_DEFINITION) == SQL_SU_INDEX_DEFINITION;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsSchemasInTableDefinitions_throw(  ) 
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
	return (nValue & SQL_SU_TABLE_DEFINITION) == SQL_SU_TABLE_DEFINITION;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsCatalogsInTableDefinitions_throw(  )
{
	SQLUINTEGER nValue=0;
	if(m_bUseCatalog)
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
	return (nValue & SQL_CU_TABLE_DEFINITION) == SQL_CU_TABLE_DEFINITION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInIndexDefinitions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue=0;
	if(m_bUseCatalog)
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
	return (nValue & SQL_CU_INDEX_DEFINITION) == SQL_CU_INDEX_DEFINITION;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsCatalogsInDataManipulation_throw(  ) 
{
	SQLUINTEGER nValue=0;
	if(m_bUseCatalog)
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
	return (nValue & SQL_CU_DML_STATEMENTS) == SQL_CU_DML_STATEMENTS;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsOuterJoins(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_OJ_CAPABILITIES,nValue,*this);
	return ((nValue & (SQL_OJ_FULL|SQL_OJ_LEFT|SQL_OJ_RIGHT|SQL_OJ_NESTED|SQL_OJ_NOT_ORDERED|SQL_OJ_ALL_COMPARISON_OPS|SQL_OJ_INNER)) != 0);
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTableTypes(  ) throw(SQLException, RuntimeException)
{

	// there exists no possibility to get table types so we have to check
	static ::rtl::OUString sTableTypes[] =
	{
		::rtl::OUString::createFromAscii("TABLE"),
		::rtl::OUString::createFromAscii("VIEW"),
		::rtl::OUString::createFromAscii("SYSTEM TABLE"),
		::rtl::OUString::createFromAscii("GLOBAL TEMPORARY"),
		::rtl::OUString::createFromAscii("LOCAL TEMPORARY"),
		::rtl::OUString::createFromAscii("ALIAS"),
		::rtl::OUString::createFromAscii("SYNONYM")
	};
	sal_Int32  nSize = sizeof(sTableTypes) / sizeof(::rtl::OUString);
	::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTableTypes);
    Reference< XResultSet > xRef = pResult;
	SQLUINTEGER nValue = 0;
	try
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CREATE_VIEW,nValue,*this);
	}
	catch(const Exception&)
	{
	}
	sal_Bool bViewsSupported = (nValue & SQL_CV_CREATE_VIEW) == SQL_CV_CREATE_VIEW;

	::connectivity::ODatabaseMetaDataResultSet::ORows aRows;
	for(sal_Int32 i=0;i < nSize;++i)
	{
		if( !bViewsSupported && i == 1)
			continue; // no views supported
		::connectivity::ODatabaseMetaDataResultSet::ORow aRow;
		aRow.push_back(::connectivity::ODatabaseMetaDataResultSet::getEmptyValue());
		aRow.push_back(new ::connectivity::ORowSetValueDecorator(sTableTypes[i]));
		aRows.push_back(aRow);
	}
	pResult->setRows(aRows);
	 return xRef;
}
// -------------------------------------------------------------------------
sal_Int32 ODatabaseMetaData::impl_getMaxStatements_throw(  )
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_CONCURRENT_ACTIVITIES,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxProcedureNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_PROCEDURE_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxSchemaNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_SCHEMA_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactions(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
	return nValue != SQL_TC_NONE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::allProceduresAreCallable(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ACCESSIBLE_PROCEDURES,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsStoredProcedures(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_PROCEDURES,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSelectForUpdate(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nValue,*this);
	return (nValue & SQL_CA1_POSITIONED_UPDATE) == SQL_CA1_POSITIONED_UPDATE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::allTablesAreSelectable(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ACCESSIBLE_TABLES,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::isReadOnly(  ) throw(SQLException, RuntimeException)
{
	return m_pConnection->isReadOnly();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFiles(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_FILE_USAGE,nValue,*this);
	return nValue == SQL_FILE_CATALOG;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFilePerTable(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_FILE_USAGE,nValue,*this);
	return nValue == SQL_FILE_TABLE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsTypeConversion(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_FUNCTIONS,nValue,*this);
	return (nValue & SQL_FN_CVT_CONVERT) == SQL_FN_CVT_CONVERT;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::nullPlusNonNullIsNull(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONCAT_NULL_BEHAVIOR,nValue,*this);
	return nValue == SQL_CB_NULL;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsColumnAliasing(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_COLUMN_ALIAS,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsTableCorrelationNames(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
	return nValue != SQL_CN_NONE;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsConvert( sal_Int32 fromType, sal_Int32 toType ) throw(SQLException, RuntimeException)
{
	if(fromType == toType)
		return sal_True;

	SQLUINTEGER nValue=0;
	switch(fromType)
	{
		case DataType::BIT:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_BIT,nValue,*this);
			break;
		case DataType::TINYINT:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_TINYINT,nValue,*this);
			break;
		case DataType::SMALLINT:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_SMALLINT,nValue,*this);
			break;
		case DataType::INTEGER:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_INTEGER,nValue,*this);
			break;
		case DataType::BIGINT:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_BIGINT,nValue,*this);
			break;
		case DataType::FLOAT:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_FLOAT,nValue,*this);
			break;
		case DataType::REAL:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_REAL,nValue,*this);
			break;
		case DataType::DOUBLE:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_DOUBLE,nValue,*this);
			break;
		case DataType::NUMERIC:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_NUMERIC,nValue,*this);
			break;
		case DataType::DECIMAL:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_DECIMAL,nValue,*this);
			break;
		case DataType::CHAR:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_CHAR,nValue,*this);
			break;
		case DataType::VARCHAR:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_VARCHAR,nValue,*this);
			break;
		case DataType::LONGVARCHAR:
		case DataType::CLOB:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_LONGVARCHAR,nValue,*this);
			break;
		case DataType::DATE:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_DATE,nValue,*this);
			break;
		case DataType::TIME:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_TIME,nValue,*this);
			break;
		case DataType::TIMESTAMP:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_TIMESTAMP,nValue,*this);
			break;
		case DataType::BINARY:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_BINARY,nValue,*this);
			break;
		case DataType::VARBINARY:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_VARBINARY,nValue,*this);
			break;
		case DataType::LONGVARBINARY:
		case DataType::BLOB:
			OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CONVERT_LONGVARBINARY,nValue,*this);
			break;
		case DataType::SQLNULL:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
		case DataType::OTHER:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
		case DataType::OBJECT:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
		case DataType::DISTINCT:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
		case DataType::STRUCT:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
		case DataType::ARRAY:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
		case DataType::REF:
			//	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
			break;
	}
	sal_Bool bConvert = sal_False;
	switch(toType)
	{
		case DataType::BIT:
			bConvert = (nValue & SQL_CVT_BIT) == SQL_CVT_BIT;
			break;
		case DataType::TINYINT:
			bConvert = (nValue & SQL_CVT_TINYINT) == SQL_CVT_TINYINT;
			break;
		case DataType::SMALLINT:
			bConvert = (nValue & SQL_CVT_SMALLINT) == SQL_CVT_SMALLINT;
			break;
		case DataType::INTEGER:
			bConvert = (nValue & SQL_CVT_INTEGER) == SQL_CVT_INTEGER;
			break;
		case DataType::BIGINT:
			bConvert = (nValue & SQL_CVT_BIGINT) == SQL_CVT_BIGINT;
			break;
		case DataType::FLOAT:
			bConvert = (nValue & SQL_CVT_FLOAT) == SQL_CVT_FLOAT;
			break;
		case DataType::REAL:
			bConvert = (nValue & SQL_CVT_REAL) == SQL_CVT_REAL;
			break;
		case DataType::DOUBLE:
			bConvert = (nValue & SQL_CVT_DOUBLE) == SQL_CVT_DOUBLE;
			break;
		case DataType::NUMERIC:
			bConvert = (nValue & SQL_CVT_NUMERIC) == SQL_CVT_NUMERIC;
			break;
		case DataType::DECIMAL:
			bConvert = (nValue & SQL_CVT_DECIMAL) == SQL_CVT_DECIMAL;
			break;
		case DataType::CHAR:
			bConvert = (nValue & SQL_CVT_CHAR) == SQL_CVT_CHAR;
			break;
		case DataType::VARCHAR:
			bConvert = (nValue & SQL_CVT_VARCHAR) == SQL_CVT_VARCHAR;
			break;
		case DataType::LONGVARCHAR:
		case DataType::CLOB:
			bConvert = (nValue & SQL_CVT_LONGVARCHAR) == SQL_CVT_LONGVARCHAR;
			break;
		case DataType::DATE:
			bConvert = (nValue & SQL_CVT_DATE) == SQL_CVT_DATE;
			break;
		case DataType::TIME:
			bConvert = (nValue & SQL_CVT_TIME) == SQL_CVT_TIME;
			break;
		case DataType::TIMESTAMP:
			bConvert = (nValue & SQL_CVT_TIMESTAMP) == SQL_CVT_TIMESTAMP;
			break;
		case DataType::BINARY:
			bConvert = (nValue & SQL_CVT_BINARY) == SQL_CVT_BINARY;
			break;
		case DataType::VARBINARY:
			bConvert = (nValue & SQL_CVT_VARBINARY) == SQL_CVT_VARBINARY;
			break;
		case DataType::LONGVARBINARY:
		case DataType::BLOB:
			bConvert = (nValue & SQL_CVT_LONGVARBINARY) == SQL_CVT_LONGVARBINARY;
			break;
	}

	return bConvert;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsExpressionsInOrderBy(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_EXPRESSIONS_IN_ORDERBY,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupBy(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_GROUP_BY,nValue,*this);
	return nValue != SQL_GB_NOT_SUPPORTED;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByBeyondSelect(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_GROUP_BY,nValue,*this);
	return nValue != SQL_GB_GROUP_BY_CONTAINS_SELECT;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByUnrelated(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_GROUP_BY,nValue,*this);
	return nValue == SQL_GB_NO_RELATION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleTransactions(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MULTIPLE_ACTIVE_TXN,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleResultSets(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MULT_RESULT_SETS,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsLikeEscapeClause(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_LIKE_ESCAPE_CLAUSE,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'Y';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsOrderByUnrelated(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ORDER_BY_COLUMNS_IN_SELECT,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.toChar() == 'N';
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsUnion(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_UNION,nValue,*this);
	return (nValue & SQL_U_UNION) == SQL_U_UNION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsUnionAll(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_UNION,nValue,*this);
	return (nValue & SQL_U_UNION_ALL) == SQL_U_UNION_ALL;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseIdentifiers(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_MIXED;
}
// -------------------------------------------------------------------------
sal_Bool ODatabaseMetaData::impl_supportsMixedCaseQuotedIdentifiers_throw(  )
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
	return nValue == SQL_IC_MIXED;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtEnd(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
	return nValue == SQL_NC_END;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtStart(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
	return nValue == SQL_NC_START;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedHigh(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
	return nValue == SQL_NC_HIGH;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedLow(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
	return nValue == SQL_NC_LOW;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInProcedureCalls(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
	return (nValue & SQL_SU_PROCEDURE_INVOCATION) == SQL_SU_PROCEDURE_INVOCATION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInPrivilegeDefinitions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
	return (nValue & SQL_SU_PRIVILEGE_DEFINITION) == SQL_SU_PRIVILEGE_DEFINITION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInProcedureCalls(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue=0;
	if(m_bUseCatalog)
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
	return (nValue & SQL_CU_PROCEDURE_INVOCATION) == SQL_CU_PROCEDURE_INVOCATION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInPrivilegeDefinitions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue=0;
	if(m_bUseCatalog)
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
	return (nValue & SQL_CU_PRIVILEGE_DEFINITION) == SQL_CU_PRIVILEGE_DEFINITION;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsCorrelatedSubqueries(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
	return (nValue & SQL_SQ_CORRELATED_SUBQUERIES) == SQL_SQ_CORRELATED_SUBQUERIES;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInComparisons(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
	return (nValue & SQL_SQ_COMPARISON) == SQL_SQ_COMPARISON;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInExists(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
	return (nValue & SQL_SQ_EXISTS) == SQL_SQ_EXISTS;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInIns(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
	return (nValue & SQL_SQ_IN) == SQL_SQ_IN;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInQuantifieds(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
	return (nValue & SQL_SQ_QUANTIFIED) == SQL_SQ_QUANTIFIED;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92IntermediateSQL(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SQL_CONFORMANCE,nValue,*this);
	return nValue == SQL_SC_SQL92_INTERMEDIATE;
}
// -----------------------------------------------------------------------------
::rtl::OUString ODatabaseMetaData::getURLImpl()
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DATA_SOURCE_NAME,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getURL(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue = m_pConnection->getURL();
	if ( !aValue.getLength() )
	{
		aValue = ::rtl::OUString::createFromAscii("sdbc:odbc:");
		aValue += getURLImpl();
	}
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getUserName(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_USER_NAME,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getDriverName(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_NAME,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getDriverVersion() throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_ODBC_VER,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DBMS_NAME,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getProcedureTerm(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_PROCEDURE_TERM,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getSchemaTerm(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SCHEMA_TERM,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion(  ) throw(RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.copy(0,aValue.indexOf('.')).toInt32();
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getDefaultTransactionIsolation(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion(  ) throw(RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this,m_pConnection->getTextEncoding());
	return aValue.copy(0,aValue.lastIndexOf('.')).toInt32();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getSQLKeywords(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_KEYWORDS,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape(  ) throw(SQLException, RuntimeException)
{
	::rtl::OUString aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SEARCH_PATTERN_ESCAPE,aValue,*this,m_pConnection->getTextEncoding());
	return aValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getStringFunctions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	::rtl::OUStringBuffer aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_STRING_FUNCTIONS,nValue,*this);
	if(nValue & SQL_FN_STR_ASCII)
		aValue.appendAscii("ASCII,");
	if(nValue & SQL_FN_STR_BIT_LENGTH)
		aValue.appendAscii("BIT_LENGTH,");
	if(nValue & SQL_FN_STR_CHAR)
		aValue.appendAscii("CHAR,");
	if(nValue & SQL_FN_STR_CHAR_LENGTH)
		aValue.appendAscii("CHAR_LENGTH,");
	if(nValue & SQL_FN_STR_CHARACTER_LENGTH)
		aValue.appendAscii("CHARACTER_LENGTH,");
	if(nValue & SQL_FN_STR_CONCAT)
		aValue.appendAscii("CONCAT,");
	if(nValue & SQL_FN_STR_DIFFERENCE)
		aValue.appendAscii("DIFFERENCE,");
	if(nValue & SQL_FN_STR_INSERT)
		aValue.appendAscii("INSERT,");
	if(nValue & SQL_FN_STR_LCASE)
		aValue.appendAscii("LCASE,");
	if(nValue & SQL_FN_STR_LEFT)
		aValue.appendAscii("LEFT,");
	if(nValue & SQL_FN_STR_LENGTH)
		aValue.appendAscii("LENGTH,");
	if(nValue & SQL_FN_STR_LOCATE)
		aValue.appendAscii("LOCATE,");
	if(nValue & SQL_FN_STR_LOCATE_2)
		aValue.appendAscii("LOCATE_2,");
	if(nValue & SQL_FN_STR_LTRIM)
		aValue.appendAscii("LTRIM,");
	if(nValue & SQL_FN_STR_OCTET_LENGTH)
		aValue.appendAscii("OCTET_LENGTH,");
	if(nValue & SQL_FN_STR_POSITION)
		aValue.appendAscii("POSITION,");
	if(nValue & SQL_FN_STR_REPEAT)
		aValue.appendAscii("REPEAT,");
	if(nValue & SQL_FN_STR_REPLACE)
		aValue.appendAscii("REPLACE,");
	if(nValue & SQL_FN_STR_RIGHT)
		aValue.appendAscii("RIGHT,");
	if(nValue & SQL_FN_STR_RTRIM)
		aValue.appendAscii("RTRIM,");
	if(nValue & SQL_FN_STR_SOUNDEX)
		aValue.appendAscii("SOUNDEX,");
	if(nValue & SQL_FN_STR_SPACE)
		aValue.appendAscii("SPACE,");
	if(nValue & SQL_FN_STR_SUBSTRING)
		aValue.appendAscii("SUBSTRING,");
	if(nValue & SQL_FN_STR_UCASE)
		aValue.appendAscii("UCASE,");


	if ( aValue.getLength() )
        aValue.setLength(aValue.getLength()-1);

	return aValue.makeStringAndClear();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	::rtl::OUStringBuffer aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_TIMEDATE_FUNCTIONS,nValue,*this);

	if(nValue & SQL_FN_TD_CURRENT_DATE)
		aValue.appendAscii("CURRENT_DATE,");
	if(nValue & SQL_FN_TD_CURRENT_TIME)
		aValue.appendAscii("CURRENT_TIME,");
	if(nValue & SQL_FN_TD_CURRENT_TIMESTAMP)
		aValue.appendAscii("CURRENT_TIMESTAMP,");
	if(nValue & SQL_FN_TD_CURDATE)
		aValue.appendAscii("CURDATE,");
	if(nValue & SQL_FN_TD_CURTIME)
		aValue.appendAscii("CURTIME,");
	if(nValue & SQL_FN_TD_DAYNAME)
		aValue.appendAscii("DAYNAME,");
	if(nValue & SQL_FN_TD_DAYOFMONTH)
		aValue.appendAscii("DAYOFMONTH,");
	if(nValue & SQL_FN_TD_DAYOFWEEK)
		aValue.appendAscii("DAYOFWEEK,");
	if(nValue & SQL_FN_TD_DAYOFYEAR)
		aValue.appendAscii("DAYOFYEAR,");
	if(nValue & SQL_FN_TD_EXTRACT)
		aValue.appendAscii("EXTRACT,");
	if(nValue & SQL_FN_TD_HOUR)
		aValue.appendAscii("HOUR,");
	if(nValue & SQL_FN_TD_MINUTE)
		aValue.appendAscii("MINUTE,");
	if(nValue & SQL_FN_TD_MONTH)
		aValue.appendAscii("MONTH,");
	if(nValue & SQL_FN_TD_MONTHNAME)
		aValue.appendAscii("MONTHNAME,");
	if(nValue & SQL_FN_TD_NOW)
		aValue.appendAscii("NOW,");
	if(nValue & SQL_FN_TD_QUARTER)
		aValue.appendAscii("QUARTER,");
	if(nValue & SQL_FN_TD_SECOND)
		aValue.appendAscii("SECOND,");
	if(nValue & SQL_FN_TD_TIMESTAMPADD)
		aValue.appendAscii("TIMESTAMPADD,");
	if(nValue & SQL_FN_TD_TIMESTAMPDIFF)
		aValue.appendAscii("TIMESTAMPDIFF,");
	if(nValue & SQL_FN_TD_WEEK)
		aValue.appendAscii("WEEK,");
	if(nValue & SQL_FN_TD_YEAR)
		aValue.appendAscii("YEAR,");

	if ( aValue.getLength() )
        aValue.setLength(aValue.getLength()-1);

	return aValue.makeStringAndClear();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getSystemFunctions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	::rtl::OUStringBuffer aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_SYSTEM_FUNCTIONS,nValue,*this);

	if(nValue & SQL_FN_SYS_DBNAME)
		aValue.appendAscii("DBNAME,");
	if(nValue & SQL_FN_SYS_IFNULL)
		aValue.appendAscii("IFNULL,");
	if(nValue & SQL_FN_SYS_USERNAME)
		aValue.appendAscii("USERNAME,");

    if ( aValue.getLength() )
        aValue.setLength(aValue.getLength()-1);

	return aValue.makeStringAndClear();
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ODatabaseMetaData::getNumericFunctions(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	::rtl::OUStringBuffer aValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_NUMERIC_FUNCTIONS,nValue,*this);

	if(nValue & SQL_FN_NUM_ABS)
		aValue.appendAscii("ABS,");
	if(nValue & SQL_FN_NUM_ACOS)
		aValue.appendAscii("ACOS,");
	if(nValue & SQL_FN_NUM_ASIN)
		aValue.appendAscii("ASIN,");
	if(nValue & SQL_FN_NUM_ATAN)
		aValue.appendAscii("ATAN,");
	if(nValue & SQL_FN_NUM_ATAN2)
		aValue.appendAscii("ATAN2,");
	if(nValue & SQL_FN_NUM_CEILING)
		aValue.appendAscii("CEILING,");
	if(nValue & SQL_FN_NUM_COS)
		aValue.appendAscii("COS,");
	if(nValue & SQL_FN_NUM_COT)
		aValue.appendAscii("COT,");
	if(nValue & SQL_FN_NUM_DEGREES)
		aValue.appendAscii("DEGREES,");
	if(nValue & SQL_FN_NUM_EXP)
		aValue.appendAscii("EXP,");
	if(nValue & SQL_FN_NUM_FLOOR)
		aValue.appendAscii("FLOOR,");
	if(nValue & SQL_FN_NUM_LOG)
		aValue.appendAscii("LOGF,");
	if(nValue & SQL_FN_NUM_LOG10)
		aValue.appendAscii("LOG10,");
	if(nValue & SQL_FN_NUM_MOD)
		aValue.appendAscii("MOD,");
	if(nValue & SQL_FN_NUM_PI)
		aValue.appendAscii("PI,");
	if(nValue & SQL_FN_NUM_POWER)
		aValue.appendAscii("POWER,");
	if(nValue & SQL_FN_NUM_RADIANS)
		aValue.appendAscii("RADIANS,");
	if(nValue & SQL_FN_NUM_RAND)
		aValue.appendAscii("RAND,");
	if(nValue & SQL_FN_NUM_ROUND)
		aValue.appendAscii("ROUND,");
	if(nValue & SQL_FN_NUM_SIGN)
		aValue.appendAscii("SIGN,");
	if(nValue & SQL_FN_NUM_SIN)
		aValue.appendAscii("SIN,");
	if(nValue & SQL_FN_NUM_SQRT)
		aValue.appendAscii("SQRT,");
	if(nValue & SQL_FN_NUM_TAN)
		aValue.appendAscii("TAN,");
	if(nValue & SQL_FN_NUM_TRUNCATE)
		aValue.appendAscii("TRUNCATE,");

	if ( aValue.getLength() )
        aValue.setLength(aValue.getLength()-1);

	return aValue.makeStringAndClear();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	if(m_bOdbc3)
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
		return nValue == SQL_OIC_LEVEL2;
	}
	else
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
		return nValue == SQL_OAC_LEVEL2;
	}
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsCoreSQLGrammar(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	if(m_bOdbc3)
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
		return nValue == SQL_OIC_CORE || nValue == SQL_OIC_LEVEL2 || nValue == SQL_OIC_LEVEL1;
	}
	else
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ODBC_SQL_CONFORMANCE,nValue,*this);
		return nValue == SQL_OSC_CORE || nValue == SQL_OAC_LEVEL1 || nValue == SQL_OAC_LEVEL2;
	}
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsMinimumSQLGrammar(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	if(m_bOdbc3)
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
		return nValue == SQL_OIC_LEVEL1 || nValue == SQL_OIC_LEVEL2;
	}
	else
	{
		OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
		return nValue == SQL_OAC_LEVEL1 || nValue == SQL_OAC_LEVEL2;
	}
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsFullOuterJoins(  ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_OJ_CAPABILITIES,nValue,*this);
	return (nValue & SQL_OJ_FULL) == SQL_OJ_FULL;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsLimitedOuterJoins(  ) throw(SQLException, RuntimeException)
{
	return supportsFullOuterJoins(  );
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInGroupBy(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_COLUMNS_IN_GROUP_BY,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInOrderBy(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_COLUMNS_IN_ORDER_BY,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInSelect(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_COLUMNS_IN_SELECT,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ODatabaseMetaData::getMaxUserNameLength(  ) throw(SQLException, RuntimeException)
{
	SQLUSMALLINT nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_MAX_USER_NAME_LEN,nValue,*this);
	return nValue;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetType( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
	OTools::GetInfo(m_pConnection,m_aConnectionHandle,SQL_CURSOR_SENSITIVITY,nValue,*this);
	return (nValue & static_cast<SQLUINTEGER>(setType)) == static_cast<SQLUINTEGER>(setType);
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
    SQLUSMALLINT nAskFor( SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 );
	switch(setType)
	{
        default:
		case ResultSetType::FORWARD_ONLY:
			nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_INSENSITIVE:
			nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_SENSITIVE:
			nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
			break;
	}

	OTools::GetInfo(m_pConnection,m_aConnectionHandle,nAskFor,nValue,*this);
	sal_Bool bRet = sal_False;
	switch(concurrency)
	{
		case ResultSetConcurrency::READ_ONLY:
			bRet = (nValue & SQL_CA2_READ_ONLY_CONCURRENCY) == SQL_CA2_READ_ONLY_CONCURRENCY;
			break;
		case ResultSetConcurrency::UPDATABLE:
			bRet = (nValue & SQL_CA2_OPT_VALUES_CONCURRENCY) == SQL_CA2_OPT_VALUES_CONCURRENCY;
			break;
	}
	return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::ownUpdatesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
    SQLUSMALLINT nAskFor( SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 );
	switch(setType)
	{
        default:
		case ResultSetType::FORWARD_ONLY:
			nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_INSENSITIVE:
			nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_SENSITIVE:
			nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
			break;
	}

	OTools::GetInfo(m_pConnection,m_aConnectionHandle,nAskFor,nValue,*this);
	return (nValue & SQL_CA2_SENSITIVITY_UPDATES) == SQL_CA2_SENSITIVITY_UPDATES;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::ownDeletesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
    SQLUSMALLINT nAskFor( SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 );
	switch(setType)
	{
        default:
		case ResultSetType::FORWARD_ONLY:
			nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_INSENSITIVE:
			nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_SENSITIVE:
			nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
			break;
	}

	OTools::GetInfo(m_pConnection,m_aConnectionHandle,nAskFor,nValue,*this);
	return (nValue & SQL_CA2_SENSITIVITY_DELETIONS) != SQL_CA2_SENSITIVITY_DELETIONS;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::ownInsertsAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	SQLUINTEGER nValue;
    SQLUSMALLINT nAskFor( SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 );
	switch(setType)
	{
        default:
		case ResultSetType::FORWARD_ONLY:
			nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_INSENSITIVE:
			nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
			break;
		case ResultSetType::SCROLL_SENSITIVE:
			nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
			break;
	}

	OTools::GetInfo(m_pConnection,m_aConnectionHandle,nAskFor,nValue,*this);
	return (nValue & SQL_CA2_SENSITIVITY_ADDITIONS) == SQL_CA2_SENSITIVITY_ADDITIONS;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::othersUpdatesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	return ownUpdatesAreVisible(setType);
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::othersDeletesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	return ownDeletesAreVisible(setType);
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::othersInsertsAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
{
	return ownInsertsAreVisible(setType);
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::updatesAreDetected( sal_Int32 /*setType*/ ) throw(SQLException, RuntimeException)
{
	return sal_False;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::deletesAreDetected( sal_Int32 /*setType*/ ) throw(SQLException, RuntimeException)
{
	return sal_False;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::insertsAreDetected( sal_Int32 /*setType*/ ) throw(SQLException, RuntimeException)
{
	return sal_False;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ODatabaseMetaData::supportsBatchUpdates(  ) throw(SQLException, RuntimeException)
{
	return sal_False;
}
// -------------------------------------------------------------------------
Reference< XResultSet > SAL_CALL ODatabaseMetaData::getUDTs( const Any& /*catalog*/, const ::rtl::OUString& /*schemaPattern*/, const ::rtl::OUString& /*typeNamePattern*/, const Sequence< sal_Int32 >& /*types*/ ) throw(SQLException, RuntimeException)
{
	return NULL;
}
// -----------------------------------------------------------------------------