/**************************************************************
 * 
 * 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 "TPrivilegesResultSet.hxx"

using namespace connectivity;
//------------------------------------------------------------------------------
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
//------------------------------------------------------------------------------
OResultSetPrivileges::OResultSetPrivileges( const Reference< XDatabaseMetaData>& _rxMeta
										   , const Any& catalog
										   , const ::rtl::OUString& schemaPattern
										   , const ::rtl::OUString& tableNamePattern)
										   : ODatabaseMetaDataResultSet(eTablePrivileges)
                                           , m_bResetValues(sal_True)
{
	osl_incrementInterlockedCount( &m_refCount );
	{
		::rtl::OUString sUserWorkingFor;
		static Sequence< ::rtl::OUString > sTableTypes;
		if ( sTableTypes.getLength() == 0 )
		{
			// we want all catalogues, all schemas, all tables
			sTableTypes.realloc(3);
			sTableTypes[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VIEW"));
			sTableTypes[1] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TABLE"));
			sTableTypes[2] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%"));	// just to be sure to include anything else ....
		}
		try
		{
			m_xTables = _rxMeta->getTables(catalog,schemaPattern,tableNamePattern,sTableTypes);
			m_xRow = Reference< XRow>(m_xTables,UNO_QUERY);

			sUserWorkingFor = _rxMeta->getUserName();
		}
		catch(Exception&)
		{
		}

		ODatabaseMetaDataResultSet::ORows aRows;
		static ODatabaseMetaDataResultSet::ORow aRow(8);
		aRow[5] = new ORowSetValueDecorator(sUserWorkingFor);
		aRow[6] = ODatabaseMetaDataResultSet::getSelectValue();
		aRow[7] = new ORowSetValueDecorator(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("YES")));
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getInsertValue();
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getDeleteValue();
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getUpdateValue();
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getCreateValue();
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getReadValue();
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getAlterValue();
		aRows.push_back(aRow);
		aRow[6] = ODatabaseMetaDataResultSet::getDropValue();
		aRows.push_back(aRow);
		aRow[6] = new ORowSetValueDecorator(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REFERENCE")));
		aRows.push_back(aRow);

		setRows(aRows);
	}
	osl_decrementInterlockedCount( &m_refCount );
}
//------------------------------------------------------------------------------
const ORowSetValue& OResultSetPrivileges::getValue(sal_Int32 columnIndex)
{
	switch(columnIndex)
	{
		case 1:
		case 2:
		case 3:
			if ( m_xRow.is() && m_bResetValues )
			{
				(*m_aRowsIter)[1] = new ORowSetValueDecorator(m_xRow->getString(1));
				if ( m_xRow->wasNull() )
					(*m_aRowsIter)[1]->setNull();
				(*m_aRowsIter)[2] = new ORowSetValueDecorator(m_xRow->getString(2));
				if ( m_xRow->wasNull() )
					(*m_aRowsIter)[2]->setNull();
				(*m_aRowsIter)[3] = new ORowSetValueDecorator(m_xRow->getString(3));
				if ( m_xRow->wasNull() )
					(*m_aRowsIter)[3]->setNull();

				m_bResetValues = sal_False;
			}
	}
	return ODatabaseMetaDataResultSet::getValue(columnIndex);
}
// -----------------------------------------------------------------------------
void SAL_CALL OResultSetPrivileges::disposing(void)
{
	ODatabaseMetaDataResultSet::disposing();
m_xTables.clear();
m_xRow.clear();
}
// -----------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSetPrivileges::next(  ) throw(SQLException, RuntimeException)
{
	::osl::MutexGuard aGuard( m_aMutex );
	checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed );

	sal_Bool bReturn = sal_False;
	if ( m_xTables.is() )
	{
		if ( m_bBOF )
		{
			m_bResetValues = sal_True;
			if ( !m_xTables->next() )
				return sal_False;
		}

        bReturn = ODatabaseMetaDataResultSet::next();
        if ( !bReturn )
		{
			m_bBOF = sal_False;
			m_bResetValues = bReturn = m_xTables->next();
		}
	}
	return bReturn;
}
// -----------------------------------------------------------------------------
