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