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

#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/sdbcx/CompareBookmark.hpp>
#include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
#include <com/sun/star/sdbc/ResultSetType.hpp>
#include <com/sun/star/sdbc/FetchDirection.hpp>
#include <cppuhelper/typeprovider.hxx>
#include <com/sun/star/lang/DisposedException.hpp>

using namespace connectivity::mysqlc;
using namespace cppu;
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace com::sun::star::beans;
using namespace com::sun::star::sdbc;
using namespace com::sun::star::sdbcx;
using namespace com::sun::star::container;
using namespace com::sun::star::io;
using namespace com::sun::star::util;
using ::osl::MutexGuard;
using ::rtl::OUString;

#include <cppconn/resultset.h>
#include <cppconn/resultset_metadata.h>

#include <stdio.h>


//	IMPLEMENT_SERVICE_INFO(OResultSet,"com.sun.star.sdbcx.OResultSet","com.sun.star.sdbc.ResultSet");
/* {{{ OResultSet::getImplementationName() -I- */
OUString SAL_CALL OResultSet::getImplementationName()
	throw (RuntimeException)
{
	OSL_TRACE("OResultSet::getImplementationName");
    return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdbcx.mysqlc.ResultSet" ) );
}
/* }}} */


/* {{{ OResultSet::getSupportedServiceNames() -I- */
Sequence< OUString > SAL_CALL OResultSet::getSupportedServiceNames()
	throw(RuntimeException)
{
	OSL_TRACE("OResultSet::getSupportedServiceNames");
	Sequence< OUString > aSupported(2);
	aSupported[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdbc.ResultSet" ) );
	aSupported[1] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdbcx.ResultSet" ) );
	return (aSupported);
}
/* }}} */


/* {{{ OResultSet::supportsService() -I- */
sal_Bool SAL_CALL OResultSet::supportsService(const OUString& _rServiceName)
	throw(RuntimeException)
{
	OSL_TRACE("OResultSet::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);
}
/* }}} */


/* {{{ OResultSet::OResultSet() -I- */
OResultSet::OResultSet(OCommonStatement * pStmt, sql::ResultSet * result, rtl_TextEncoding _encoding ) 
	: OResultSet_BASE(m_aMutex)
	,OPropertySetHelper(OResultSet_BASE::rBHelper)
	,m_aStatement((OWeakObject*)pStmt)
	,m_xMetaData(NULL)
	,m_result(result)
    ,fieldCount( 0 )
    ,m_encoding( _encoding )
{
	OSL_TRACE("OResultSet::OResultSet");
	try {
		sql::ResultSetMetaData * rs_meta = m_result->getMetaData();
		fieldCount = rs_meta->getColumnCount();
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
}
/* }}} */


/* {{{ OResultSet::~OResultSet() -I- */
OResultSet::~OResultSet()
{
	OSL_TRACE("OResultSet::~OResultSet");
}
/* }}} */


/* {{{ OResultSet::disposing() -I- */
void OResultSet::disposing()
{
	OSL_TRACE("OResultSet::disposing");
	OPropertySetHelper::disposing();

	MutexGuard aGuard(m_aMutex);

	m_aStatement = NULL;
	m_xMetaData  = NULL;
}
/* }}} */


/* {{{ OResultSet::queryInterface() -I- */
Any SAL_CALL OResultSet::queryInterface(const Type & rType)
	throw(RuntimeException)
{
	OSL_TRACE("OResultSet::queryInterface");
	Any aRet = OPropertySetHelper::queryInterface(rType);
	if (!aRet.hasValue()) {
		aRet = OResultSet_BASE::queryInterface(rType);
	}
	return aRet;
}
/* }}} */


/* {{{ OResultSet::getTypes() -I- */
Sequence< Type > SAL_CALL OResultSet::getTypes()
	throw(RuntimeException)
{
	OSL_TRACE("OResultSet::getTypes");
	OTypeCollection aTypes(	::getCppuType((const  Reference< XMultiPropertySet > *) NULL),
												::getCppuType((const Reference< XFastPropertySet > *) NULL),
												::getCppuType((const Reference< XPropertySet > *) NULL));

	return concatSequences(aTypes.getTypes(), OResultSet_BASE::getTypes());
}
/* }}} */


/* {{{ OResultSet::findColumn() -I- */
sal_Int32 SAL_CALL OResultSet::findColumn(const OUString& columnName)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::findColumn");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		// find the first column with the name columnName
		sql::ResultSetMetaData * meta = m_result->getMetaData();
		for (sal_uInt32 i = 1; i <= fieldCount; i++) {
			if (columnName.equalsIgnoreAsciiCaseAscii(meta->getColumnName(i).c_str())) {
				/* SDBC knows them indexed from 1 */
				return i;
			}
		}
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0;
}
/* }}} */


/* {{{ OResultSet::getBinaryStream() -U- */
Reference< XInputStream > SAL_CALL OResultSet::getBinaryStream(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getBinaryStream");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getBinaryStream", *this);
	return NULL;
}
/* }}} */


/* {{{ OResultSet::getCharacterStream() -U- */
Reference< XInputStream > SAL_CALL OResultSet::getCharacterStream(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getCharacterStream");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getCharacterStream", *this);
	return NULL;
}
/* }}} */


/* {{{ OResultSet::getBoolean() -I- */
sal_Bool SAL_CALL OResultSet::getBoolean(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getBoolean");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);
	try {
		return m_result->getBoolean(column)? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False;
#if 0
	OUString str = getString(column);
	switch (str[0]) {
		case '1':
		case 't':
		case 'T':
		case 'y':
		case 'Y':
			return sal_True;
	}
	return sal_False;
#endif
}
/* }}} */


/* {{{ OResultSet::getByte() -I- */
sal_Int8 SAL_CALL OResultSet::getByte(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getByte");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);
	try {
		return m_result->getInt(column);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getBytes() -I- */
Sequence< sal_Int8 > SAL_CALL OResultSet::getBytes(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getBytes");
	
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	MutexGuard aGuard(m_aMutex);


	sql::SQLString val = m_result->getString(column);
	if (!val.length()) {
		return Sequence< sal_Int8>();
	} else {
		return Sequence< sal_Int8 > ((sal_Int8*)val.c_str(), val.length());
	}
}
/* }}} */


/* {{{ OResultSet::getDate() -I- */
Date SAL_CALL OResultSet::getDate(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getDate");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	Date d;
	try {
		OUString dateString = getString(column);
		OUString token;
		sal_Int32 nIndex = 0, i=0;

		do {
			token = dateString.getToken (0, '-', nIndex);
			switch (i) {
				case 0:
					d.Year =  static_cast<sal_uInt16>(token.toInt32(10));
					break;
				case 1:
					d.Month =  static_cast<sal_uInt16>(token.toInt32(10));
					break;
				case 2:
					d.Day =  static_cast<sal_uInt16>(token.toInt32(10));
					break;
				default:;
			}
			i++;
		} while (nIndex >= 0);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return d;
}
/* }}} */


/* {{{ OResultSet::getDouble() -I- */
double SAL_CALL OResultSet::getDouble(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getDouble");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);
	try {
		return m_result->getDouble(column);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0.0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getFloat() -I- */
float SAL_CALL OResultSet::getFloat(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getFloat");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);
	try {
		return m_result->getDouble(column);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0.0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getInt() -I- */
sal_Int32 SAL_CALL OResultSet::getInt(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getInt");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);
	try {
		return m_result->getInt(column);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getRow() -I- */
sal_Int32 SAL_CALL OResultSet::getRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->getRow();
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getLong() -I- */
sal_Int64 SAL_CALL OResultSet::getLong(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getLong");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);
	try {
		return m_result->getInt64(column);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getMetaData() -I- */
Reference< XResultSetMetaData > SAL_CALL OResultSet::getMetaData()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getMetaData");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	try {
		if (!m_xMetaData.is()) {
			m_xMetaData = new OResultSetMetaData(m_result->getMetaData(), m_encoding);
		}
	} catch (sql::MethodNotImplementedException) {
		mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getMetaData", *this);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return m_xMetaData;
}
/* }}} */


/* {{{ OResultSet::getArray() -U- */
Reference< XArray > SAL_CALL OResultSet::getArray(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getArray");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getArray", *this);
	return NULL;
}
/* }}} */


/* {{{ OResultSet::getClob() -U- */
Reference< XClob > SAL_CALL OResultSet::getClob(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getClob");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getClob", *this);
	return NULL;
}
/* }}} */


/* {{{ OResultSet::getBlob() -U- */
Reference< XBlob > SAL_CALL OResultSet::getBlob(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getBlob");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getBlob", *this);
	return NULL;
}
/* }}} */


/* {{{ OResultSet::getRef() -U- */
Reference< XRef > SAL_CALL OResultSet::getRef(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getRef");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getRef", *this);
	return NULL;
}
/* }}} */


/* {{{ OResultSet::getObject() -U- */
Any SAL_CALL OResultSet::getObject(sal_Int32 column, const Reference< XNameAccess >& /* typeMap */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getObject");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);

	Any aRet= Any();

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getObject", *this);
	return aRet;
}
/* }}} */


/* {{{ OResultSet::getShort() -I- */
sal_Int16 SAL_CALL OResultSet::getShort(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getShort");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return (sal_Int16) m_result->getInt(column);
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return 0; // fool compiler
}
/* }}} */


/* {{{ OResultSet::getString() -I- */
OUString SAL_CALL OResultSet::getString(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getString");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	checkColumnIndex(column);

	try {
		sql::SQLString val = m_result->getString(column);
		if (!m_result->wasNull()) {
			return OUString( val.c_str(), val.length(), m_encoding );
		} else {
			return OUString();
		}
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return OUString(); // fool compiler
}
/* }}} */


/* {{{ OResultSet::getTime() -I- */
Time SAL_CALL OResultSet::getTime(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getTime");
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	MutexGuard aGuard(m_aMutex);

	checkColumnIndex(column);
	Time t;
	OUString timeString = getString(column);
	OUString token;
	sal_Int32 nIndex, i=0;

	nIndex = timeString.indexOf(' ') + 1;

	do {
		token = timeString.getToken (0, ':', nIndex);
		switch (i) {
			case 0:
				t.Hours =  static_cast<sal_uInt16>(token.toInt32(10));
				break;
			case 1:
				t.Minutes =  static_cast<sal_uInt16>(token.toInt32(10));
				break;
			case 2:
				t.Seconds =  static_cast<sal_uInt16>(token.toInt32(10));
				break;
		}
		i++;
	} while (nIndex >= 0);

	return t;
}
/* }}} */


/* {{{ OResultSet::getTimestamp() -I- */
DateTime SAL_CALL OResultSet::getTimestamp(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getTimestamp");
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	MutexGuard aGuard(m_aMutex);

	checkColumnIndex(column);
	DateTime dt;
	Date d = getDate(column);
	Time t = getTime(column);

	dt.Year = d.Year;
	dt.Month = d.Month;
	dt.Day = d.Day;
	dt.Hours = t.Hours;
	dt.Minutes = t.Minutes;
	dt.Seconds = t.Seconds;
	return dt;
}
/* }}} */


/* {{{ OResultSet::isBeforeFirst() -I- */
sal_Bool SAL_CALL OResultSet::isBeforeFirst()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::isBeforeFirst");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->isBeforeFirst()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::isAfterLast() -I- */
sal_Bool SAL_CALL OResultSet::isAfterLast()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::isAfterLast");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->isAfterLast()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::isFirst() -I- */
sal_Bool SAL_CALL OResultSet::isFirst()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::isFirst");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->isFirst();
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::isLast() -I- */
sal_Bool SAL_CALL OResultSet::isLast()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::isLast");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->isLast()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::beforeFirst() -I- */
void SAL_CALL OResultSet::beforeFirst()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::beforeFirst");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		m_result->beforeFirst();
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
}
/* }}} */


/* {{{ OResultSet::afterLast() -I- */
void SAL_CALL OResultSet::afterLast()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::afterLast");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		m_result->afterLast();
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
}
/* }}} */


/* {{{ OResultSet::close() -I- */
void SAL_CALL OResultSet::close() throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::close");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		m_result->close();
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}

	dispose();
}
/* }}} */


/* {{{ OResultSet::first() -I- */
sal_Bool SAL_CALL OResultSet::first() throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::first");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->first()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::last() -I- */
sal_Bool SAL_CALL OResultSet::last()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::last");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->last()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::absolute() -I- */
sal_Bool SAL_CALL OResultSet::absolute(sal_Int32 row)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::absolute");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->absolute(row)? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::relative() -I- */
sal_Bool SAL_CALL OResultSet::relative(sal_Int32 row)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::relative");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->relative(row)? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::previous() -I- */
sal_Bool SAL_CALL OResultSet::previous()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::previous");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->previous()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::getStatement() -I- */
Reference< XInterface > SAL_CALL OResultSet::getStatement()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getStatement");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	return m_aStatement.get();
}
/* }}} */


/* {{{ OResultSet::rowDeleted() -I- */
sal_Bool SAL_CALL OResultSet::rowDeleted()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::rowDeleted");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	return sal_False;
}
/* }}} */


/* {{{ OResultSet::rowInserted() -I- */
sal_Bool SAL_CALL OResultSet::rowInserted()
	throw(SQLException, RuntimeException)
{	
	OSL_TRACE("OResultSet::rowInserted");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	return sal_False;
}
/* }}} */


/* {{{ OResultSet::rowUpdated() -I- */
sal_Bool SAL_CALL OResultSet::rowUpdated()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::rowUpdated");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	return sal_False;
}
/* }}} */


/* {{{ OResultSet::next() -I- */
sal_Bool SAL_CALL OResultSet::next()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::next");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->next()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::wasNull() -I- */
sal_Bool SAL_CALL OResultSet::wasNull()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::wasNull");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	try {
		return m_result->wasNull()? sal_True:sal_False;
	} catch (sql::SQLException &e) {
        mysqlc_sdbc_driver::translateAndThrow(e, *this, m_encoding);
	}
	return sal_False; //fool
}
/* }}} */


/* {{{ OResultSet::cancel() -I- */
void SAL_CALL OResultSet::cancel()
	throw(RuntimeException)
{
	OSL_TRACE("OResultSet::cancel");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
}
/* }}} */


/* {{{ OResultSet::clearWarnings() -I- */
void SAL_CALL OResultSet::clearWarnings()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::clearWarnings");
}
/* }}} */


/* {{{ OResultSet::getWarnings() -I- */
Any SAL_CALL OResultSet::getWarnings()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getWarnings");
	Any aRet= Any();
	return aRet;
}
/* }}} */


/* {{{ OResultSet::insertRow() -I- */
void SAL_CALL OResultSet::insertRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::insertRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	// you only have to implement this if you want to insert new rows
    mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::insertRow", *this);
}
/* }}} */


/* {{{ OResultSet::updateRow() -I- */
void SAL_CALL OResultSet::updateRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	// only when you allow updates
    mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateRow", *this);
}
/* }}} */


/* {{{ OResultSet::deleteRow() -I- */
void SAL_CALL OResultSet::deleteRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::deleteRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
    mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::deleteRow", *this);
}
/* }}} */


/* {{{ OResultSet::cancelRowUpdates() -I- */
void SAL_CALL OResultSet::cancelRowUpdates()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::cancelRowUpdates");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
    mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::cancelRowUpdates", *this);
}
/* }}} */


/* {{{ OResultSet::moveToInsertRow() -I- */
void SAL_CALL OResultSet::moveToInsertRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::moveToInsertRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	// only when you allow insert's
    mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::moveToInsertRow", *this);
}
/* }}} */


/* {{{ OResultSet::moveToCurrentRow() -I- */
void SAL_CALL OResultSet::moveToCurrentRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::moveToCurrentRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
}
/* }}} */


/* {{{ OResultSet::updateNull() -U- */
void SAL_CALL OResultSet::updateNull(sal_Int32 column)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateNull");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateNull", *this);
}
/* }}} */


/* {{{ OResultSet::updateBoolean() -U- */
void SAL_CALL OResultSet::updateBoolean(sal_Int32 column, sal_Bool /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateBoolean");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateBoolean", *this);
}
/* }}} */


/* {{{ OResultSet::updateByte() -U- */
void SAL_CALL OResultSet::updateByte(sal_Int32 column, sal_Int8 /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateByte");
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	MutexGuard aGuard(m_aMutex);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateByte", *this);
}
/* }}} */


/* {{{ OResultSet::updateShort() -U- */
void SAL_CALL OResultSet::updateShort(sal_Int32 column, sal_Int16 /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateShort");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateShort", *this);
}
/* }}} */


/* {{{ OResultSet::updateInt() -U- */
void SAL_CALL OResultSet::updateInt(sal_Int32 column, sal_Int32 /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateInt");
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	MutexGuard aGuard(m_aMutex);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateInt", *this);
}
/* }}} */


/* {{{ OResultSet::updateLong() -U- */
void SAL_CALL OResultSet::updateLong(sal_Int32 column, sal_Int64 /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateLong");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateLong", *this);
}
/* }}} */


/* {{{ OResultSet::updateFloat() -U- */
void SAL_CALL OResultSet::updateFloat(sal_Int32 column, float /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateFloat");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateFloat", *this);
}
/* }}} */


/* {{{ OResultSet::updateDouble() -U- */
void SAL_CALL OResultSet::updateDouble(sal_Int32 column, double /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateDouble");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateDouble", *this);
}
/* }}} */


/* {{{ OResultSet::updateString() -U- */
void SAL_CALL OResultSet::updateString(sal_Int32 column, const OUString& /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateString");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateString", *this);
}
/* }}} */


/* {{{ OResultSet::updateBytes() -U- */
void SAL_CALL OResultSet::updateBytes(sal_Int32 column, const Sequence< sal_Int8 >& /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateBytes");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateBytes", *this);
}
/* }}} */


/* {{{ OResultSet::updateDate() -U- */
void SAL_CALL OResultSet::updateDate(sal_Int32 column, const Date& /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateDate");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateDate", *this);
}
/* }}} */


/* {{{ OResultSet::updateTime() -U- */
void SAL_CALL OResultSet::updateTime(sal_Int32 column, const Time& /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateTime");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateTime", *this);
}
/* }}} */


/* {{{ OResultSet::updateTimestamp() -U- */
void SAL_CALL OResultSet::updateTimestamp(sal_Int32 column, const DateTime& /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateTimestamp");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateTimestamp", *this);
}
/* }}} */


/* {{{ OResultSet::updateBinaryStream() -U- */
void SAL_CALL OResultSet::updateBinaryStream(sal_Int32 column, const Reference< XInputStream >& /* x */,
											sal_Int32 /* length */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateBinaryStream");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateBinaryStream", *this);
}
/* }}} */


/* {{{ OResultSet::updateCharacterStream() -U- */
void SAL_CALL OResultSet::updateCharacterStream(sal_Int32 column, const Reference< XInputStream >& /* x */,
												sal_Int32 /* length */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateCharacterStream");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateCharacterStream", *this);
}
/* }}} */


/* {{{ OResultSet::refreshRow() -U- */
void SAL_CALL OResultSet::refreshRow()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::refreshRow");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::refreshRow", *this);
}
/* }}} */


/* {{{ OResultSet::updateObject() -U- */
void SAL_CALL OResultSet::updateObject(sal_Int32 column, const Any& /* x */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateObject");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateObject", *this);
}
/* }}} */


/* {{{ OResultSet::updateNumericObject() -U- */
void SAL_CALL OResultSet::updateNumericObject(sal_Int32 column, const Any& /* x */, sal_Int32 /* scale */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::updateNumericObject");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	checkColumnIndex(column);
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::updateNumericObject", *this);
}
/* }}} */


// XRowLocate
/* {{{ OResultSet::getBookmark() -U- */
Any SAL_CALL OResultSet::getBookmark()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::getBookmark");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	Any aRet = Any();

	// if you don't want to support bookmark you must remove the XRowLocate interface
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::getBookmark", *this);

	return aRet;
}
/* }}} */


/* {{{ OResultSet::moveToBookmark() -U- */
sal_Bool SAL_CALL OResultSet::moveToBookmark(const Any& /* bookmark */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::moveToBookmark");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	return sal_False;
}
/* }}} */


/* {{{ OResultSet::moveRelativeToBookmark() -U- */
sal_Bool SAL_CALL OResultSet::moveRelativeToBookmark(const Any& /* bookmark */, sal_Int32 /* rows */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::moveRelativeToBookmark");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::moveRelativeToBookmark", *this);
	return sal_False;
}
/* }}} */


/* {{{ OResultSet::compareBookmarks() -I- */
sal_Int32 SAL_CALL OResultSet::compareBookmarks(const Any& /* n1 */, const Any& /* n2 */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::compareBookmarks");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::compareBookmarks", *this);

	return CompareBookmark::NOT_EQUAL;
}
/* }}} */


/* {{{ OResultSet::hasOrderedBookmarks() -I- */
sal_Bool SAL_CALL OResultSet::hasOrderedBookmarks()
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::hasOrderedBookmarks");
	return sal_False;
}
/* }}} */


/* {{{ OResultSet::hashBookmark() -U- */
sal_Int32 SAL_CALL OResultSet::hashBookmark(const Any& /* bookmark */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::hashBookmark");
	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::hashBookmark", *this);
	return 0;
}
/* }}} */


// XDeleteRows
/* {{{ OResultSet::deleteRows() -U- */
Sequence< sal_Int32 > SAL_CALL OResultSet::deleteRows(const Sequence< Any >& /* rows */)
	throw(SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::deleteRows");
	MutexGuard aGuard(m_aMutex);
	checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
	Sequence< sal_Int32 > aRet = Sequence< sal_Int32 >();

	mysqlc_sdbc_driver::throwFeatureNotImplementedException("OResultSet::deleteRows", *this);
	return aRet;
}
/* }}} */


/* {{{ OResultSet::createArrayHelper() -I- */
IPropertyArrayHelper * OResultSet::createArrayHelper() const
{
	OSL_TRACE("OResultSet::createArrayHelper");
	Sequence< Property > aProps(5);
	Property* pProperties = aProps.getArray();
	sal_Int32 nPos = 0;
	DECL_PROP0(FETCHDIRECTION,			sal_Int32);
	DECL_PROP0(FETCHSIZE,				sal_Int32);
	DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY);
	DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY);
	DECL_PROP1IMPL(RESULTSETTYPE,		sal_Int32) PropertyAttribute::READONLY);

	return new OPropertyArrayHelper(aProps);
}
/* }}} */


/* {{{ OResultSet::getInfoHelper() -I- */
IPropertyArrayHelper & OResultSet::getInfoHelper()
{
	OSL_TRACE("OResultSet::getInfoHelper");
	return (*const_cast<OResultSet*>(this)->getArrayHelper());
}
/* }}} */


/* {{{ OResultSet::convertFastPropertyValue() -I- */
sal_Bool OResultSet::convertFastPropertyValue(Any & /* rConvertedValue */,
											Any & /* rOldValue */,
											sal_Int32 nHandle,
											const Any& /* rValue */)
	throw (::com::sun::star::lang::IllegalArgumentException)
{
	OSL_TRACE("OResultSet::convertFastPropertyValue");
	switch (nHandle) {
		case PROPERTY_ID_ISBOOKMARKABLE:
		case PROPERTY_ID_CURSORNAME:
		case PROPERTY_ID_RESULTSETCONCURRENCY:
		case PROPERTY_ID_RESULTSETTYPE:
			throw ::com::sun::star::lang::IllegalArgumentException();
		case PROPERTY_ID_FETCHDIRECTION:
		case PROPERTY_ID_FETCHSIZE:
		default:
			;
	}
	return sal_False;
}
/* }}} */


/* {{{ OResultSet::setFastPropertyValue_NoBroadcast() -I- */
void OResultSet::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& /* rValue */)
	throw (Exception)
{
	OSL_TRACE("OResultSet::setFastPropertyValue_NoBroadcast");
	switch (nHandle) {
		case PROPERTY_ID_ISBOOKMARKABLE:
		case PROPERTY_ID_CURSORNAME:
		case PROPERTY_ID_RESULTSETCONCURRENCY:
		case PROPERTY_ID_RESULTSETTYPE:
			throw Exception();
		case PROPERTY_ID_FETCHDIRECTION:
			break;
		case PROPERTY_ID_FETCHSIZE:
			break;
		default:
			;
	}
}
/* }}} */


/* {{{ OResultSet::getFastPropertyValue() -I- */
void OResultSet::getFastPropertyValue(Any& _rValue, sal_Int32 nHandle) const
{
	OSL_TRACE("OResultSet::getFastPropertyValue");
	switch (nHandle) {
		case PROPERTY_ID_ISBOOKMARKABLE:
            _rValue <<= sal_False;
            break;
		case PROPERTY_ID_CURSORNAME:
            break;
		case PROPERTY_ID_RESULTSETCONCURRENCY:
            _rValue <<= ResultSetConcurrency::READ_ONLY;
            break;
		case PROPERTY_ID_RESULTSETTYPE:
            _rValue <<= ResultSetType::SCROLL_INSENSITIVE;
            break;
		case PROPERTY_ID_FETCHDIRECTION:
            _rValue <<= FetchDirection::FORWARD;
            break;
		case PROPERTY_ID_FETCHSIZE:
            _rValue <<= sal_Int32(50);
            break;
			;
		default:
			;
	}
}
/* }}} */


/* {{{ OResultSet::acquire() -I- */
void SAL_CALL OResultSet::acquire()
	throw()
{
	OSL_TRACE("OResultSet::acquire");
	OResultSet_BASE::acquire();
}
/* }}} */


/* {{{ OResultSet::release() -I- */
void SAL_CALL OResultSet::release()
	throw()
{
	OSL_TRACE("OResultSet::release");
	OResultSet_BASE::release();
}
/* }}} */


/* {{{ OResultSet::getPropertySetInfo() -I- */
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OResultSet::getPropertySetInfo() throw(::com::sun::star::uno::RuntimeException)
{
	OSL_TRACE("OResultSet::getPropertySetInfo");
	return (::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()));
}
/* }}} */


/* {{{ OResultSet::checkColumnIndex() -I- */
void OResultSet::checkColumnIndex(sal_Int32 index)
	throw (SQLException, RuntimeException)
{
	OSL_TRACE("OResultSet::checkColumnIndex");
	if ((index < 1 || index > (int) fieldCount)) {
		/* static object for efficiency or thread safety is a problem ? */
		OUString buf( RTL_CONSTASCII_USTRINGPARAM( "index out of range" ) );
		throw SQLException(buf, *this, OUString(), 1, Any());
	}
}
/* }}} */


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