summaryrefslogtreecommitdiffstats
path: root/connectivity/source/sdbcx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--connectivity/source/sdbcx/VCatalog.cxx211
-rw-r--r--connectivity/source/sdbcx/VCollection.cxx582
-rw-r--r--connectivity/source/sdbcx/VColumn.cxx216
-rw-r--r--connectivity/source/sdbcx/VDescriptor.cxx105
-rw-r--r--connectivity/source/sdbcx/VGroup.cxx166
-rw-r--r--connectivity/source/sdbcx/VIndex.cxx200
-rw-r--r--connectivity/source/sdbcx/VIndexColumn.cxx102
-rw-r--r--connectivity/source/sdbcx/VKey.cxx203
-rw-r--r--connectivity/source/sdbcx/VKeyColumn.cxx107
-rw-r--r--connectivity/source/sdbcx/VTable.cxx305
-rw-r--r--connectivity/source/sdbcx/VUser.cxx175
-rw-r--r--connectivity/source/sdbcx/VView.cxx133
12 files changed, 2505 insertions, 0 deletions
diff --git a/connectivity/source/sdbcx/VCatalog.cxx b/connectivity/source/sdbcx/VCatalog.cxx
new file mode 100644
index 0000000000..b30519fcaa
--- /dev/null
+++ b/connectivity/source/sdbcx/VCatalog.cxx
@@ -0,0 +1,211 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <comphelper/types.hxx>
+#include <sdbcx/VCatalog.hxx>
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <com/sun/star/sdbc/XRow.hpp>
+#include <connectivity/sdbcx/VDescriptor.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <TConnection.hxx>
+#include <connectivity/dbtools.hxx>
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+IMPLEMENT_SERVICE_INFO(OCatalog,"com.sun.star.comp.connectivity.OCatalog","com.sun.star.sdbcx.DatabaseDefinition")
+
+OCatalog::OCatalog(const Reference< XConnection> &_xConnection) : OCatalog_BASE(m_aMutex)
+{
+ try
+ {
+ m_xMetaData = _xConnection->getMetaData();
+ }
+ catch(const Exception&)
+ {
+ OSL_FAIL("No Metadata available!");
+ }
+}
+
+OCatalog::~OCatalog()
+{
+}
+
+void SAL_CALL OCatalog::disposing()
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ if(m_pTables)
+ m_pTables->disposing();
+ if(m_pViews)
+ m_pViews->disposing();
+ if(m_pGroups)
+ m_pGroups->disposing();
+ if(m_pUsers)
+ m_pUsers->disposing();
+
+ OCatalog_BASE::disposing();
+}
+
+// XTablesSupplier
+Reference< XNameAccess > SAL_CALL OCatalog::getTables( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if(!m_pTables)
+ refreshTables();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pTables.get();
+}
+
+// XViewsSupplier
+Reference< XNameAccess > SAL_CALL OCatalog::getViews( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if(!m_pViews)
+ refreshViews();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pViews.get();
+}
+
+// XUsersSupplier
+Reference< XNameAccess > SAL_CALL OCatalog::getUsers( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if(!m_pUsers)
+ refreshUsers();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pUsers.get();
+}
+
+// XGroupsSupplier
+Reference< XNameAccess > SAL_CALL OCatalog::getGroups( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if(!m_pGroups)
+ refreshGroups();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pGroups.get();
+}
+
+OUString OCatalog::buildName(const Reference< XRow >& _xRow)
+{
+ OUString sCatalog = _xRow->getString(1);
+ if ( _xRow->wasNull() )
+ sCatalog.clear();
+ OUString sSchema = _xRow->getString(2);
+ if ( _xRow->wasNull() )
+ sSchema.clear();
+ OUString sTable = _xRow->getString(3);
+ if ( _xRow->wasNull() )
+ sTable.clear();
+
+ OUString sComposedName(
+ ::dbtools::composeTableName( m_xMetaData, sCatalog, sSchema, sTable, false, ::dbtools::EComposeRule::InDataManipulation ) );
+ return sComposedName;
+}
+
+void OCatalog::fillNames(Reference< XResultSet >& _xResult,::std::vector< OUString>& _rNames)
+{
+ if ( _xResult.is() )
+ {
+ _rNames.reserve(20);
+ Reference< XRow > xRow(_xResult,UNO_QUERY);
+ while ( _xResult->next() )
+ {
+ _rNames.push_back( buildName(xRow) );
+ }
+ xRow.clear();
+ ::comphelper::disposeComponent(_xResult);
+ }
+}
+
+void ODescriptor::construct()
+{
+ sal_Int32 nAttrib = isNew() ? 0 : css::beans::PropertyAttribute::READONLY;
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME), PROPERTY_ID_NAME ,nAttrib,&m_Name,::cppu::UnoType<OUString>::get());
+}
+
+ODescriptor::~ODescriptor()
+{
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VCollection.cxx b/connectivity/source/sdbcx/VCollection.cxx
new file mode 100644
index 0000000000..0fa6cace50
--- /dev/null
+++ b/connectivity/source/sdbcx/VCollection.cxx
@@ -0,0 +1,582 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+
+#include <algorithm>
+#include <com/sun/star/container/ElementExistException.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <connectivity/sdbcx/VDescriptor.hxx>
+#include <com/sun/star/sdbc/SQLException.hpp>
+#include <connectivity/dbexception.hxx>
+#include <comphelper/enumhelper.hxx>
+#include <comphelper/types.hxx>
+#include <comphelper/property.hxx>
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/exc_hlp.hxx>
+#include <o3tl/unreachable.hxx>
+#include <TConnection.hxx>
+#include <strings.hrc>
+#include <resource/sharedresources.hxx>
+
+using namespace connectivity::sdbcx;
+using namespace connectivity;
+using namespace comphelper;
+using namespace ::cppu;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::util;
+
+namespace
+{
+ template < typename T> class OHardRefMap : public connectivity::sdbcx::IObjectCollection
+ {
+ typedef std::multimap< OUString, T , ::comphelper::UStringMixLess> ObjectMap;
+ typedef typename ObjectMap::iterator ObjectIter;
+ typedef typename ObjectMap::value_type ObjectEntry;
+
+ // private:
+ // this combination of map and vector is used to have a fast name and index access
+ std::vector< ObjectIter > m_aElements; // hold the iterators which point to map
+ ObjectMap m_aNameMap; // hold the elements and a name
+ public:
+ OHardRefMap(bool _bCase)
+ : m_aNameMap(_bCase)
+ {
+ }
+
+ virtual bool exists(const OUString& _sName ) override
+ {
+ return m_aNameMap.find(_sName) != m_aNameMap.end();
+ }
+
+ virtual bool empty() override
+ {
+ return m_aNameMap.empty();
+ }
+
+ virtual void swapAll() override
+ {
+ std::vector< ObjectIter >(m_aElements).swap(m_aElements);
+ ObjectMap(m_aNameMap).swap(m_aNameMap);
+ }
+
+ virtual void swap() override
+ {
+ std::vector< ObjectIter >().swap(m_aElements);
+
+ OSL_ENSURE( m_aNameMap.empty(), "swap: what did disposeElements do?" );
+ ObjectMap( m_aNameMap ).swap( m_aNameMap );
+ // Note that it's /important/ to construct the new ObjectMap from m_aNameMap before
+ // swapping. This way, it's ensured that the compare object held by these maps is preserved
+ // during the swap. If we would not do this, the UStringMixLess instance which is used would be
+ // default constructed (instead of being constructed from the same instance in m_aNameMap), and
+ // it's case-sensitive flag would have an unpredictable value.
+ }
+
+ virtual void clear() override
+ {
+ m_aElements.clear();
+ m_aNameMap.clear();
+ }
+
+ virtual void insert(const OUString& _sName,const ObjectType& _xObject) override
+ {
+ m_aElements.push_back(m_aNameMap.insert(m_aNameMap.begin(), ObjectEntry(_sName,_xObject)));
+ }
+
+ virtual void reFill(const ::std::vector< OUString> &_rVector) override
+ {
+ OSL_ENSURE(m_aNameMap.empty(),"OCollection::reFill: collection isn't empty");
+ m_aElements.reserve(_rVector.size());
+
+ for (auto const& elem : _rVector)
+ m_aElements.push_back(m_aNameMap.insert(m_aNameMap.begin(), ObjectEntry(elem,ObjectType())));
+ }
+
+ virtual bool rename(const OUString& _sOldName, const OUString& _sNewName) override
+ {
+ bool bRet = false;
+ ObjectIter aIter = m_aNameMap.find(_sOldName);
+ if ( aIter != m_aNameMap.end() )
+ {
+ typename std::vector< ObjectIter >::iterator aFind = std::find(m_aElements.begin(),m_aElements.end(),aIter);
+ if(m_aElements.end() != aFind)
+ {
+ (*aFind) = m_aNameMap.insert(m_aNameMap.begin(), ObjectEntry(_sNewName,(*aFind)->second));
+ m_aNameMap.erase(aIter);
+
+ bRet = true;
+ }
+ }
+ return bRet;
+ }
+
+ virtual sal_Int32 size() override
+ {
+ return static_cast<sal_Int32>(m_aNameMap.size());
+ }
+
+ virtual Sequence< OUString > getElementNames() override
+ {
+ Sequence< OUString > aNameList(m_aElements.size());
+
+ OUString* pStringArray = aNameList.getArray();
+ for(const auto& rIter : m_aElements)
+ {
+ *pStringArray = rIter->first;
+ ++pStringArray;
+ }
+
+ return aNameList;
+ }
+
+ virtual OUString getName(sal_Int32 _nIndex) override
+ {
+ return m_aElements[_nIndex]->first;
+ }
+
+ virtual void disposeAndErase(sal_Int32 _nIndex) override
+ {
+ OSL_ENSURE(_nIndex >= 0 && _nIndex < static_cast<sal_Int32>(m_aElements.size()),"Illegal argument!");
+ Reference<XComponent> xComp(m_aElements[_nIndex]->second.get(),UNO_QUERY);
+ ::comphelper::disposeComponent(xComp);
+ m_aElements[_nIndex]->second = T();
+
+ OUString sName = m_aElements[_nIndex]->first;
+ m_aElements.erase(m_aElements.begin()+_nIndex);
+ m_aNameMap.erase(sName);
+ }
+
+ virtual void disposeElements() override
+ {
+ for (auto & name : m_aNameMap)
+ {
+ Reference<XComponent> xComp(name.second.get(),UNO_QUERY);
+ if ( xComp.is() )
+ {
+ ::comphelper::disposeComponent(xComp);
+ name.second = T();
+ }
+ }
+ m_aElements.clear();
+ m_aNameMap.clear();
+ }
+
+ virtual sal_Int32 findColumn( const OUString& columnName ) override
+ {
+ ObjectIter aIter = m_aNameMap.find(columnName);
+ OSL_ENSURE(aIter != m_aNameMap.end(),"findColumn:: Illegal name!");
+ return m_aElements.size() - (m_aElements.end() - std::find(m_aElements.begin(),m_aElements.end(),aIter));
+ }
+
+ virtual ObjectType getObject(sal_Int32 _nIndex) override
+ {
+ OSL_ENSURE(_nIndex >= 0 && _nIndex < static_cast<sal_Int32>(m_aElements.size()),"Illegal argument!");
+ return m_aElements[_nIndex]->second;
+ }
+
+ virtual ObjectType getObject(const OUString& columnName) override
+ {
+ return m_aNameMap.find(columnName)->second;
+ }
+
+ virtual void setObject(sal_Int32 _nIndex,const ObjectType& _xObject) override
+ {
+ OSL_ENSURE(_nIndex >= 0 && _nIndex < static_cast<sal_Int32>(m_aElements.size()),"Illegal argument!");
+ m_aElements[_nIndex]->second = _xObject;
+ }
+
+ bool isCaseSensitive() const override
+ {
+ return m_aNameMap.key_comp().isCaseSensitive();
+ }
+
+ };
+}
+
+IObjectCollection::~IObjectCollection() {}
+
+IMPLEMENT_SERVICE_INFO(OCollection,"com.sun.star.sdbcx.VContainer" , "com.sun.star.sdbcx.Container")
+
+OCollection::OCollection(::cppu::OWeakObject& _rParent
+ , bool _bCase
+ , ::osl::Mutex& _rMutex
+ , const ::std::vector< OUString> &_rVector
+ , bool _bUseIndexOnly
+ , bool _bUseHardRef)
+ :m_aContainerListeners(_rMutex)
+ ,m_aRefreshListeners(_rMutex)
+ ,m_rParent(_rParent)
+ ,m_rMutex(_rMutex)
+ ,m_bUseIndexOnly(_bUseIndexOnly)
+{
+ if ( _bUseHardRef )
+ {
+ m_pElements.reset(new OHardRefMap< ObjectType >(_bCase));
+ }
+ else
+ {
+ m_pElements.reset(new OHardRefMap< WeakReference< XPropertySet> >(_bCase));
+ }
+ m_pElements->reFill(_rVector);
+}
+
+OCollection::~OCollection()
+{
+}
+
+Any SAL_CALL OCollection::queryInterface( const Type & rType )
+{
+ if ( m_bUseIndexOnly && rType == cppu::UnoType<XNameAccess>::get() )
+ {
+ return Any();
+ }
+ return OCollectionBase::queryInterface( rType );
+}
+
+Sequence< Type > SAL_CALL OCollection::getTypes()
+{
+ if ( m_bUseIndexOnly )
+ {
+ Sequence< Type > aTypes(OCollectionBase::getTypes());
+ Type* pBegin = aTypes.getArray();
+ Type* pEnd = pBegin + aTypes.getLength();
+
+ std::vector<Type> aOwnTypes;
+ aOwnTypes.reserve(aTypes.getLength());
+ Type aType = cppu::UnoType<XNameAccess>::get();
+ for(;pBegin != pEnd; ++pBegin)
+ {
+ if ( *pBegin != aType )
+ aOwnTypes.push_back(*pBegin);
+ }
+ return Sequence< Type >(aOwnTypes.data(), aOwnTypes.size());
+ }
+ return OCollectionBase::getTypes( );
+}
+
+void OCollection::clear_NoDispose()
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+
+ m_pElements->clear();
+ m_pElements->swapAll();
+}
+
+
+void OCollection::disposing()
+{
+ m_aContainerListeners.disposeAndClear(EventObject(static_cast<XTypeProvider*>(this)));
+ m_aRefreshListeners.disposeAndClear(EventObject(static_cast<XTypeProvider*>(this)));
+
+ ::osl::MutexGuard aGuard(m_rMutex);
+
+ disposeElements();
+
+ m_pElements->swap();
+}
+
+Any SAL_CALL OCollection::getByIndex( sal_Int32 Index )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ if (Index < 0 || Index >= m_pElements->size() )
+ throw IndexOutOfBoundsException(OUString::number(Index),static_cast<XTypeProvider*>(this));
+
+ return Any(getObject(Index));
+}
+
+Any SAL_CALL OCollection::getByName( const OUString& aName )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+
+ if ( !m_pElements->exists(aName) )
+ {
+ ::connectivity::SharedResources aResources;
+ const OUString sError( aResources.getResourceStringWithSubstitution(
+ STR_NO_ELEMENT_NAME,
+ "$name$", aName
+ ) );
+ throw NoSuchElementException( sError, static_cast< XTypeProvider* >( this ) );
+ }
+
+ return Any(getObject(m_pElements->findColumn(aName)));
+}
+
+Sequence< OUString > SAL_CALL OCollection::getElementNames( )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ return m_pElements->getElementNames();
+}
+
+void SAL_CALL OCollection::refresh( )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+
+ disposeElements();
+
+ impl_refresh();
+ EventObject aEvt(static_cast<XTypeProvider*>(this));
+ m_aRefreshListeners.notifyEach( &XRefreshListener::refreshed, aEvt );
+}
+
+void OCollection::reFill(const ::std::vector< OUString> &_rVector)
+{
+ m_pElements->reFill(_rVector);
+}
+
+// XDataDescriptorFactory
+Reference< XPropertySet > SAL_CALL OCollection::createDataDescriptor( )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+
+ return createDescriptor();
+}
+
+OUString OCollection::getNameForObject(const ObjectType& _xObject)
+{
+ OSL_ENSURE(_xObject.is(),"OCollection::getNameForObject: Object is NULL!");
+ OUString sName;
+ _xObject->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= sName;
+ return sName;
+}
+
+// XAppend
+void SAL_CALL OCollection::appendByDescriptor( const Reference< XPropertySet >& descriptor )
+{
+ ::osl::ClearableMutexGuard aGuard(m_rMutex);
+
+ OUString sName = getNameForObject( descriptor );
+
+ if ( m_pElements->exists(sName) )
+ throw ElementExistException(sName,static_cast<XTypeProvider*>(this));
+
+ ObjectType xNewlyCreated = appendObject( sName, descriptor );
+ if ( !xNewlyCreated.is() )
+ throw RuntimeException();
+
+ ODescriptor* pDescriptor = dynamic_cast<ODescriptor*>( xNewlyCreated.get() );
+ if ( pDescriptor )
+ pDescriptor->setNew( false );
+
+ sName = getNameForObject( xNewlyCreated );
+ if ( !m_pElements->exists( sName ) ) // this may happen when the derived class included it itself
+ m_pElements->insert( sName, xNewlyCreated );
+
+ // notify our container listeners
+ ContainerEvent aEvent(static_cast<XContainer*>(this), Any(sName), Any(xNewlyCreated), Any());
+ aGuard.clear();
+ m_aContainerListeners.notifyEach( &XContainerListener::elementInserted, aEvent );
+}
+
+// XDrop
+void SAL_CALL OCollection::dropByName( const OUString& elementName )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+
+ if ( !m_pElements->exists(elementName) )
+ throw NoSuchElementException(elementName,static_cast<XTypeProvider*>(this));
+
+ dropImpl(m_pElements->findColumn(elementName));
+}
+
+void SAL_CALL OCollection::dropByIndex( sal_Int32 index )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ if(index <0 || index >= getCount())
+ throw IndexOutOfBoundsException(OUString::number(index),static_cast<XTypeProvider*>(this));
+
+ dropImpl(index);
+}
+
+void OCollection::dropImpl(sal_Int32 _nIndex, bool _bReallyDrop)
+{
+ OUString elementName = m_pElements->getName(_nIndex);
+
+ if ( _bReallyDrop )
+ dropObject(_nIndex,elementName);
+
+ m_pElements->disposeAndErase(_nIndex);
+
+ // notify our container listeners
+ notifyElementRemoved(elementName);
+}
+
+void OCollection::notifyElementRemoved(const OUString& _sName)
+{
+ ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_sName), Any(), Any());
+ // note that xExistent may be empty, in case somebody removed the data source while it is not alive at this moment
+ OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners);
+ while (aListenerLoop.hasMoreElements())
+ aListenerLoop.next()->elementRemoved(aEvent);
+}
+
+sal_Int32 SAL_CALL OCollection::findColumn( const OUString& columnName )
+{
+ if ( !m_pElements->exists(columnName) )
+ {
+ ::dbtools::throwInvalidColumnException( columnName, static_cast< XIndexAccess*>(this) );
+ O3TL_UNREACHABLE;
+ }
+
+ return m_pElements->findColumn(columnName) + 1; // because columns start at one
+}
+
+Reference< XEnumeration > SAL_CALL OCollection::createEnumeration( )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ return new OEnumerationByIndex( static_cast< XIndexAccess*>(this));
+}
+
+void SAL_CALL OCollection::addContainerListener( const Reference< XContainerListener >& _rxListener )
+{
+ m_aContainerListeners.addInterface(_rxListener);
+}
+
+
+void SAL_CALL OCollection::removeContainerListener( const Reference< XContainerListener >& _rxListener )
+{
+ m_aContainerListeners.removeInterface(_rxListener);
+}
+
+void SAL_CALL OCollection::acquire() noexcept
+{
+ m_rParent.acquire();
+}
+
+void SAL_CALL OCollection::release() noexcept
+{
+ m_rParent.release();
+}
+
+Type SAL_CALL OCollection::getElementType( )
+{
+ return cppu::UnoType<XPropertySet>::get();
+}
+
+sal_Bool SAL_CALL OCollection::hasElements( )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ return !m_pElements->empty();
+}
+
+sal_Int32 SAL_CALL OCollection::getCount( )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ return m_pElements->size();
+}
+
+sal_Bool SAL_CALL OCollection::hasByName( const OUString& aName )
+{
+ ::osl::MutexGuard aGuard(m_rMutex);
+ return m_pElements->exists(aName);
+}
+
+void SAL_CALL OCollection::addRefreshListener( const Reference< XRefreshListener >& l )
+{
+ m_aRefreshListeners.addInterface(l);
+}
+
+void SAL_CALL OCollection::removeRefreshListener( const Reference< XRefreshListener >& l )
+{
+ m_aRefreshListeners.removeInterface(l);
+}
+
+void OCollection::insertElement(const OUString& _sElementName,const ObjectType& _xElement)
+{
+ OSL_ENSURE(!m_pElements->exists(_sElementName),"Element already exists");
+ if ( !m_pElements->exists(_sElementName) )
+ m_pElements->insert(_sElementName,_xElement);
+}
+
+void OCollection::renameObject(const OUString& _sOldName, const OUString& _sNewName)
+{
+ OSL_ENSURE(m_pElements->exists(_sOldName),"Element doesn't exist");
+ OSL_ENSURE(!m_pElements->exists(_sNewName),"Element already exists");
+ OSL_ENSURE(!_sNewName.isEmpty(),"New name must not be empty!");
+ OSL_ENSURE(!_sOldName.isEmpty(),"Old name must not be empty!");
+
+ if ( m_pElements->rename(_sOldName,_sNewName) )
+ {
+ ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_sNewName), Any(m_pElements->getObject(_sNewName)),Any(_sOldName));
+ // note that xExistent may be empty, in case somebody removed the data source while it is not alive at this moment
+ OInterfaceIteratorHelper3 aListenerLoop(m_aContainerListeners);
+ while (aListenerLoop.hasMoreElements())
+ aListenerLoop.next()->elementReplaced(aEvent);
+ }
+}
+
+ObjectType OCollection::getObject(sal_Int32 _nIndex)
+{
+ ObjectType xName = m_pElements->getObject(_nIndex);
+ if ( !xName.is() )
+ {
+ try
+ {
+ xName = createObject(m_pElements->getName(_nIndex));
+ }
+ catch(const SQLException& e)
+ {
+ css::uno::Any anyEx = cppu::getCaughtException();
+ try
+ {
+ dropImpl(_nIndex,false);
+ }
+ catch(const Exception& )
+ {
+ }
+ throw WrappedTargetException(e.Message,static_cast<XTypeProvider*>(this),anyEx);
+ }
+ m_pElements->setObject(_nIndex,xName);
+ }
+ return xName;
+}
+
+void OCollection::disposeElements()
+{
+ m_pElements->disposeElements();
+}
+
+Reference< XPropertySet > OCollection::createDescriptor()
+{
+ OSL_FAIL("createDescriptor() needs to be overridden when used!");
+ throw SQLException();
+}
+
+ObjectType OCollection::cloneDescriptor( const ObjectType& _descriptor )
+{
+ ObjectType xNewDescriptor( createDescriptor() );
+ ::comphelper::copyProperties( _descriptor, xNewDescriptor );
+ return xNewDescriptor;
+}
+
+ObjectType OCollection::appendObject( const OUString& /*_rForName*/, const Reference< XPropertySet >& descriptor )
+{
+ return cloneDescriptor( descriptor );
+}
+
+void OCollection::dropObject(sal_Int32 /*_nPos*/, const OUString& /*_sElementName*/)
+{
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VColumn.cxx b/connectivity/source/sdbcx/VColumn.cxx
new file mode 100644
index 0000000000..ad9a52ed12
--- /dev/null
+++ b/connectivity/source/sdbcx/VColumn.cxx
@@ -0,0 +1,216 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <connectivity/sdbcx/VColumn.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <comphelper/sequence.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <TConnection.hxx>
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#include <utility>
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace cppu;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::sdbc;
+
+
+OUString SAL_CALL OColumn::getImplementationName( )
+{
+ if(isNew())
+ return "com.sun.star.sdbcx.VColumnDescriptor";
+ return "com.sun.star.sdbcx.VColumn";
+}
+
+css::uno::Sequence< OUString > SAL_CALL OColumn::getSupportedServiceNames( )
+{
+ return { isNew()?OUString("com.sun.star.sdbcx.ColumnDescriptor"):OUString("com.sun.star.sdbcx.Column") };
+}
+
+sal_Bool SAL_CALL OColumn::supportsService( const OUString& _rServiceName )
+{
+ return cppu::supportsService(this, _rServiceName);
+}
+
+OColumn::OColumn(bool _bCase)
+ :OColumnDescriptor_BASE(m_aMutex)
+ ,ODescriptor(OColumnDescriptor_BASE::rBHelper,_bCase,true)
+ ,m_IsNullable(ColumnValue::NULLABLE)
+ ,m_Precision(0)
+ ,m_Scale(0)
+ ,m_Type(0)
+ ,m_IsAutoIncrement(false)
+ ,m_IsRowVersion(false)
+ ,m_IsCurrency(false)
+{
+ construct();
+}
+
+OColumn::OColumn( const OUString& Name,
+ OUString TypeName,
+ OUString DefaultValue,
+ OUString Description,
+ sal_Int32 IsNullable,
+ sal_Int32 Precision,
+ sal_Int32 Scale,
+ sal_Int32 Type,
+ bool IsAutoIncrement,
+ bool IsRowVersion,
+ bool IsCurrency,
+ bool _bCase,
+ OUString CatalogName,
+ OUString SchemaName,
+ OUString TableName)
+ :OColumnDescriptor_BASE(m_aMutex)
+ ,ODescriptor(OColumnDescriptor_BASE::rBHelper,_bCase)
+ ,m_TypeName(std::move(TypeName))
+ ,m_Description(std::move(Description))
+ ,m_DefaultValue(std::move(DefaultValue))
+ ,m_IsNullable(IsNullable)
+ ,m_Precision(Precision)
+ ,m_Scale(Scale)
+ ,m_Type(Type)
+ ,m_IsAutoIncrement(IsAutoIncrement)
+ ,m_IsRowVersion(IsRowVersion)
+ ,m_IsCurrency(IsCurrency)
+ ,m_CatalogName(std::move(CatalogName))
+ ,m_SchemaName(std::move(SchemaName))
+ ,m_TableName(std::move(TableName))
+{
+ m_Name = Name;
+
+ construct();
+}
+
+OColumn::~OColumn()
+{
+}
+
+::cppu::IPropertyArrayHelper* OColumn::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper& SAL_CALL OColumn::getInfoHelper()
+{
+ return *OColumn_PROP::getArrayHelper(isNew() ? 1 : 0);
+}
+
+void SAL_CALL OColumn::acquire() noexcept
+{
+ OColumnDescriptor_BASE::acquire();
+}
+
+void SAL_CALL OColumn::release() noexcept
+{
+ OColumnDescriptor_BASE::release();
+}
+
+Any SAL_CALL OColumn::queryInterface( const Type & rType )
+{
+ Any aRet = ODescriptor::queryInterface( rType);
+ if(!aRet.hasValue())
+ {
+ if(!isNew())
+ aRet = OColumn_BASE::queryInterface(rType);
+ if(!aRet.hasValue())
+ aRet = OColumnDescriptor_BASE::queryInterface( rType);
+ }
+ return aRet;
+}
+
+Sequence< Type > SAL_CALL OColumn::getTypes( )
+{
+ if(isNew())
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OColumnDescriptor_BASE::getTypes());
+
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OColumn_BASE::getTypes(),OColumnDescriptor_BASE::getTypes());
+}
+
+void OColumn::construct()
+{
+ ODescriptor::construct();
+
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME), PROPERTY_ID_TYPENAME, nAttrib, &m_TypeName, cppu::UnoType<decltype(m_TypeName)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION), PROPERTY_ID_DESCRIPTION, nAttrib, &m_Description, cppu::UnoType<decltype(m_Description)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE), PROPERTY_ID_DEFAULTVALUE, nAttrib, &m_DefaultValue, cppu::UnoType<decltype(m_DefaultValue)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION), PROPERTY_ID_PRECISION, nAttrib, &m_Precision, cppu::UnoType<decltype(m_Precision)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE), PROPERTY_ID_TYPE, nAttrib, &m_Type, cppu::UnoType<decltype(m_Type)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE), PROPERTY_ID_SCALE, nAttrib, &m_Scale, cppu::UnoType<decltype(m_Scale)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE), PROPERTY_ID_ISNULLABLE, nAttrib, &m_IsNullable, cppu::UnoType<decltype(m_IsNullable)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT), PROPERTY_ID_ISAUTOINCREMENT, nAttrib, &m_IsAutoIncrement, cppu::UnoType<bool>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISROWVERSION), PROPERTY_ID_ISROWVERSION, nAttrib, &m_IsRowVersion, cppu::UnoType<bool>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY), PROPERTY_ID_ISCURRENCY, nAttrib, &m_IsCurrency, cppu::UnoType<bool>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOGNAME), PROPERTY_ID_CATALOGNAME, nAttrib, &m_CatalogName, cppu::UnoType<decltype(m_CatalogName)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCHEMANAME), PROPERTY_ID_SCHEMANAME, nAttrib, &m_SchemaName, cppu::UnoType<decltype(m_SchemaName)>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME), PROPERTY_ID_TABLENAME, nAttrib, &m_TableName, cppu::UnoType<decltype(m_TableName)>::get());
+}
+
+void OColumn::disposing()
+{
+ OPropertySetHelper::disposing();
+}
+
+Reference< XPropertySet > SAL_CALL OColumn::createDataDescriptor( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OColumnDescriptor_BASE::rBHelper.bDisposed);
+
+ rtl::Reference<OColumn> pNewColumn = new OColumn( m_Name,
+ m_TypeName,
+ m_DefaultValue,
+ m_Description,
+ m_IsNullable,
+ m_Precision,
+ m_Scale,
+ m_Type,
+ m_IsAutoIncrement,
+ m_IsRowVersion,
+ m_IsCurrency,
+ isCaseSensitive(),
+ m_CatalogName,
+ m_SchemaName,
+ m_TableName);
+ pNewColumn->setNew(true);
+ return pNewColumn;
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OColumn::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+// XNamed
+OUString SAL_CALL OColumn::getName( )
+{
+ return m_Name;
+}
+
+void SAL_CALL OColumn::setName( const OUString& aName )
+{
+ m_Name = aName;
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VDescriptor.cxx b/connectivity/source/sdbcx/VDescriptor.cxx
new file mode 100644
index 0000000000..c0f65c6024
--- /dev/null
+++ b/connectivity/source/sdbcx/VDescriptor.cxx
@@ -0,0 +1,105 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <connectivity/sdbcx/VDescriptor.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <comphelper/servicehelper.hxx>
+#include <cppuhelper/queryinterface.hxx>
+#include <cppuhelper/typeprovider.hxx>
+
+#include <algorithm>
+
+namespace connectivity::sdbcx
+{
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::beans;
+
+
+ // = ODescriptor
+
+
+ ODescriptor::ODescriptor(::cppu::OBroadcastHelper& _rBHelper, bool _bCase, bool _bNew)
+ :ODescriptor_PBASE(_rBHelper)
+ ,m_aCase(_bCase)
+ ,m_bNew(_bNew)
+ {
+ }
+
+
+ // css::lang::XUnoTunnel
+ namespace
+ {
+ struct ResetROAttribute
+ {
+ void operator ()( Property& _rProperty ) const
+ {
+ _rProperty.Attributes &= ~PropertyAttribute::READONLY;
+ }
+ };
+ struct SetROAttribute
+ {
+ void operator ()( Property& _rProperty ) const
+ {
+ _rProperty.Attributes |= PropertyAttribute::READONLY;
+ }
+ };
+ }
+
+
+ ::cppu::IPropertyArrayHelper* ODescriptor::doCreateArrayHelper() const
+ {
+ Sequence< Property > aProperties;
+ describeProperties( aProperties );
+
+ auto [begin, end] = asNonConstRange(aProperties);
+ if ( isNew() )
+ std::for_each( begin, end, ResetROAttribute() );
+ else
+ std::for_each( begin, end, SetROAttribute() );
+
+ return new ::cppu::OPropertyArrayHelper( aProperties );
+ }
+
+
+ bool ODescriptor::isNew( const Reference< XInterface >& _rxDescriptor )
+ {
+ ODescriptor* pImplementation = dynamic_cast<ODescriptor*>( _rxDescriptor.get() );
+ return pImplementation && pImplementation->isNew();
+ }
+
+
+ void ODescriptor::setNew(bool _bNew)
+ {
+ m_bNew = _bNew;
+ }
+
+
+ Sequence< Type > SAL_CALL ODescriptor::getTypes( )
+ {
+ ::cppu::OTypeCollection aTypes( cppu::UnoType<XMultiPropertySet>::get(),
+ cppu::UnoType<XFastPropertySet>::get(),
+ cppu::UnoType<XPropertySet>::get());
+ return aTypes.getTypes();
+ }
+
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VGroup.cxx b/connectivity/source/sdbcx/VGroup.cxx
new file mode 100644
index 0000000000..73f6aa79c5
--- /dev/null
+++ b/connectivity/source/sdbcx/VGroup.cxx
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+
+#include <sdbcx/VGroup.hxx>
+#include <comphelper/sequence.hxx>
+#include <connectivity/dbexception.hxx>
+
+
+using namespace ::connectivity::sdbcx;
+using namespace ::connectivity;
+using namespace ::dbtools;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::beans;
+
+IMPLEMENT_SERVICE_INFO(OGroup,"com.sun.star.sdbcx.VGroup","com.sun.star.sdbcx.Group");
+
+OGroup::OGroup(bool _bCase) : OGroup_BASE(m_aMutex)
+ , ODescriptor(OGroup_BASE::rBHelper,_bCase)
+{
+}
+
+OGroup::OGroup(const OUString& Name, bool _bCase) : OGroup_BASE(m_aMutex)
+ ,ODescriptor(OGroup_BASE::rBHelper,_bCase)
+{
+ m_Name = Name;
+}
+
+OGroup::~OGroup()
+{
+}
+
+Any SAL_CALL OGroup::queryInterface( const Type & rType )
+{
+ Any aRet = ODescriptor::queryInterface( rType);
+ return aRet.hasValue() ? aRet : OGroup_BASE::queryInterface( rType);
+}
+
+Sequence< Type > SAL_CALL OGroup::getTypes( )
+{
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OGroup_BASE::getTypes());
+}
+
+void OGroup::disposing()
+{
+ OPropertySetHelper::disposing();
+
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ if(m_pUsers)
+ m_pUsers->disposing();
+}
+
+::cppu::IPropertyArrayHelper* OGroup::createArrayHelper( ) const
+{
+ Sequence< Property > aProps;
+ describeProperties(aProps);
+ return new ::cppu::OPropertyArrayHelper(aProps);
+}
+
+::cppu::IPropertyArrayHelper & OGroup::getInfoHelper()
+{
+ return *getArrayHelper();
+}
+
+Reference< XNameAccess > SAL_CALL OGroup::getUsers( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OGroup_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if ( !m_pUsers )
+ refreshUsers();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pUsers.get();
+}
+
+
+sal_Int32 SAL_CALL OGroup::getPrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OGroup_BASE::rBHelper.bDisposed);
+
+ return 0;
+}
+
+sal_Int32 SAL_CALL OGroup::getGrantablePrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OGroup_BASE::rBHelper.bDisposed);
+
+ return 0;
+}
+
+void SAL_CALL OGroup::grantPrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/, sal_Int32 /*objPrivileges*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OGroup_BASE::rBHelper.bDisposed);
+ throwFeatureNotImplementedSQLException( "XAuthorizable::grantPrivileges", *this );
+}
+
+void SAL_CALL OGroup::revokePrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/, sal_Int32 /*objPrivileges*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OGroup_BASE::rBHelper.bDisposed);
+ throwFeatureNotImplementedSQLException( "XAuthorizable::revokePrivileges", *this );
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OGroup::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+OUString SAL_CALL OGroup::getName( )
+{
+ return m_Name;
+}
+
+void SAL_CALL OGroup::setName( const OUString& /*aName*/ )
+{
+ throwFeatureNotImplementedRuntimeException( "XNamed::setName", *this );
+}
+
+// XInterface
+void SAL_CALL OGroup::acquire() noexcept
+{
+ OGroup_BASE::acquire();
+}
+
+void SAL_CALL OGroup::release() noexcept
+{
+ OGroup_BASE::release();
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VIndex.cxx b/connectivity/source/sdbcx/VIndex.cxx
new file mode 100644
index 0000000000..af4977765b
--- /dev/null
+++ b/connectivity/source/sdbcx/VIndex.cxx
@@ -0,0 +1,200 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <sdbcx/VIndex.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <connectivity/dbexception.hxx>
+#include <comphelper/sequence.hxx>
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <TConnection.hxx>
+#include <utility>
+#include <comphelper/diagnose_ex.hxx>
+
+using namespace ::connectivity;
+using namespace ::dbtools;
+using namespace ::connectivity::sdbcx;
+using namespace ::cppu;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+
+OUString SAL_CALL OIndex::getImplementationName( )
+{
+ if(isNew())
+ return "com.sun.star.sdbcx.VIndexDescriptor";
+ return "com.sun.star.sdbcx.VIndex";
+}
+
+css::uno::Sequence< OUString > SAL_CALL OIndex::getSupportedServiceNames( )
+{
+ return { isNew()?OUString("com.sun.star.sdbcx.IndexDescriptor"):OUString("com.sun.star.sdbcx.Index") };
+}
+
+sal_Bool SAL_CALL OIndex::supportsService( const OUString& _rServiceName )
+{
+ return cppu::supportsService(this, _rServiceName);
+}
+
+OIndex::OIndex(bool _bCase) : ODescriptor_BASE(m_aMutex)
+ , ODescriptor(ODescriptor_BASE::rBHelper,_bCase,true)
+ ,m_IsUnique(false)
+ ,m_IsPrimaryKeyIndex(false)
+ ,m_IsClustered(false)
+{
+}
+
+OIndex::OIndex( const OUString& Name,
+ OUString Catalog,
+ bool _isUnique,
+ bool _isPrimaryKeyIndex,
+ bool _isClustered,
+ bool _bCase) : ODescriptor_BASE(m_aMutex)
+ ,ODescriptor(ODescriptor_BASE::rBHelper, _bCase)
+ ,m_Catalog(std::move(Catalog))
+ ,m_IsUnique(_isUnique)
+ ,m_IsPrimaryKeyIndex(_isPrimaryKeyIndex)
+ ,m_IsClustered(_isClustered)
+{
+ m_Name = Name;
+}
+
+OIndex::~OIndex( )
+{
+}
+
+::cppu::IPropertyArrayHelper* OIndex::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper& SAL_CALL OIndex::getInfoHelper()
+{
+ return *OIndex_PROP::getArrayHelper(isNew() ? 1 : 0);
+}
+
+Any SAL_CALL OIndex::queryInterface( const Type & rType )
+{
+ Any aRet = ODescriptor::queryInterface( rType);
+ if(!aRet.hasValue())
+ {
+ if(!isNew())
+ aRet = OIndex_BASE::queryInterface(rType);
+ if(!aRet.hasValue())
+ aRet = ODescriptor_BASE::queryInterface( rType);
+ }
+ return aRet;
+}
+
+Sequence< Type > SAL_CALL OIndex::getTypes( )
+{
+ if(isNew())
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),ODescriptor_BASE::getTypes());
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),ODescriptor_BASE::getTypes(),OIndex_BASE::getTypes());
+}
+
+void OIndex::construct()
+{
+ ODescriptor::construct();
+
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOG), PROPERTY_ID_CATALOG, nAttrib,&m_Catalog, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISUNIQUE), PROPERTY_ID_ISUNIQUE, nAttrib,&m_IsUnique, cppu::UnoType<bool>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISPRIMARYKEYINDEX),PROPERTY_ID_ISPRIMARYKEYINDEX, nAttrib,&m_IsPrimaryKeyIndex, cppu::UnoType<bool>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCLUSTERED), PROPERTY_ID_ISCLUSTERED, nAttrib,&m_IsClustered, cppu::UnoType<bool>::get());
+}
+
+void OIndex::disposing()
+{
+ OPropertySetHelper::disposing();
+
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ if(m_pColumns)
+ m_pColumns->disposing();
+}
+
+Reference< css::container::XNameAccess > SAL_CALL OIndex::getColumns( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(ODescriptor_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if ( !m_pColumns )
+ refreshColumns();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ TOOLS_WARN_EXCEPTION( "connectivity.commontools", "OIndex::getColumns" );
+ }
+
+ return m_pColumns.get();
+}
+
+Reference< XPropertySet > SAL_CALL OIndex::createDataDescriptor( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(ODescriptor_BASE::rBHelper.bDisposed);
+
+
+ return this;
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OIndex::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+OUString SAL_CALL OIndex::getName( )
+{
+ return m_Name;
+}
+
+void SAL_CALL OIndex::setName( const OUString& /*aName*/ )
+{
+}
+
+// XInterface
+void SAL_CALL OIndex::acquire() noexcept
+{
+ ODescriptor_BASE::acquire();
+}
+
+void SAL_CALL OIndex::release() noexcept
+{
+ ODescriptor_BASE::release();
+}
+
+void OIndex::refreshColumns()
+{
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VIndexColumn.cxx b/connectivity/source/sdbcx/VIndexColumn.cxx
new file mode 100644
index 0000000000..edd1ea93e9
--- /dev/null
+++ b/connectivity/source/sdbcx/VIndexColumn.cxx
@@ -0,0 +1,102 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <sdbcx/VIndexColumn.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <cppuhelper/supportsservice.hxx>
+#include <TConnection.hxx>
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+
+OUString SAL_CALL OIndexColumn::getImplementationName( )
+{
+ if(isNew())
+ return "com.sun.star.sdbcx.VIndexColumnDescriptor";
+ return "com.sun.star.sdbcx.VIndexColumn";
+}
+
+css::uno::Sequence< OUString > SAL_CALL OIndexColumn::getSupportedServiceNames( )
+{
+ return { isNew()?OUString("com.sun.star.sdbcx.IndexColumnDescriptor"):OUString("com.sun.star.sdbcx.IndexColumn") };
+}
+
+sal_Bool SAL_CALL OIndexColumn::supportsService( const OUString& _rServiceName )
+{
+ return cppu::supportsService(this, _rServiceName);
+}
+
+OIndexColumn::OIndexColumn(bool _bCase) : OColumn(_bCase), m_IsAscending(true)
+{
+ construct();
+}
+
+
+OIndexColumn::OIndexColumn( bool IsAscending,
+ const OUString& Name,
+ const OUString& TypeName,
+ const OUString& DefaultValue,
+ sal_Int32 IsNullable,
+ sal_Int32 Precision,
+ sal_Int32 Scale,
+ sal_Int32 Type,
+ bool _bCase,
+ const OUString& CatalogName,
+ const OUString& SchemaName,
+ const OUString& TableName
+ ) : OColumn(Name,
+ TypeName,
+ DefaultValue,
+ OUString(),
+ IsNullable,
+ Precision,
+ Scale,
+ Type,
+ false/*IsAutoIncrement*/,
+ false/*IsRowVersion*/,
+ false/*IsCurrency*/,
+ _bCase,
+ CatalogName,
+ SchemaName,
+ TableName)
+ , m_IsAscending(IsAscending)
+{
+ construct();
+}
+
+::cppu::IPropertyArrayHelper* OIndexColumn::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper& SAL_CALL OIndexColumn::getInfoHelper()
+{
+ return *OIndexColumn_PROP::getArrayHelper(isNew() ? 1 : 0);
+}
+
+void OIndexColumn::construct()
+{
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING), PROPERTY_ID_ISASCENDING, nAttrib,&m_IsAscending, cppu::UnoType<bool>::get());
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VKey.cxx b/connectivity/source/sdbcx/VKey.cxx
new file mode 100644
index 0000000000..2cf7bceb4d
--- /dev/null
+++ b/connectivity/source/sdbcx/VKey.cxx
@@ -0,0 +1,203 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <sdbcx/VKey.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/sdbc/KeyRule.hpp>
+#include <comphelper/sequence.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <TConnection.hxx>
+#include <utility>
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+
+OUString SAL_CALL OKey::getImplementationName( )
+{
+ if(isNew())
+ return "com.sun.star.sdbcx.VKeyDescriptor";
+ return "com.sun.star.sdbcx.VKey";
+}
+
+css::uno::Sequence< OUString > SAL_CALL OKey::getSupportedServiceNames( )
+{
+ return { isNew()?OUString("com.sun.star.sdbcx.KeyDescriptor"):OUString("com.sun.star.sdbcx.Key") };
+}
+
+sal_Bool SAL_CALL OKey::supportsService( const OUString& _rServiceName )
+{
+ return cppu::supportsService(this, _rServiceName);
+}
+
+OKey::OKey(bool _bCase) : ODescriptor_BASE(m_aMutex)
+ , ODescriptor(ODescriptor_BASE::rBHelper, _bCase, true)
+ , m_aProps(std::make_shared<KeyProperties>())
+{
+}
+
+OKey::OKey(const OUString& Name,std::shared_ptr<KeyProperties> _xProps, bool _bCase)
+: ODescriptor_BASE(m_aMutex)
+ ,ODescriptor(ODescriptor_BASE::rBHelper, _bCase)
+ ,m_aProps(std::move(_xProps))
+{
+ m_Name = Name;
+}
+//OKey::OKey( const OUString& _Name,
+// const OUString& _ReferencedTable,
+// sal_Int32 _Type,
+// sal_Int32 _UpdateRule,
+// sal_Int32 _DeleteRule,
+// sal_Bool _bCase) : ODescriptor_BASE(m_aMutex)
+// ,ODescriptor(ODescriptor_BASE::rBHelper,_bCase)
+// ,m_ReferencedTable(_ReferencedTable)
+// ,m_Type(_Type)
+// ,m_UpdateRule(_UpdateRule)
+// ,m_DeleteRule(_DeleteRule)
+// ,m_pColumns(NULL)
+//{
+// m_Name = _Name;
+//}
+
+OKey::~OKey( )
+{
+}
+
+Any SAL_CALL OKey::queryInterface( const Type & rType )
+{
+ Any aRet = ODescriptor::queryInterface( rType);
+ if(!aRet.hasValue())
+ {
+ if(!isNew())
+ aRet = OKey_BASE::queryInterface(rType);
+ if(!aRet.hasValue())
+ aRet = ODescriptor_BASE::queryInterface( rType);
+ }
+
+ return aRet;
+}
+
+Sequence< Type > SAL_CALL OKey::getTypes( )
+{
+ if(isNew())
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),ODescriptor_BASE::getTypes());
+
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),ODescriptor_BASE::getTypes(),OKey_BASE::getTypes());
+}
+
+void OKey::construct()
+{
+ ODescriptor::construct();
+
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REFERENCEDTABLE), PROPERTY_ID_REFERENCEDTABLE, nAttrib,&m_aProps->m_ReferencedTable, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE), PROPERTY_ID_TYPE, nAttrib,&m_aProps->m_Type, ::cppu::UnoType<sal_Int32>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_UPDATERULE), PROPERTY_ID_UPDATERULE, nAttrib,&m_aProps->m_UpdateRule, ::cppu::UnoType<sal_Int32>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DELETERULE), PROPERTY_ID_DELETERULE, nAttrib,&m_aProps->m_DeleteRule, ::cppu::UnoType<sal_Int32>::get());
+}
+
+void SAL_CALL OKey::disposing()
+{
+ OPropertySetHelper::disposing();
+
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ if(m_pColumns)
+ m_pColumns->disposing();
+
+ ODescriptor_BASE::disposing();
+}
+
+::cppu::IPropertyArrayHelper* OKey::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper & OKey::getInfoHelper()
+{
+ return *getArrayHelper(isNew() ? 1 : 0);
+}
+
+Reference< css::container::XNameAccess > SAL_CALL OKey::getColumns( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(ODescriptor_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if ( !m_pColumns )
+ refreshColumns();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pColumns.get();
+}
+
+Reference< XPropertySet > SAL_CALL OKey::createDataDescriptor( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(ODescriptor_BASE::rBHelper.bDisposed);
+
+
+ return this;
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OKey::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+OUString SAL_CALL OKey::getName( )
+{
+ return m_Name;
+}
+
+void SAL_CALL OKey::setName( const OUString& /*aName*/ )
+{
+}
+
+// XInterface
+void SAL_CALL OKey::acquire() noexcept
+{
+ ODescriptor_BASE::acquire();
+}
+
+void SAL_CALL OKey::release() noexcept
+{
+ ODescriptor_BASE::release();
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VKeyColumn.cxx b/connectivity/source/sdbcx/VKeyColumn.cxx
new file mode 100644
index 0000000000..e22620fb59
--- /dev/null
+++ b/connectivity/source/sdbcx/VKeyColumn.cxx
@@ -0,0 +1,107 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <sdbcx/VKeyColumn.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <cppuhelper/supportsservice.hxx>
+#include <TConnection.hxx>
+#include <utility>
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace cppu;
+
+OUString SAL_CALL OKeyColumn::getImplementationName( )
+{
+ if(isNew())
+ return "com.sun.star.sdbcx.VKeyColumnDescriptor";
+ return "com.sun.star.sdbcx.VKeyColumn";
+}
+
+css::uno::Sequence< OUString > SAL_CALL OKeyColumn::getSupportedServiceNames( )
+{
+ return { isNew()?OUString("com.sun.star.sdbcx.KeyColumnDescriptor"):OUString("com.sun.star.sdbcx.KeyColumn") };
+}
+
+sal_Bool SAL_CALL OKeyColumn::supportsService( const OUString& _rServiceName )
+{
+ return cppu::supportsService(this, _rServiceName);
+}
+
+OKeyColumn::OKeyColumn(bool _bCase) : OColumn(_bCase)
+{
+ construct();
+}
+
+OKeyColumn::OKeyColumn( OUString ReferencedColumn,
+ const OUString& Name,
+ const OUString& TypeName,
+ const OUString& DefaultValue,
+ sal_Int32 IsNullable,
+ sal_Int32 Precision,
+ sal_Int32 Scale,
+ sal_Int32 Type,
+ bool _bCase,
+ const OUString& CatalogName,
+ const OUString& SchemaName,
+ const OUString& TableName
+ ) : OColumn(Name,
+ TypeName,
+ DefaultValue,
+ OUString(),
+ IsNullable,
+ Precision,
+ Scale,
+ Type,
+ false/*IsAutoIncrement*/,
+ false/*IsRowVersion*/,
+ false/*IsCurrency*/,
+ _bCase,
+ CatalogName,
+ SchemaName,
+ TableName)
+ , m_ReferencedColumn(std::move(ReferencedColumn))
+{
+ construct();
+}
+
+OKeyColumn::~OKeyColumn()
+{
+}
+
+::cppu::IPropertyArrayHelper* OKeyColumn::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper& SAL_CALL OKeyColumn::getInfoHelper()
+{
+ return *OKeyColumn_PROP::getArrayHelper(isNew() ? 1 : 0);
+}
+
+void OKeyColumn::construct()
+{
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RELATEDCOLUMN), PROPERTY_ID_RELATEDCOLUMN, nAttrib,&m_ReferencedColumn, ::cppu::UnoType<OUString>::get());
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VTable.cxx b/connectivity/source/sdbcx/VTable.cxx
new file mode 100644
index 0000000000..f569d01bae
--- /dev/null
+++ b/connectivity/source/sdbcx/VTable.cxx
@@ -0,0 +1,305 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <connectivity/sdbcx/VTable.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <comphelper/sequence.hxx>
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <TConnection.hxx>
+#include <connectivity/dbtools.hxx>
+#include <connectivity/dbexception.hxx>
+#include <cppuhelper/supportsservice.hxx>
+#include <utility>
+
+using namespace ::connectivity;
+using namespace ::connectivity::sdbcx;
+using namespace ::dbtools;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+
+OUString SAL_CALL OTable::getImplementationName( )
+{
+ if(isNew())
+ return "com.sun.star.sdbcx.VTableDescriptor";
+ return "com.sun.star.sdbcx.Table";
+}
+
+
+css::uno::Sequence< OUString > SAL_CALL OTable::getSupportedServiceNames( )
+{
+ return { isNew()?OUString("com.sun.star.sdbcx.TableDescriptor"):OUString("com.sun.star.sdbcx.Table") };
+}
+
+sal_Bool SAL_CALL OTable::supportsService( const OUString& _rServiceName )
+{
+ return cppu::supportsService(this, _rServiceName);
+}
+
+OTable::OTable(OCollection* _pTables,
+ bool _bCase)
+ : OTableDescriptor_BASE(m_aMutex)
+ ,ODescriptor(OTableDescriptor_BASE::rBHelper,_bCase,true)
+ ,m_pTables(_pTables)
+{
+}
+
+OTable::OTable( OCollection* _pTables,
+ bool _bCase,
+ const OUString& Name, OUString Type,
+ OUString Description, OUString SchemaName,
+ OUString CatalogName) : OTableDescriptor_BASE(m_aMutex)
+ ,ODescriptor(OTableDescriptor_BASE::rBHelper,_bCase)
+ ,m_CatalogName(std::move(CatalogName))
+ ,m_SchemaName(std::move(SchemaName))
+ ,m_Description(std::move(Description))
+ ,m_Type(std::move(Type))
+ ,m_pTables(_pTables)
+{
+ m_Name = Name;
+}
+
+OTable::~OTable()
+{
+}
+
+void OTable::construct()
+{
+ ODescriptor::construct();
+
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOGNAME), PROPERTY_ID_CATALOGNAME,nAttrib,&m_CatalogName, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCHEMANAME), PROPERTY_ID_SCHEMANAME, nAttrib,&m_SchemaName, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION), PROPERTY_ID_DESCRIPTION,nAttrib,&m_Description, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE), PROPERTY_ID_TYPE, nAttrib,&m_Type, ::cppu::UnoType<OUString>::get());
+}
+
+void SAL_CALL OTable::acquire() noexcept
+{
+ OTableDescriptor_BASE::acquire();
+}
+
+void SAL_CALL OTable::release() noexcept
+{
+ OTableDescriptor_BASE::release();
+}
+
+
+Any SAL_CALL OTable::queryInterface( const Type & rType )
+{
+ Any aRet = ODescriptor::queryInterface( rType);
+ if(!aRet.hasValue())
+ {
+ if(!isNew())
+ aRet = OTable_BASE::queryInterface( rType);
+ if(isNew() && (rType == cppu::UnoType<XIndexesSupplier>::get()))
+ return Any();
+ if(!aRet.hasValue())
+ aRet = OTableDescriptor_BASE::queryInterface( rType);
+ }
+ return aRet;
+}
+
+Sequence< Type > SAL_CALL OTable::getTypes( )
+{
+ if(isNew())
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OTableDescriptor_BASE::getTypes());
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OTableDescriptor_BASE::getTypes(),OTable_BASE::getTypes());
+}
+
+void SAL_CALL OTable::disposing()
+{
+ ODescriptor::disposing();
+
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ if(m_xKeys)
+ m_xKeys->disposing();
+ if(m_xColumns)
+ m_xColumns->disposing();
+ if(m_xIndexes)
+ m_xIndexes->disposing();
+
+ m_pTables = nullptr;
+}
+
+// XColumnsSupplier
+Reference< XNameAccess > SAL_CALL OTable::getColumns( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if ( !m_xColumns )
+ refreshColumns();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_xColumns.get();
+}
+
+
+// XKeysSupplier
+Reference< XIndexAccess > SAL_CALL OTable::getKeys( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
+
+ Reference< XIndexAccess > xKeys;
+
+ try
+ {
+ if ( !m_xKeys )
+ refreshKeys();
+ xKeys = m_xKeys.get();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return xKeys;
+}
+
+cppu::IPropertyArrayHelper* OTable::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+cppu::IPropertyArrayHelper & OTable::getInfoHelper()
+{
+ return *getArrayHelper(isNew() ? 1 : 0);
+}
+
+Reference< XPropertySet > SAL_CALL OTable::createDataDescriptor( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
+
+ rtl::Reference<OTable> pTable = new OTable(m_pTables,isCaseSensitive(),m_Name,m_Type,m_Description,m_SchemaName,m_CatalogName);
+ pTable->setNew(true);
+ return pTable;
+}
+
+// XIndexesSupplier
+Reference< XNameAccess > SAL_CALL OTable::getIndexes( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if ( !m_xIndexes )
+ refreshIndexes();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_xIndexes.get();
+}
+
+// XRename
+void SAL_CALL OTable::rename( const OUString& newName )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
+
+ const OUString sOldComposedName = getName();
+ const Reference< XDatabaseMetaData> xMetaData = getMetaData();
+ if ( xMetaData.is() )
+ ::dbtools::qualifiedNameComponents(xMetaData,newName,m_CatalogName,m_SchemaName,m_Name,::dbtools::EComposeRule::InDataManipulation);
+ else
+ m_Name = newName;
+
+ m_pTables->renameObject(sOldComposedName,newName);
+}
+
+Reference< XDatabaseMetaData> OTable::getMetaData() const
+{
+ return nullptr;
+}
+
+// XAlterTable
+void SAL_CALL OTable::alterColumnByName( const OUString& /*colName*/, const Reference< XPropertySet >& /*descriptor*/ )
+{
+ throwFeatureNotImplementedSQLException( "XAlterTable::alterColumnByName", *this );
+}
+
+void SAL_CALL OTable::alterColumnByIndex( sal_Int32 /*index*/, const Reference< XPropertySet >& /*descriptor*/ )
+{
+ throwFeatureNotImplementedSQLException( "XAlterTable::alterColumnByIndex", *this );
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OTable::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+OUString SAL_CALL OTable::getName()
+{
+ // this is only correct for tables who haven't a schema or catalog name
+ OSL_ENSURE(m_CatalogName.isEmpty(),"getName(): forgot to override getName()!");
+ OSL_ENSURE(m_SchemaName.isEmpty(),"getName(): forgot to override getName()!");
+ return m_Name;
+}
+
+void SAL_CALL OTable::setName( const OUString& /*aName*/ )
+{
+}
+
+void OTable::refreshColumns()
+{
+}
+
+void OTable::refreshKeys()
+{
+}
+
+void OTable::refreshIndexes()
+{
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VUser.cxx b/connectivity/source/sdbcx/VUser.cxx
new file mode 100644
index 0000000000..51d05b9387
--- /dev/null
+++ b/connectivity/source/sdbcx/VUser.cxx
@@ -0,0 +1,175 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+
+#include <sdbcx/VUser.hxx>
+#include <connectivity/sdbcx/VCollection.hxx>
+#include <connectivity/dbexception.hxx>
+#include <comphelper/sequence.hxx>
+#include <o3tl/unreachable.hxx>
+
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+IMPLEMENT_SERVICE_INFO(OUser,"com.sun.star.sdbcx.VUser","com.sun.star.sdbcx.User");
+
+OUser::OUser(bool _bCase) : OUser_BASE(m_aMutex)
+ , ODescriptor(OUser_BASE::rBHelper,_bCase,true)
+{
+}
+
+OUser::OUser(const OUString& Name, bool _bCase) : OUser_BASE(m_aMutex)
+ ,ODescriptor(OUser_BASE::rBHelper,_bCase)
+{
+ m_Name = Name;
+}
+
+OUser::~OUser( )
+{
+}
+
+void OUser::disposing()
+{
+ OPropertySetHelper::disposing();
+ ::osl::MutexGuard aGuard(m_aMutex);
+ if(m_pGroups)
+ m_pGroups->disposing();
+}
+
+Any SAL_CALL OUser::queryInterface( const Type & rType )
+{
+ Any aRet = ODescriptor::queryInterface( rType);
+ return aRet.hasValue() ? aRet : OUser_BASE::queryInterface( rType);
+}
+
+Sequence< Type > SAL_CALL OUser::getTypes( )
+{
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OUser_BASE::getTypes());
+}
+
+::cppu::IPropertyArrayHelper* OUser::createArrayHelper( ) const
+{
+ Sequence< Property > aProps;
+ describeProperties(aProps);
+ return new ::cppu::OPropertyArrayHelper(aProps);
+
+}
+
+::cppu::IPropertyArrayHelper & OUser::getInfoHelper()
+{
+ return *getArrayHelper();
+}
+
+// XUser
+void SAL_CALL OUser::changePassword( const OUString& /*objPassword*/, const OUString& /*newPassword*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OUser_BASE::rBHelper.bDisposed);
+ ::dbtools::throwFeatureNotImplementedSQLException( "XUser::changePassword", *this );
+}
+
+// XGroupsSupplier
+Reference< XNameAccess > SAL_CALL OUser::getGroups( )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OUser_BASE::rBHelper.bDisposed);
+
+ try
+ {
+ if ( !m_pGroups )
+ refreshGroups();
+ }
+ catch( const RuntimeException& )
+ {
+ // allowed to leave this method
+ throw;
+ }
+ catch( const Exception& )
+ {
+ // allowed
+ }
+
+ return m_pGroups.get();
+}
+
+sal_Int32 SAL_CALL OUser::getPrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OUser_BASE::rBHelper.bDisposed);
+ ::dbtools::throwFeatureNotImplementedSQLException( "XAuthorizable::changePassword", *this );
+ O3TL_UNREACHABLE;
+}
+
+sal_Int32 SAL_CALL OUser::getGrantablePrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OUser_BASE::rBHelper.bDisposed);
+ ::dbtools::throwFeatureNotImplementedSQLException( "XAuthorizable::getGrantablePrivileges", *this );
+ O3TL_UNREACHABLE;
+}
+
+void SAL_CALL OUser::grantPrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/, sal_Int32 /*objPrivileges*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OUser_BASE::rBHelper.bDisposed);
+ ::dbtools::throwFeatureNotImplementedSQLException( "XAuthorizable::grantPrivileges", *this );
+}
+
+void SAL_CALL OUser::revokePrivileges( const OUString& /*objName*/, sal_Int32 /*objType*/, sal_Int32 /*objPrivileges*/ )
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+ checkDisposed(OUser_BASE::rBHelper.bDisposed);
+ ::dbtools::throwFeatureNotImplementedSQLException( "XAuthorizable::revokePrivileges", *this );
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OUser::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+OUString SAL_CALL OUser::getName( )
+{
+ return m_Name;
+}
+
+void SAL_CALL OUser::setName( const OUString& /*aName*/ )
+{
+ OSL_FAIL( "OUser::setName: not implemented!" );
+ // not allowed to throw an SQLException here ...
+}
+
+// XInterface
+void SAL_CALL OUser::acquire() noexcept
+{
+ OUser_BASE::acquire();
+}
+
+void SAL_CALL OUser::release() noexcept
+{
+ OUser_BASE::release();
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/sdbcx/VView.cxx b/connectivity/source/sdbcx/VView.cxx
new file mode 100644
index 0000000000..aa016c0e58
--- /dev/null
+++ b/connectivity/source/sdbcx/VView.cxx
@@ -0,0 +1,133 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <connectivity/sdbcx/VView.hxx>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <comphelper/sequence.hxx>
+#include <connectivity/dbtools.hxx>
+#include <TConnection.hxx>
+#include <utility>
+
+
+using namespace connectivity;
+using namespace connectivity::sdbcx;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
+
+IMPLEMENT_SERVICE_INFO(OView,"com.sun.star.sdbcx.VView","com.sun.star.sdbcx.View");
+
+OView::OView(bool _bCase,
+ const OUString& Name,
+ css::uno::Reference< css::sdbc::XDatabaseMetaData > _xMetaData,
+ OUString Command,
+ OUString SchemaName,
+ OUString CatalogName) : ODescriptor(::comphelper::OMutexAndBroadcastHelper::m_aBHelper,_bCase)
+ ,m_CatalogName(std::move(CatalogName))
+ ,m_SchemaName(std::move(SchemaName))
+ ,m_Command(std::move(Command))
+ ,m_CheckOption(0)
+ ,m_xMetaData(std::move(_xMetaData))
+
+{
+ m_Name = Name;
+ construct();
+}
+
+OView::OView(bool _bCase, css::uno::Reference< css::sdbc::XDatabaseMetaData > _xMetaData)
+ : ODescriptor(::comphelper::OMutexAndBroadcastHelper::m_aBHelper, _bCase, true)
+ ,m_xMetaData(std::move(_xMetaData))
+{
+ construct();
+}
+
+OView::~OView()
+{
+}
+
+void OView::construct()
+{
+ ODescriptor::construct();
+
+ sal_Int32 nAttrib = isNew() ? 0 : PropertyAttribute::READONLY;
+
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOGNAME), PROPERTY_ID_CATALOGNAME,nAttrib,&m_CatalogName, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCHEMANAME), PROPERTY_ID_SCHEMANAME, nAttrib,&m_SchemaName, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_COMMAND), PROPERTY_ID_COMMAND, nAttrib,&m_Command, ::cppu::UnoType<OUString>::get());
+ registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CHECKOPTION), PROPERTY_ID_CHECKOPTION,nAttrib,&m_CheckOption, ::cppu::UnoType<sal_Int32>::get());
+}
+
+Sequence< Type > SAL_CALL OView::getTypes( )
+{
+ return ::comphelper::concatSequences(ODescriptor::getTypes(),OView_BASE::getTypes());
+}
+
+Any SAL_CALL OView::queryInterface( const Type & rType )
+{
+ Any aRet = OView_BASE::queryInterface( rType);
+ return aRet.hasValue() ? aRet : ODescriptor::queryInterface( rType);
+}
+
+::cppu::IPropertyArrayHelper* OView::createArrayHelper( sal_Int32 /*_nId*/ ) const
+{
+ return doCreateArrayHelper();
+}
+
+::cppu::IPropertyArrayHelper & OView::getInfoHelper()
+{
+ return *getArrayHelper(isNew() ? 1 : 0);
+}
+
+OUString SAL_CALL OView::getName()
+{
+ OUString sComposedName;
+ if(m_xMetaData.is())
+ sComposedName = ::dbtools::composeTableName( m_xMetaData, m_CatalogName, m_SchemaName, m_Name, false, ::dbtools::EComposeRule::InDataManipulation );
+ else
+ {
+ Any aValue;
+ getFastPropertyValue(aValue,PROPERTY_ID_NAME);
+ aValue >>= sComposedName;
+ }
+ return sComposedName;
+}
+
+css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL OView::getPropertySetInfo( )
+{
+ return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
+}
+
+void SAL_CALL OView::setName( const OUString& )
+{
+}
+
+void SAL_CALL OView::acquire() noexcept
+{
+ OView_BASE::acquire();
+}
+
+void SAL_CALL OView::release() noexcept
+{
+ OView_BASE::release();
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */