diff options
Diffstat (limited to 'include/connectivity')
53 files changed, 8293 insertions, 0 deletions
diff --git a/include/connectivity/BlobHelper.hxx b/include/connectivity/BlobHelper.hxx new file mode 100644 index 000000000000..6788a17b10df --- /dev/null +++ b/include/connectivity/BlobHelper.hxx @@ -0,0 +1,44 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_BLOBHELPER_HXX_ +#define _CONNECTIVITY_BLOBHELPER_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include <com/sun/star/sdbc/XBlob.hpp> +#include <cppuhelper/implbase1.hxx> + +namespace connectivity +{ + class OOO_DLLPUBLIC_DBTOOLS BlobHelper : public ::cppu::WeakImplHelper1< com::sun::star::sdbc::XBlob > + { + ::com::sun::star::uno::Sequence< sal_Int8 > m_aValue; + public: + BlobHelper(const ::com::sun::star::uno::Sequence< sal_Int8 >& _val); + private: + virtual ::sal_Int64 SAL_CALL length( ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::sal_Int8 > SAL_CALL getBytes( ::sal_Int64 pos, ::sal_Int32 length ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getBinaryStream( ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::sal_Int64 SAL_CALL position( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& pattern, ::sal_Int64 start ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::sal_Int64 SAL_CALL positionOfBlob( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& pattern, ::sal_Int64 start ) throw (::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + }; +} + +#endif //_CONNECTIVITY_BLOBHELPER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/CommonTools.hxx b/include/connectivity/CommonTools.hxx new file mode 100644 index 000000000000..c13b97dc7050 --- /dev/null +++ b/include/connectivity/CommonTools.hxx @@ -0,0 +1,215 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_COMMONTOOLS_HXX_ +#define _CONNECTIVITY_COMMONTOOLS_HXX_ + +#include <rtl/ref.hxx> +#include <rtl/ustring.hxx> +#include <com/sun/star/lang/DisposedException.hpp> +#include <com/sun/star/uno/Any.hxx> +#ifndef _VECTOR_ +#include <vector> +#endif +#include <cppuhelper/weakref.hxx> +#include <comphelper/stl_types.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <osl/interlck.h> +#include <com/sun/star/uno/XComponentContext.hpp> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace com { namespace sun { namespace star { namespace util { + struct Date; + struct DateTime; + struct Time; +} +}}} + +#ifdef SOLAR_JAVA +namespace jvmaccess { class VirtualMachine; } +#endif + +namespace connectivity +{ + //------------------------------------------------------------------------------ + OOO_DLLPUBLIC_DBTOOLS sal_Bool match(const sal_Unicode* pWild, const sal_Unicode* pStr, const sal_Unicode cEscape); + inline sal_Bool match(const OUString &rWild, const OUString &rStr, const sal_Unicode cEscape) + { + return match(rWild.getStr(), rStr.getStr(), cEscape); + } + //------------------------------------------------------------------------------ + OOO_DLLPUBLIC_DBTOOLS OUString toDateString(const ::com::sun::star::util::Date& rDate); + OOO_DLLPUBLIC_DBTOOLS OUString toTimeString(const ::com::sun::star::util::Time& rTime); + OOO_DLLPUBLIC_DBTOOLS OUString toDateTimeString(const ::com::sun::star::util::DateTime& rDateTime); + + // typedefs + typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier> OSQLTable; + + DECLARE_STL_MAP(OUString,OSQLTable,comphelper::UStringMixLess, OSQLTables); + + // ------------------------------------------------------------------------- + // class ORefVector allows reference counting on a std::vector + // ------------------------------------------------------------------------- + template< class VectorVal > class ORefVector + { + std::vector< VectorVal > m_vector; + oslInterlockedCount m_refCount; + + protected: + virtual ~ORefVector(){} + public: + typedef std::vector< VectorVal > Vector; + + ORefVector() : m_refCount(0) {} + ORefVector(size_t _st) : m_vector(_st) , m_refCount(0) {} + ORefVector(const ORefVector& _rRH) : m_vector(_rRH.m_vector),m_refCount(0) + { + } + ORefVector& operator=(const ORefVector& _rRH) + { + if ( &_rRH != this ) + { + m_vector = _rRH.m_vector; + } + return *this; + } + + std::vector< VectorVal > & get() { return m_vector; } + std::vector< VectorVal > const & get() const { return m_vector; } + + inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(()) + { return ::rtl_allocateMemory( nSize ); } + inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(()) + { ::rtl_freeMemory( pMem ); } + inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW(()) + { return pMem; } + inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW(()) + {} + + void acquire() + { + osl_atomic_increment( &m_refCount ); + } + void release() + { + if (! osl_atomic_decrement( &m_refCount )) + delete this; + } + + }; + // ------------------------------------------------------------------------- + // class ORowVector incudes refcounting and initialze himself + // with at least one element. This first element is reserved for + // the bookmark + // ------------------------------------------------------------------------- + template< class VectorVal > class ORowVector : public ORefVector< VectorVal > + { + public: + ORowVector() : ORefVector< VectorVal >(1){} + ORowVector(size_t _st) : ORefVector< VectorVal >(_st+1) + {} + }; + + typedef ORefVector< ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> > OSQLColumns; + + // ======================================================================================= + // search from __first to __last the column with the name _rVal + // when no such column exist __last is returned + OOO_DLLPUBLIC_DBTOOLS + OSQLColumns::Vector::const_iterator find( OSQLColumns::Vector::const_iterator __first, + OSQLColumns::Vector::const_iterator __last, + const OUString& _rVal, + const ::comphelper::UStringMixEqual& _rCase); + // ======================================================================================= + // search from __first to __last the column with the realname _rVal + // when no such column exist __last is returned + OOO_DLLPUBLIC_DBTOOLS + OSQLColumns::Vector::const_iterator findRealName( OSQLColumns::Vector::const_iterator __first, + OSQLColumns::Vector::const_iterator __last, + const OUString& _rVal, + const ::comphelper::UStringMixEqual& _rCase); + + // ======================================================================================= + // the first two find methods are much faster than the one below + // ======================================================================================= + // search from __first to __last the column with the property _rProp equals the value _rVal + // when no such column exist __last is returned + OOO_DLLPUBLIC_DBTOOLS + OSQLColumns::Vector::const_iterator find( OSQLColumns::Vector::const_iterator __first, + OSQLColumns::Vector::const_iterator __last, + const OUString& _rProp, + const OUString& _rVal, + const ::comphelper::UStringMixEqual& _rCase); + + OOO_DLLPUBLIC_DBTOOLS void checkDisposed(sal_Bool _bThrow) throw ( ::com::sun::star::lang::DisposedException ); + +#ifdef SOLAR_JAVA + /** creates a java virtual machine + @param _rxContext + The ORB. + @return + The JavaVM. + */ + OOO_DLLPUBLIC_DBTOOLS ::rtl::Reference< jvmaccess::VirtualMachine > getJavaVM(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext); + + /** return <TRUE/> if the java class exists, otherwise <FALSE/>. + @param _pJVM + The JavaVM. + @param _sClassName + The class name to look for. + */ + OOO_DLLPUBLIC_DBTOOLS sal_Bool existsJavaClassByName( const ::rtl::Reference< jvmaccess::VirtualMachine >& _pJVM,const OUString& _sClassName ); +#endif +} + +//================================================================================== + +#define DECLARE_SERVICE_INFO() \ + virtual OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); \ + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); \ + virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + +#define IMPLEMENT_SERVICE_INFO(classname, implasciiname, serviceasciiname) \ + OUString SAL_CALL classname::getImplementationName( ) throw (::com::sun::star::uno::RuntimeException) \ + { \ + return OUString::createFromAscii(implasciiname); \ + } \ + ::com::sun::star::uno::Sequence< OUString > SAL_CALL classname::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) \ + { \ + ::com::sun::star::uno::Sequence< OUString > aSupported(1); \ + aSupported[0] = OUString::createFromAscii(serviceasciiname); \ + return aSupported; \ + } \ + sal_Bool SAL_CALL classname::supportsService( const OUString& _rServiceName ) throw(::com::sun::star::uno::RuntimeException) \ + { \ + 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; \ + } \ + +//================================================================================== + +#endif // _CONNECTIVITY_COMMONTOOLS_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/ConnectionWrapper.hxx b/include/connectivity/ConnectionWrapper.hxx new file mode 100644 index 000000000000..84a828800a9c --- /dev/null +++ b/include/connectivity/ConnectionWrapper.hxx @@ -0,0 +1,92 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_ZCONNECTIONWRAPPER_HXX_ +#define _CONNECTIVITY_ZCONNECTIONWRAPPER_HXX_ + +#include <cppuhelper/implbase2.hxx> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/lang/XUnoTunnel.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <comphelper/broadcasthelper.hxx> +#include "connectivity/CommonTools.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + + //========================================================================== + //= OConnectionWrapper - wraps all methods to the real connection from the driver + //= but when disposed it doesn't dispose the real connection + //========================================================================== + typedef ::cppu::ImplHelper2< ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::lang::XUnoTunnel + > OConnection_BASE; + + class OOO_DLLPUBLIC_DBTOOLS OConnectionWrapper : public OConnection_BASE + { + protected: + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation > m_xProxyConnection; + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > m_xConnection; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider > m_xTypeProvider; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > m_xUnoTunnel; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XServiceInfo > m_xServiceInfo; + + virtual ~OConnectionWrapper(); + void setDelegation(::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >& _rxProxyConnection,oslInterlockedCount& _rRefCount); + void setDelegation(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection + ,const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext + ,oslInterlockedCount& _rRefCount); + // must be called from derived classes + void disposing(); + public: + OConnectionWrapper( ); + + // XServiceInfo + DECLARE_SERVICE_INFO(); + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& _rType ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw (::com::sun::star::uno::RuntimeException); + + // com::sun::star::lang::XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Sequence< sal_Int8 > getUnoTunnelImplementationId(); + /** method to create unique ids + @param _rURL + The URL. + @param _rInfo + The info property of the datasource. It will be resorted if needed. + @param _pBuffer + Here we store the digest. Must not NULL. + @param _rUserName + The user name. + @param _rPassword + The password. + */ + static void createUniqueId( const OUString& _rURL + ,::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rInfo + ,sal_uInt8* _pBuffer + ,const OUString& _rUserName = OUString() + ,const OUString& _rPassword = OUString()); + }; +} +#endif // _CONNECTIVITY_ZCONNECTIONWRAPPER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/DriversConfig.hxx b/include/connectivity/DriversConfig.hxx new file mode 100644 index 000000000000..69c28cacbb02 --- /dev/null +++ b/include/connectivity/DriversConfig.hxx @@ -0,0 +1,80 @@ +/* -*- 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 . + */ +#ifndef CONNECTIVITY_DRIVERSCONFIG_HXX_INCLUDED +#define CONNECTIVITY_DRIVERSCONFIG_HXX_INCLUDED + +#include <comphelper/stl_types.hxx> +#include <com/sun/star/beans/NamedValue.hpp> +#include <com/sun/star/uno/Sequence.h> +#include "connectivity/dbtoolsdllapi.hxx" +#include <salhelper/singletonref.hxx> +#include <comphelper/namedvaluecollection.hxx> +#include <unotools/confignode.hxx> + +namespace connectivity +{ + typedef struct + { + ::comphelper::NamedValueCollection aProperties; + ::comphelper::NamedValueCollection aFeatures; + ::comphelper::NamedValueCollection aMetaData; + OUString sDriverFactory; + OUString sDriverTypeDisplayName; + } TInstalledDriver; + DECLARE_STL_USTRINGACCESS_MAP( TInstalledDriver, TInstalledDrivers); + + class DriversConfigImpl + { + mutable ::utl::OConfigurationTreeRoot m_aInstalled; + mutable TInstalledDrivers m_aDrivers; + void Load(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxORB) const; + public: + DriversConfigImpl(); + + const TInstalledDrivers& getInstalledDrivers(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxORB) const { Load(_rxORB); return m_aDrivers; } + }; + // + // Allows to access all driver which are located in the configuration + // + class OOO_DLLPUBLIC_DBTOOLS DriversConfig + { + typedef salhelper::SingletonRef<DriversConfigImpl> OSharedConfigNode; + + const ::comphelper::NamedValueCollection& impl_get(const OUString& _sURL,sal_Int32 _nProps) const; + public: + DriversConfig(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxORB); + ~DriversConfig(); + + DriversConfig( const DriversConfig& ); + DriversConfig& operator=( const DriversConfig& ); + + OUString getDriverFactoryName(const OUString& _sUrl) const; + OUString getDriverTypeDisplayName(const OUString& _sUrl) const; + const ::comphelper::NamedValueCollection& getProperties(const OUString& _sURL) const; + const ::comphelper::NamedValueCollection& getFeatures(const OUString& _sURL) const; + const ::comphelper::NamedValueCollection& getMetaData(const OUString& _sURL) const; + ::com::sun::star::uno::Sequence< OUString > getURLs() const; + private: + OSharedConfigNode m_aNode; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xORB; + }; +} +#endif // CONNECTIVITY_DRIVERSCONFIG_HXX_INCLUDED + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/FValue.hxx b/include/connectivity/FValue.hxx new file mode 100644 index 000000000000..34e73612bfa1 --- /dev/null +++ b/include/connectivity/FValue.hxx @@ -0,0 +1,539 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_FILE_VALUE_HXX_ +#define _CONNECTIVITY_FILE_VALUE_HXX_ + +#include <com/sun/star/sdbc/DataType.hpp> +#include <com/sun/star/uno/Any.hxx> +#include <rtl/ustring.hxx> +#include <salhelper/simplereferenceobject.hxx> +#include <osl/diagnose.h> +#include <comphelper/stl_types.hxx> +#include <rtl/ref.hxx> +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/CommonTools.hxx" +#include <com/sun/star/util/DateTime.hpp> +#include <com/sun/star/util/Date.hpp> +#include <com/sun/star/util/Time.hpp> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdb/XColumn.hpp> + +namespace connectivity +{ + namespace detail + { + class IValueSource; + } + + class OOO_DLLPUBLIC_DBTOOLS ORowSetValue + { + union + { + bool m_bBool; + + sal_Int8 m_nInt8; + sal_uInt8 m_uInt8; + + sal_Int16 m_nInt16; + sal_uInt16 m_uInt16; + + sal_Int32 m_nInt32; + sal_uInt32 m_uInt32; + + sal_Int64 m_nInt64; + sal_uInt64 m_uInt64; + + float m_nFloat; + double m_nDouble; + + rtl_uString* m_pString; + + void* m_pValue; // date/time/timestamp/sequence + } m_aValue; + + sal_Int32 m_eTypeKind; // the database type + bool m_bNull : 1; // value is null + bool m_bBound : 1; // is bound + bool m_bModified : 1; // value was changed + bool m_bSigned : 1; // value is signed + + void free(); + + public: + ORowSetValue() + :m_eTypeKind(::com::sun::star::sdbc::DataType::VARCHAR) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + } + + ORowSetValue(const ORowSetValue& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::VARCHAR) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const OUString& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::VARCHAR) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const double& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::DOUBLE) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const float& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::FLOAT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const sal_Int8& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::TINYINT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const sal_uInt8& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::TINYINT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(false) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + ORowSetValue(const sal_Int16& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::SMALLINT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + ORowSetValue(const sal_uInt16& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::SMALLINT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(false) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + ORowSetValue(const sal_Int32& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::INTEGER) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + ORowSetValue(const sal_uInt32& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::INTEGER) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(false) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + ORowSetValue(const sal_Int64& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::BIGINT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + ORowSetValue(const sal_uInt64& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::BIGINT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(false) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const bool& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::BIT) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const ::com::sun::star::util::Date& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::DATE) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const ::com::sun::star::util::Time& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::TIME) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const ::com::sun::star::util::DateTime& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::TIMESTAMP) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ORowSetValue(const ::com::sun::star::uno::Sequence<sal_Int8>& _rRH) + :m_eTypeKind(::com::sun::star::sdbc::DataType::LONGVARBINARY) + ,m_bNull(true) + ,m_bBound(true) + ,m_bModified(false) + ,m_bSigned(true) + { + m_aValue.m_pString = NULL; + operator=(_rRH); + } + + ~ORowSetValue() + { + free(); + } + + inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(()) + { return ::rtl_allocateMemory( nSize ); } + inline static void * SAL_CALL operator new( size_t,void* _pHint ) SAL_THROW(()) + { return _pHint; } + inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(()) + { ::rtl_freeMemory( pMem ); } + inline static void SAL_CALL operator delete( void *,void* ) SAL_THROW(()) + { } + + ORowSetValue& operator=(const ORowSetValue& _rRH); + + // simple types + ORowSetValue& operator=(const bool _rRH); + + ORowSetValue& operator=(const sal_Int8& _rRH); + ORowSetValue& operator=(const sal_uInt8& _rRH); + + ORowSetValue& operator=(const sal_Int16& _rRH); + ORowSetValue& operator=(const sal_uInt16& _rRH); + + ORowSetValue& operator=(const sal_Int32& _rRH); + ORowSetValue& operator=(const sal_uInt32& _rRH); + + ORowSetValue& operator=(const sal_Int64& _rRH); + ORowSetValue& operator=(const sal_uInt64& _rRH); + + ORowSetValue& operator=(const double& _rRH); + ORowSetValue& operator=(const float& _rRH); + + // ADT's + ORowSetValue& operator=(const ::com::sun::star::util::Date& _rRH); + ORowSetValue& operator=(const ::com::sun::star::util::Time& _rRH); + ORowSetValue& operator=(const ::com::sun::star::util::DateTime& _rRH); + + ORowSetValue& operator=(const OUString& _rRH); + // the type isn't set it will be set to VARCHAR if the type is different change it + ORowSetValue& operator=(const ::com::sun::star::uno::Sequence<sal_Int8>& _rRH); + // we the possiblity to save a any for bookmarks + ORowSetValue& operator=(const ::com::sun::star::uno::Any& _rAny); + + operator bool() const { return isNull() ? false : getBool(); } + operator sal_Int8() const { return isNull() ? static_cast<sal_Int8>(0) : getInt8(); } + operator sal_uInt8() const { return isNull() ? static_cast<sal_uInt8>(0) : getUInt8(); } + + operator sal_Int16() const { return isNull() ? static_cast<sal_Int16>(0) : getInt16(); } + operator sal_uInt16() const { return isNull() ? static_cast<sal_uInt16>(0) : getUInt16(); } + + operator sal_Int32() const { return isNull() ? 0 : getInt32(); } + operator sal_uInt32() const { return isNull() ? 0 : getUInt32(); } + + operator sal_Int64() const { return isNull() ? 0 : getLong(); } + operator sal_uInt64() const { return isNull() ? 0 : getULong(); } + + operator float() const { return isNull() ? (float)0.0: getFloat(); } + operator double() const { return isNull() ? 0.0 : getDouble(); } + + operator OUString() const + { + return isNull() ? OUString() : getString(); + } + + operator ::com::sun::star::util::Date() const + { + return isNull() ? ::com::sun::star::util::Date() : getDate(); + } + + operator ::com::sun::star::util::Time() const + { + return isNull() ? ::com::sun::star::util::Time() : getTime(); + } + + operator ::com::sun::star::util::DateTime() const + { + return isNull() ? ::com::sun::star::util::DateTime() : getDateTime(); + } + + operator ::com::sun::star::uno::Sequence<sal_Int8>() const + { + return isNull() ? ::com::sun::star::uno::Sequence<sal_Int8>() : getSequence(); + } + + bool operator==(const ORowSetValue& _rRH) const; + bool operator!=(const ORowSetValue& _rRH) const + { + return !( *this == _rRH ); + } + + bool isNull() const + { + return m_bNull; + } + void setNull() + { + free(); + m_bNull = true; + m_aValue.m_pString = NULL; + } + + bool isBound() const { return m_bBound; } + void setBound(bool _bBound) { m_bBound = _bBound ? 1 : 0; } + + bool isModified() const { return m_bModified; } + void setModified(bool _bMod=true) { m_bModified = _bMod ? 1 : 0; } + + bool isSigned() const { return m_bSigned; } + void setSigned(bool _bSig=true); + + sal_Int32 getTypeKind() const { return m_eTypeKind; } + void setTypeKind(sal_Int32 _eType); + + // before calling one of this methods, be sure that the value is not null + void* getValue() const { OSL_ENSURE(m_bBound,"Value is not bound!");return m_aValue.m_pValue; } + bool getBool() const; + + sal_Int8 getInt8() const; + sal_uInt8 getUInt8() const; + + sal_Int16 getInt16() const; + sal_uInt16 getUInt16() const; + + sal_Int32 getInt32() const; + sal_uInt32 getUInt32() const; + + sal_Int64 getLong() const; + sal_uInt64 getULong() const; + + double getDouble() const; + float getFloat() const; + + OUString getString() const; // makes a automatic conversion if type isn't a string + ::com::sun::star::util::Date getDate() const; + ::com::sun::star::util::Time getTime() const; + ::com::sun::star::util::DateTime getDateTime() const; + ::com::sun::star::uno::Sequence<sal_Int8> getSequence() const; + // only use for anys + ::com::sun::star::uno::Any getAny() const { return *(::com::sun::star::uno::Any*)m_aValue.m_pValue; } + ::com::sun::star::uno::Any makeAny() const; + + /** + fetches a single value out of the row + @param _nPos the current column position + @param _nType the type of the current column + @param _xRow the row where to fetch the data from + */ + void fill(sal_Int32 _nPos, + sal_Int32 _nType, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow>& _xRow); + + /** + fetches a single value out of the row + @param _nPos the current column position + @param _nType the type of the current column + @param _bNullable if true then it will be checked if the result could be NULL, otherwise not. + @param _xRow the row where to fetch the data from + */ + void fill(sal_Int32 _nPos, + sal_Int32 _nType, + bool _bNullable, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow>& _xRow); + + void fill(const ::com::sun::star::uno::Any& _rValue); + + void fill( const sal_Int32 _nType, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxColumn ); + + private: + void impl_fill( const sal_Int32 _nType, bool _bNullable, const detail::IValueSource& _rValueSource ); + }; + + /// ORowSetValueDecorator decorates a ORowSetValue so the value is "refcounted" + class OOO_DLLPUBLIC_DBTOOLS ORowSetValueDecorator : public ::salhelper::SimpleReferenceObject + { + ORowSetValue m_aValue; // my own value + public: + ORowSetValueDecorator(){m_aValue.setBound(true);} + ORowSetValueDecorator(const ORowSetValue& _aValue) : m_aValue(_aValue){m_aValue.setBound(true);} + ORowSetValueDecorator& operator=(const ORowSetValue& _aValue); + + inline operator const ORowSetValue&() const { return m_aValue; } + inline bool operator ==( const ORowSetValue & _rRH ) { return m_aValue == _rRH; } + inline const ORowSetValue& getValue() const { return m_aValue; } + inline ORowSetValue& get() { return m_aValue; } + inline void setValue(const ORowSetValue& _aValue) { m_aValue = _aValue; } + inline void setNull() { m_aValue.setNull(); } + inline void setBound(bool _bBound ) { m_aValue.setBound(_bBound);} + inline bool isBound( ) const { return m_aValue.isBound();} + inline void setTypeKind(sal_Int32 _nType) { m_aValue.setTypeKind(_nType); } + inline void setModified(bool _bModified) { m_aValue.setModified(_bModified); } + + }; + typedef ::rtl::Reference<ORowSetValueDecorator> ORowSetValueDecoratorRef; + + // ------------------------------------------------------------------------- + /// TSetBound is a unary_function to set the bound value with e.q. for_each call + struct OOO_DLLPUBLIC_DBTOOLS TSetBound : ::std::unary_function<ORowSetValue,void> + { + bool m_bBound; + TSetBound(bool _bBound) : m_bBound(_bBound){} + void operator()(ORowSetValue& _rValue) const { _rValue.setBound(m_bBound); } + + }; + + // ------------------------------------------------------------------------- + /// TSetBound is a unary_function to set the bound value with e.q. for_each call + struct OOO_DLLPUBLIC_DBTOOLS TSetRefBound : ::std::unary_function<ORowSetValueDecoratorRef,void> + { + bool m_bBound; + TSetRefBound(bool _bBound) : m_bBound(_bBound){} + void operator()(ORowSetValueDecoratorRef& _rValue) const { _rValue->setBound(m_bBound); } + + }; + + // ---------------------------------------------------------------------------- + // Vector for file based rows + // ---------------------------------------------------------------------------- + template< class VectorVal > class ODeleteVector : public connectivity::ORowVector< VectorVal > + { + bool m_bDeleted; + public: + ODeleteVector() : connectivity::ORowVector< VectorVal >() ,m_bDeleted(false) {} + ODeleteVector(size_t _st) : connectivity::ORowVector< VectorVal >(_st) ,m_bDeleted(false) {} + + bool isDeleted() const { return m_bDeleted; } + void setDeleted(bool _bDeleted) { m_bDeleted = _bDeleted; } + }; + + typedef ODeleteVector< ORowSetValue > OValueVector; + + class OOO_DLLPUBLIC_DBTOOLS OValueRefVector : public ODeleteVector< ORowSetValueDecoratorRef > + { + public: + OValueRefVector(){} + OValueRefVector(size_t _st) : ODeleteVector< ORowSetValueDecoratorRef >(_st) + { + for(OValueRefVector::Vector::iterator aIter = get().begin() ; aIter != get().end() ;++aIter) + *aIter = new ORowSetValueDecorator; + } + }; + +#define SQL_NO_PARAMETER (SAL_MAX_UINT32) + class OAssignValues : public OValueRefVector + { + ::std::vector<sal_Int32> m_nParameterIndexes; + public: + OAssignValues() : m_nParameterIndexes(1,SQL_NO_PARAMETER){} + OAssignValues(Vector::size_type n) : OValueRefVector(n),m_nParameterIndexes(n+1,SQL_NO_PARAMETER){} + + void setParameterIndex(sal_Int32 _nId,sal_Int32 _nParameterIndex) { m_nParameterIndexes[_nId] = _nParameterIndex;} + sal_Int32 getParameterIndex(sal_Int32 _nId) const { return m_nParameterIndexes[_nId]; } + }; + + typedef ::rtl::Reference< OAssignValues > ORefAssignValues; + + + + typedef ::rtl::Reference< OValueVector > OValueRow; + typedef ::rtl::Reference< OValueRefVector > OValueRefRow; +} + +#endif // #ifndef _CONNECTIVITY_FILE_VALUE_HXX_ + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/IParseContext.hxx b/include/connectivity/IParseContext.hxx new file mode 100644 index 000000000000..0352ed8ec39f --- /dev/null +++ b/include/connectivity/IParseContext.hxx @@ -0,0 +1,104 @@ +/* -*- 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 . + */ +#ifndef CONNECTIVITY_IPARSECONTEXT_HXX +#define CONNECTIVITY_IPARSECONTEXT_HXX + +namespace connectivity { class OSQLParseNode; } + +#include <rtl/ustring.hxx> +#include <com/sun/star/lang/Locale.hpp> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + //========================================================================== + //= IParseContext + //========================================================================== + class IParseContext + { + public: + enum ErrorCode + { + ERROR_NONE = 0, + ERROR_GENERAL, // "Syntax error in SQL expression" + ERROR_VALUE_NO_LIKE, // "The value #1 can not be used with LIKE." + ERROR_FIELD_NO_LIKE, // "LIKE can not be used with this field." + ERROR_INVALID_COMPARE, // "The entered criterion can not be compared with this field." + ERROR_INVALID_INT_COMPARE, // "The field can not be compared with a number." + ERROR_INVALID_DATE_COMPARE, // "The field can not be compared with a date." + ERROR_INVALID_REAL_COMPARE, // "The field can not be compared with a floating point number." + ERROR_INVALID_TABLE, // "The database does not contain a table named \"#\"." + ERROR_INVALID_TABLE_OR_QUERY, // "The database does contain neither a table nor a query named \"#\"." + ERROR_INVALID_COLUMN, // "The column \"#1\" is unknown in the table \"#2\"." + ERROR_INVALID_TABLE_EXIST, // "The database already contains a table or view with name \"#\"." + ERROR_INVALID_QUERY_EXIST // "The database already contains a query with name \"#\"."; + }; + + enum InternationalKeyCode + { + KEY_NONE = 0, + KEY_LIKE, + KEY_NOT, + KEY_NULL, + KEY_TRUE, + KEY_FALSE, + KEY_IS, + KEY_BETWEEN, + KEY_OR, + KEY_AND, + KEY_AVG, + KEY_COUNT, + KEY_MAX, + KEY_MIN, + KEY_SUM, + KEY_EVERY, + KEY_ANY, + KEY_SOME, + KEY_STDDEV_POP, + KEY_STDDEV_SAMP, + KEY_VAR_SAMP, + KEY_VAR_POP, + KEY_COLLECT, + KEY_FUSION, + KEY_INTERSECTION + }; + + public: + // retrieves language specific error messages + virtual OUString getErrorMessage(ErrorCode _eCodes) const = 0; + + // retrieves language specific keyword strings (only ASCII allowed) + virtual OString getIntlKeywordAscii(InternationalKeyCode _eKey) const = 0; + + // finds out, if we have an international keyword (only ASCII allowed) + virtual InternationalKeyCode getIntlKeyCode(const OString& rToken) const = 0; + + /** get's a locale instance which should be used when parsing in the context specified by this instance + <p>if this is not overridden by derived classes, it returns the static default locale.</p> + */ + virtual ::com::sun::star::lang::Locale getPreferredLocale( ) const = 0; + + protected: + ~IParseContext() {} + }; +} + +#endif // CONNECTIVITY_IPARSECONTEXT_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/OSubComponent.hxx b/include/connectivity/OSubComponent.hxx new file mode 100644 index 000000000000..2a55aa35c374 --- /dev/null +++ b/include/connectivity/OSubComponent.hxx @@ -0,0 +1,86 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_OSUBCOMPONENT_HXX_ +#define _CONNECTIVITY_OSUBCOMPONENT_HXX_ + +#include <cppuhelper/weak.hxx> +#include <cppuhelper/interfacecontainer.h> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace com +{ + namespace sun + { + namespace star + { + namespace lang + { + class XComponent; + } + } + } +} +namespace connectivity +{ + OOO_DLLPUBLIC_DBTOOLS + void release(oslInterlockedCount& _refCount, + ::cppu::OBroadcastHelper& rBHelper, + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xInterface, + ::com::sun::star::lang::XComponent* _pObject); + //************************************************************ + // OSubComponent + //************************************************************ + template <class SELF, class WEAK> class OSubComponent + { + protected: + // the parent must support the tunnel implementation + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent; + SELF* m_pDerivedImplementation; + + public: + OSubComponent( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xParent, + SELF* _pDerivedImplementation) + :m_xParent(_xParent) + ,m_pDerivedImplementation(_pDerivedImplementation) + { + } + + protected: + void dispose_ChildImpl() + { + // avoid ambiguity + ::osl::MutexGuard aGuard( m_pDerivedImplementation->WEAK::rBHelper.rMutex ); + m_xParent.clear(); + } + void relase_ChildImpl() + { + ::connectivity::release(m_pDerivedImplementation->m_refCount, + m_pDerivedImplementation->WEAK::rBHelper, + m_xParent, + m_pDerivedImplementation); + + m_pDerivedImplementation->WEAK::release(); + } + }; +} +#endif // _CONNECTIVITY_OSUBCOMPONENT_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/PColumn.hxx b/include/connectivity/PColumn.hxx new file mode 100644 index 000000000000..a54cb809ca29 --- /dev/null +++ b/include/connectivity/PColumn.hxx @@ -0,0 +1,154 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_PCOLUMN_HXX_ +#define _CONNECTIVITY_PCOLUMN_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sdbcx/VColumn.hxx" +#include "connectivity/CommonTools.hxx" +#include <rtl/ref.hxx> +#include <com/sun/star/sdbc/XResultSetMetaData.hpp> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <comphelper/proparrhlp.hxx> + +namespace connectivity +{ + namespace parse + { + class OParseColumn; + + typedef sdbcx::OColumn OParseColumn_BASE; + typedef ::comphelper::OPropertyArrayUsageHelper<OParseColumn> OParseColumn_PROP; + + class OOO_DLLPUBLIC_DBTOOLS OParseColumn : + public OParseColumn_BASE, public OParseColumn_PROP + { + OUString m_aRealName; + OUString m_sLabel; + sal_Bool m_bFunction; + sal_Bool m_bDbasePrecisionChanged; + sal_Bool m_bAggregateFunction; + sal_Bool m_bIsSearchable; + + protected: + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const; + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + virtual ~OParseColumn(); + public: + OParseColumn(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn,sal_Bool _bCase); + OParseColumn(const OUString& _Name, + const OUString& _TypeName, + const OUString& _DefaultValue, + const OUString& _Description, + sal_Int32 _IsNullable, + sal_Int32 _Precision, + sal_Int32 _Scale, + sal_Int32 _Type, + sal_Bool _IsAutoIncrement, + sal_Bool _IsCurrency, + sal_Bool _bCase, + const OUString& _CatalogName, + const OUString& _SchemaName, + const OUString& _TableName); + + virtual void construct(); + + void setRealName(const OUString& _rName) { m_aRealName = _rName; } + void setLabel(const OUString& i_sLabel) { m_sLabel = i_sLabel; } + void setTableName(const OUString& _rName) { m_TableName = _rName; } + void setFunction(sal_Bool _bFunction) { m_bFunction = _bFunction; } + void setAggregateFunction(sal_Bool _bFunction) { m_bAggregateFunction = _bFunction; } + void setIsSearchable( sal_Bool _bIsSearchable ) { m_bIsSearchable = _bIsSearchable; } + void setDbasePrecisionChanged(sal_Bool _bDbasePrecisionChanged) { m_bDbasePrecisionChanged = _bDbasePrecisionChanged; } + + const OUString& getRealName() const { return m_aRealName; } + const OUString& getLabel() const { return m_sLabel; } + const OUString& getTableName() const { return m_TableName; } + sal_Bool getFunction() const { return m_bFunction; } + sal_Bool getDbasePrecisionChanged() const { return m_bDbasePrecisionChanged; } + + public: + /** creates a collection of OParseColumn, as described by a result set meta data instance. + */ + static ::rtl::Reference< OSQLColumns > + createColumnsForResultSet( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData >& _rxResMetaData, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rxDBMetaData, + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>& i_xQueryColumns + ); + + DECLARE_STL_USTRINGACCESS_MAP(int,StringMap); + /** creates a single OParseColumn, as described by a result set meta data instance. + The column names are unique. + */ + static OParseColumn* + createColumnForResultSet( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData >& _rxResMetaData, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rxDBMetaData, + sal_Int32 _nColumnPos, + StringMap& _rColumns + ); + + private: + using OParseColumn_BASE::createArrayHelper; + }; + + class OOrderColumn; + + typedef sdbcx::OColumn OOrderColumn_BASE; + typedef ::comphelper::OPropertyArrayUsageHelper<OOrderColumn> OOrderColumn_PROP; + + class OOO_DLLPUBLIC_DBTOOLS OOrderColumn : + public OOrderColumn_BASE, public OOrderColumn_PROP + { + const sal_Bool m_bAscending; + + protected: + virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const; + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + virtual ~OOrderColumn(); + public: + OOrderColumn( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, + const OUString& i_rOriginatingTableName, + sal_Bool _bCase, + sal_Bool _bAscending + ); + + OOrderColumn( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, + sal_Bool _bCase, + sal_Bool _bAscending + ); + + virtual void construct(); + + virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); + private: + using OOrderColumn_BASE::createArrayHelper; + }; + } +} + +#endif //_CONNECTIVITY_PCOLUMN_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/ParameterCont.hxx b/include/connectivity/ParameterCont.hxx new file mode 100644 index 000000000000..0c9c92ee4468 --- /dev/null +++ b/include/connectivity/ParameterCont.hxx @@ -0,0 +1,52 @@ +/* -*- 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 . + */ +#ifndef CONNECTIVITY_PARAMETERCONTINUATION_HXX_INCLUDED +#define CONNECTIVITY_PARAMETERCONTINUATION_HXX_INCLUDED + +#include <com/sun/star/sdb/XInteractionSupplyParameters.hpp> +#include <comphelper/interaction.hxx> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace dbtools +{ +//==================================================================== + //= OParameterContinuation + //==================================================================== + class OOO_DLLPUBLIC_DBTOOLS OParameterContinuation : public comphelper::OInteraction< ::com::sun::star::sdb::XInteractionSupplyParameters > + { + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > m_aValues; + + public: + OParameterContinuation() { } + + ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > getValues() const { return m_aValues; } + + // XInteractionSupplyParameters + virtual void SAL_CALL setParameters( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rValues ) throw(::com::sun::star::uno::RuntimeException); + + protected: + virtual ~OParameterContinuation() { } + private: + OParameterContinuation(const OParameterContinuation&); + void operator =(const OParameterContinuation&); + }; +} // dbtools +#endif //CONNECTIVITY_PARAMETERCONTINUATION_HXX_INCLUDED + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/SQLStatementHelper.hxx b/include/connectivity/SQLStatementHelper.hxx new file mode 100644 index 000000000000..8302dae6b5c5 --- /dev/null +++ b/include/connectivity/SQLStatementHelper.hxx @@ -0,0 +1,43 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SQLSTATEMENTHELPER_HXX_ +#define _CONNECTIVITY_SQLSTATEMENTHELPER_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include <com/sun/star/beans/XPropertySet.hpp> +//......................................................................... +namespace dbtools +{ + class OOO_DLLPUBLIC_DBTOOLS ISQLStatementHelper + { + public: + virtual void addComment(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor,OUStringBuffer& _rOut) = 0; + + protected: + ~ISQLStatementHelper() {} + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // _CONNECTIVITY_SQLSTATEMENTHELPER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/StdTypeDefs.hxx b/include/connectivity/StdTypeDefs.hxx new file mode 100644 index 000000000000..8751a656d2c0 --- /dev/null +++ b/include/connectivity/StdTypeDefs.hxx @@ -0,0 +1,40 @@ +/* -*- 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 . + */ +#ifndef CONNECTIVITY_STDTYPEDEFS_HXX +#define CONNECTIVITY_STDTYPEDEFS_HXX + +#include "sal/config.h" + +#include <map> +#include <vector> +#include "sal/types.h" + + +namespace connectivity +{ + typedef ::std::vector< OUString> TStringVector; + typedef ::std::vector< sal_Int32> TIntVector; + typedef ::std::map<sal_Int32,sal_Int32> TInt2IntMap; + typedef ::std::map< OUString,sal_Int32> TString2IntMap; + typedef ::std::map< sal_Int32,OUString> TInt2StringMap; +} + +#endif // CONNECTIVITY_STDTYPEDEFS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TColumnsHelper.hxx b/include/connectivity/TColumnsHelper.hxx new file mode 100644 index 000000000000..5fe1dd0eb845 --- /dev/null +++ b/include/connectivity/TColumnsHelper.hxx @@ -0,0 +1,63 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_COLUMNSHELPER_HXX +#define CONNECTIVITY_COLUMNSHELPER_HXX + +#include "connectivity/sdbcx/VCollection.hxx" +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + class OTableHelper; + class OColumnsHelperImpl; + /** contains generell column handling to creat default columns and default sql statements. + */ + class OOO_DLLPUBLIC_DBTOOLS OColumnsHelper : public sdbcx::OCollection + { + OColumnsHelperImpl* m_pImpl; + protected: + OTableHelper* m_pTable; + + virtual sdbcx::ObjectType createObject(const OUString& _rName); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); + virtual sdbcx::ObjectType appendObject( const OUString& _rForName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ); + virtual void dropObject(sal_Int32 _nPos,const OUString _sElementName); + public: + OColumnsHelper( ::cppu::OWeakObject& _rParent + ,sal_Bool _bCase + ,::osl::Mutex& _rMutex + ,const TStringVector &_rVector + ,sal_Bool _bUseHardRef = sal_True + ); + virtual ~OColumnsHelper(); + + /** set the parent of the columns. Can also be <NULL/>. + @param _pTable + The parent. + */ + inline void setParent(OTableHelper* _pTable) { m_pTable = _pTable;} + }; +} +#endif // CONNECTIVITY_COLUMNSHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TIndex.hxx b/include/connectivity/TIndex.hxx new file mode 100644 index 000000000000..b8502af9c5ec --- /dev/null +++ b/include/connectivity/TIndex.hxx @@ -0,0 +1,49 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_INDEXHELPER_HXX_ +#define CONNECTIVITY_INDEXHELPER_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sdbcx/VIndex.hxx" +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> + +namespace connectivity +{ + class OTableHelper; + class OOO_DLLPUBLIC_DBTOOLS OIndexHelper : public connectivity::sdbcx::OIndex + { + OTableHelper* m_pTable; + public: + virtual void refreshColumns(); + public: + OIndexHelper( OTableHelper* _pTable); + OIndexHelper( OTableHelper* _pTable, + const OUString& _Name, + const OUString& _Catalog, + sal_Bool _isUnique, + sal_Bool _isPrimaryKeyIndex, + sal_Bool _isClustered + ); + inline OTableHelper* getTable() const { return m_pTable; } + }; +} +#endif // CONNECTIVITY_INDEXHELPER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TIndexColumns.hxx b/include/connectivity/TIndexColumns.hxx new file mode 100644 index 000000000000..31b0ecfe3ca5 --- /dev/null +++ b/include/connectivity/TIndexColumns.hxx @@ -0,0 +1,44 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_INDEXCOLUMNSHELPER_HXX +#define CONNECTIVITY_INDEXCOLUMNSHELPER_HXX + +#include "connectivity/sdbcx/VCollection.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + class OIndexHelper; + class OOO_DLLPUBLIC_DBTOOLS OIndexColumns : public sdbcx::OCollection + { + OIndexHelper* m_pIndex; + protected: + virtual sdbcx::ObjectType createObject(const OUString& _rName); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + public: + OIndexColumns( OIndexHelper* _pIndex, + ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector); + }; +} +#endif // CONNECTIVITY_INDEXCOLUMNSHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TIndexes.hxx b/include/connectivity/TIndexes.hxx new file mode 100644 index 000000000000..c558c709c8e8 --- /dev/null +++ b/include/connectivity/TIndexes.hxx @@ -0,0 +1,50 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_INDEXESHELPER_HXX +#define CONNECTIVITY_INDEXESHELPER_HXX + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sdbcx/VCollection.hxx" +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> + +namespace connectivity +{ + class OTableHelper; + class OOO_DLLPUBLIC_DBTOOLS OIndexesHelper : public sdbcx::OCollection + { + OTableHelper* m_pTable; + protected: + virtual sdbcx::ObjectType createObject(const OUString& _rName); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); + virtual sdbcx::ObjectType appendObject( const OUString& _rForName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ); + virtual void dropObject(sal_Int32 _nPos,const OUString _sElementName); + public: + OIndexesHelper(OTableHelper* _pTable, + ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector + ); + + }; +} + +#endif // CONNECTIVITY_INDEXESHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TKey.hxx b/include/connectivity/TKey.hxx new file mode 100644 index 000000000000..9b24e41c3126 --- /dev/null +++ b/include/connectivity/TKey.hxx @@ -0,0 +1,47 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_TKEY_HXX +#define CONNECTIVITY_TKEY_HXX + +#include "connectivity/dbtoolsdllapi.hxx" +#include <connectivity/sdbcx/VKey.hxx> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> + +namespace connectivity +{ + class OTableHelper; + class OOO_DLLPUBLIC_DBTOOLS OTableKeyHelper : public connectivity::sdbcx::OKey + { + OTableHelper* m_pTable; + public: + virtual void refreshColumns(); + public: + OTableKeyHelper( OTableHelper* _pTable); + OTableKeyHelper( OTableHelper* _pTable + ,const OUString& _Name + ,const sdbcx::TKeyProperties& _rProps + ); + inline OTableHelper* getTable() const { return m_pTable; } + }; +} +#endif // CONNECTIVITY_TKEY_HXX + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TKeyColumns.hxx b/include/connectivity/TKeyColumns.hxx new file mode 100644 index 000000000000..6dbb041805b4 --- /dev/null +++ b/include/connectivity/TKeyColumns.hxx @@ -0,0 +1,44 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_TKEYCOLUMNS_HXX +#define CONNECTIVITY_TKEYCOLUMNS_HXX + +#include "connectivity/sdbcx/VCollection.hxx" +#include "connectivity/TKey.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + class OOO_DLLPUBLIC_DBTOOLS OKeyColumnsHelper : public connectivity::sdbcx::OCollection + { + OTableKeyHelper* m_pKey; + protected: + virtual sdbcx::ObjectType createObject(const OUString& _rName); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + public: + OKeyColumnsHelper( OTableKeyHelper* _pKey, + ::osl::Mutex& _rMutex, + const ::std::vector< OUString> &_rVector); + }; +} +#endif // CONNECTIVITY_TKEYCOLUMNS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TKeys.hxx b/include/connectivity/TKeys.hxx new file mode 100644 index 000000000000..817b24da3a42 --- /dev/null +++ b/include/connectivity/TKeys.hxx @@ -0,0 +1,59 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_TKEYS_HXX +#define CONNECTIVITY_TKEYS_HXX + +#include "connectivity/sdbcx/VCollection.hxx" +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include "connectivity/TTableHelper.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + typedef sdbcx::OCollection OKeys_BASE; + class OOO_DLLPUBLIC_DBTOOLS OKeysHelper : public OKeys_BASE + { + OTableHelper* m_pTable; + protected: + virtual sdbcx::ObjectType createObject(const OUString& _rName); + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); + virtual sdbcx::ObjectType appendObject( const OUString& _rForName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ); + virtual void dropObject(sal_Int32 _nPos,const OUString _sElementName); + + virtual OUString getDropForeignKey() const; + + public: + OKeysHelper( OTableHelper* _pTable, + ::osl::Mutex& _rMutex, + const TStringVector& _rVector + ); + inline OTableHelper* getTable() const { return m_pTable; } + + static void cloneDescriptorColumns( + const sdbcx::ObjectType& _rSourceDescriptor, + const sdbcx::ObjectType& _rDestDescriptor + ); + }; +} + +#endif // CONNECTIVITY_TKEYS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/TTableHelper.hxx b/include/connectivity/TTableHelper.hxx new file mode 100644 index 000000000000..aeb58cb4dd0c --- /dev/null +++ b/include/connectivity/TTableHelper.hxx @@ -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 . + */ + +#ifndef CONNECTIVITY_TABLEHELPER_HXX +#define CONNECTIVITY_TABLEHELPER_HXX + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sdbcx/VTable.hxx" +#include "connectivity/sdbcx/VKey.hxx" +#include "connectivity/StdTypeDefs.hxx" +#include <comphelper/stl_types.hxx> +#include <com/sun/star/sdb/tools/XTableRename.hpp> +#include <com/sun/star/sdb/tools/XTableAlteration.hpp> +#include <com/sun/star/sdb/tools/XKeyAlteration.hpp> +#include <com/sun/star/sdb/tools/XIndexAlteration.hpp> + +namespace connectivity +{ + typedef sal_Int32 OrdinalPosition; + struct ColumnDesc + { + OUString sName; + OUString aField6; + OUString sField12; // REMARKS + OUString sField13; + sal_Int32 nField5 + , nField7 + , nField9 + , nField11; + + OrdinalPosition nOrdinalPosition; + + ColumnDesc() {} + ColumnDesc( const OUString& _rName + , sal_Int32 _nField5 + , const OUString& _aField6 + , sal_Int32 _nField7 + , sal_Int32 _nField9 + , sal_Int32 _nField11 + , const OUString& _sField12 + , const OUString& _sField13 + ,OrdinalPosition _nPosition ) + :sName( _rName ) + ,aField6(_aField6) + ,sField12(_sField12) + ,sField13(_sField13) + ,nField5(_nField5) + ,nField7(_nField7) + ,nField9(_nField9) + ,nField11(_nField11) + ,nOrdinalPosition( _nPosition ) + { + } + }; + typedef connectivity::sdbcx::OTable OTable_TYPEDEF; + + OOO_DLLPUBLIC_DBTOOLS OUString getTypeString(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xColProp); + + DECLARE_STL_USTRINGACCESS_MAP( sdbcx::TKeyProperties , TKeyMap); + + struct OTableHelperImpl; + + class OOO_DLLPUBLIC_DBTOOLS OTableHelper : public OTable_TYPEDEF + { + ::std::auto_ptr<OTableHelperImpl> m_pImpl; + + void refreshPrimaryKeys(TStringVector& _rKeys); + void refreshForeignKeys(TStringVector& _rKeys); + + protected: + /** creates the column collection for the table + @param _rNames + The column names. + */ + virtual sdbcx::OCollection* createColumns(const TStringVector& _rNames) = 0; + + /** creates the key collection for the table + @param _rNames + The key names. + */ + virtual sdbcx::OCollection* createKeys(const TStringVector& _rNames) = 0; + + /** creates the index collection for the table + @param _rNames + The index names. + */ + virtual sdbcx::OCollection* createIndexes(const TStringVector& _rNames) = 0; + + /** this function is called upon disposing the component + */ + virtual void SAL_CALL disposing(); + + /** The default returns "RENAME TABLE " or "RENAME VIEW " depending on the type. + * + * \return The start of the rename statement. + */ + virtual OUString getRenameStart() const; + + virtual ~OTableHelper(); + + public: + virtual void refreshColumns(); + virtual void refreshKeys(); + virtual void refreshIndexes(); + + const ColumnDesc* getColumnDescription(const OUString& _sName) const; + + public: + OTableHelper( sdbcx::OCollection* _pTables, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection, + sal_Bool _bCase); + OTableHelper( sdbcx::OCollection* _pTables, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection, + sal_Bool _bCase, + const OUString& _Name, + const OUString& _Type, + const OUString& _Description = OUString(), + const OUString& _SchemaName = OUString(), + const OUString& _CatalogName = OUString() + ); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> getMetaData() const; + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getConnection() const; + + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + + // XRename + virtual void SAL_CALL rename( const OUString& newName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); + + // XAlterTable + virtual void SAL_CALL alterColumnByIndex( sal_Int32 index, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + // XNamed + virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); + + // helper method to get key properties + sdbcx::TKeyProperties getKeyProperties(const OUString& _sName) const; + void addKey(const OUString& _sName,const sdbcx::TKeyProperties& _aKeyProperties); + + virtual OUString getTypeCreatePattern() const; + + ::com::sun::star::uno::Reference< ::com::sun::star::sdb::tools::XTableRename> getRenameService() const; + ::com::sun::star::uno::Reference< ::com::sun::star::sdb::tools::XTableAlteration> getAlterService() const; + ::com::sun::star::uno::Reference< ::com::sun::star::sdb::tools::XKeyAlteration> getKeyService() const; + ::com::sun::star::uno::Reference< ::com::sun::star::sdb::tools::XIndexAlteration> getIndexService() const; + }; +} +#endif // CONNECTIVITY_TABLEHELPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/conncleanup.hxx b/include/connectivity/conncleanup.hxx new file mode 100644 index 000000000000..1eec5ac50f98 --- /dev/null +++ b/include/connectivity/conncleanup.hxx @@ -0,0 +1,90 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_CONNCLEANUP_HXX_ +#define _CONNECTIVITY_CONNCLEANUP_HXX_ + +#include <cppuhelper/implbase2.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/sdbc/XRowSet.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include "connectivity/dbtoolsdllapi.hxx" + +//......................................................................... +namespace dbtools +{ +//......................................................................... + + //===================================================================== + //= OAutoConnectionDisposer + //===================================================================== + typedef ::cppu::WeakImplHelper2 < ::com::sun::star::beans::XPropertyChangeListener, + ::com::sun::star::sdbc::XRowSetListener + > OAutoConnectionDisposer_Base; + + class OOO_DLLPUBLIC_DBTOOLS OAutoConnectionDisposer : public OAutoConnectionDisposer_Base + { + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > + m_xOriginalConnection; + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > m_xRowSet; // needed to add as listener + sal_Bool m_bRSListening : 1; // true when we're listening on rowset + sal_Bool m_bPropertyListening : 1; // true when we're listening for property changes + + public: + /** constructs an object + <p>The connection given will be set on the rowset (as ActiveConnection), and the object adds itself as property + change listener for the connection. Once somebody sets a new ActiveConnection, the old one (the one given + here) will be disposed.</p> + */ + OAutoConnectionDisposer( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& _rxRowSet, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection + ); + + protected: + // XPropertyChangeListener + virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException); + + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException); + + // XRowSetListener + virtual void SAL_CALL cursorMoved( const ::com::sun::star::lang::EventObject& event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL rowChanged( const ::com::sun::star::lang::EventObject& event ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL rowSetChanged( const ::com::sun::star::lang::EventObject& event ) throw (::com::sun::star::uno::RuntimeException); + + private: + void clearConnection(); + + void startRowSetListening(); + void stopRowSetListening(); + sal_Bool isRowSetListening() const { return m_bRSListening; } + + void startPropertyListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxProps ); + void stopPropertyListening( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxEventSource ); + sal_Bool isPropertyListening() const { return m_bPropertyListening; } + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // _CONNECTIVITY_CONNCLEANUP_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/dbcharset.hxx b/include/connectivity/dbcharset.hxx new file mode 100644 index 000000000000..712c44abddb4 --- /dev/null +++ b/include/connectivity/dbcharset.hxx @@ -0,0 +1,164 @@ +/* -*- 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 . + */ + +#ifndef _DBHELPER_DBCHARSET_HXX_ +#define _DBHELPER_DBCHARSET_HXX_ + +#include "sal/config.h" + +#include <cstddef> + +#include <comphelper/stl_types.hxx> +#include <rtl/textenc.h> +#include <rtl/tencinfo.h> +#include <rtl/ustring.hxx> +#include "connectivity/dbtoolsdllapi.hxx" + +//......................................................................... +namespace dbtools +{ +//......................................................................... + + //========================================================================= + //= OCharsetMap + //========================================================================= + /** is a class which translates between different charset representations. + + <p>The set of recognized charsets is very limited: only the ones which are database relevant are + implemented at the moment</p> + + <p>Possible representations are: + <ul> + <li><b>IANA names.</b> + Have a look at <A href="http://www.iana.org/assignments/character-sets">this document</A> for + more details</li> + <li><b>rtl_TextEncoding</b></li> + </ul> + </p> + */ + class OOO_DLLPUBLIC_DBTOOLS OCharsetMap + { + protected: + DECLARE_STL_STDKEY_SET( rtl_TextEncoding, TextEncBag ); + + TextEncBag m_aEncodings; + + public: + class CharsetIterator; + friend class OCharsetMap::CharsetIterator; + typedef CharsetIterator iterator; + typedef CharsetIterator const_iterator; + + OCharsetMap(); + virtual ~OCharsetMap(); + + struct IANA { }; + + /** find the given text encoding in the map. + @return the <em>end</em> iterator if the encoding could not be found. + */ + CharsetIterator find(const rtl_TextEncoding _eEncoding) const; + /** find the given IANA name in the map. + @return the <em>end</em> iterator if the IANA name could not be found. + */ + CharsetIterator find(const OUString& _rIanaName, const IANA&) const; + + std::size_t size() const { ensureConstructed( ); return m_aEncodings.size(); } + + /// get access to the first element of the charset collection + CharsetIterator begin() const; + /// get access to the (last + 1st) element of the charset collection + CharsetIterator end() const; + + protected: + // needed because we want to call a virtual method during construction + void lateConstruct(); + inline void ensureConstructed( ) const { if ( m_aEncodings.empty() ) const_cast< OCharsetMap* >( this )->lateConstruct(); } + + virtual sal_Bool approveEncoding( const rtl_TextEncoding _eEncoding, const rtl_TextEncodingInfo& _rInfo ) const; + }; + + //------------------------------------------------------------------------- + //- CharsetIteratorDerefHelper + //------------------------------------------------------------------------- + class OOO_DLLPUBLIC_DBTOOLS CharsetIteratorDerefHelper + { + friend class OCharsetMap::CharsetIterator; + + rtl_TextEncoding m_eEncoding; + OUString m_aIanaName; + + public: + CharsetIteratorDerefHelper(const CharsetIteratorDerefHelper& _rSource); + + rtl_TextEncoding getEncoding() const { return m_eEncoding; } + OUString getIanaName() const { return m_aIanaName; } + + protected: + CharsetIteratorDerefHelper( const rtl_TextEncoding _eEncoding, const OUString& _rIanaName ); + + }; + + + //------------------------------------------------------------------------- + //- OCharsetMap::CharsetIterator + //------------------------------------------------------------------------- + class OOO_DLLPUBLIC_DBTOOLS OCharsetMap::CharsetIterator + { + friend class OCharsetMap; + + friend OOO_DLLPUBLIC_DBTOOLS bool operator==(const CharsetIterator& lhs, const CharsetIterator& rhs); + friend bool operator!=(const CharsetIterator& lhs, const CharsetIterator& rhs) { return !(lhs == rhs); } + +// friend sal_Int32 operator-(const CharsetIterator& lhs, const CharsetIterator& rhs); + + protected: + const OCharsetMap* m_pContainer; + OCharsetMap::TextEncBag::const_iterator m_aPos; + + public: + CharsetIterator(const CharsetIterator& _rSource); + ~CharsetIterator(); + + CharsetIteratorDerefHelper operator*() const; + // no -> operator + // this would require us to a) store CharsetIteratorDerefHelper instances ourself so that we + // can return a pointer or b) introduce a -> operator on the CharsetIteratorDerefHelper, too. + + /// prefix increment + const CharsetIterator& operator++(); + /// postfix increment + const CharsetIterator operator++(int) { CharsetIterator hold(*this); ++*this; return hold; } + + /// prefix decrement + const CharsetIterator& operator--(); + /// postfix decrement + const CharsetIterator operator--(int) { CharsetIterator hold(*this); --*this; return hold; } + + protected: + CharsetIterator(const OCharsetMap* _pContainer, OCharsetMap::TextEncBag::const_iterator _aPos ); + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // _DBHELPER_DBCHARSET_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/dbconversion.hxx b/include/connectivity/dbconversion.hxx new file mode 100644 index 000000000000..9536c799ec81 --- /dev/null +++ b/include/connectivity/dbconversion.hxx @@ -0,0 +1,213 @@ +/* -*- 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 . + */ + +#ifndef _DBHELPER_DBCONVERSION_HXX_ +#define _DBHELPER_DBCONVERSION_HXX_ + +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/util/Date.hpp> +#include <com/sun/star/uno/Reference.hxx> +#include "connectivity/dbtoolsdllapi.hxx" + +// forward declarations +namespace com +{ + namespace sun + { + namespace star + { + namespace lang + { + struct Locale; + } + namespace sdb + { + class XColumn; + class XColumnUpdate; + } + namespace sdbc + { + class SQLException; + } + namespace beans + { + class XPropertySet; + } + namespace util + { + class XNumberFormatter; + class XNumberFormatsSupplier; + struct Time; + struct DateTime; + } + namespace script + { + class XTypeConverter; + } + } + } +} + +//......................................................................... +namespace dbtools +{ +//......................................................................... + + class OOO_DLLPUBLIC_DBTOOLS DBTypeConversion + { + public: + static ::com::sun::star::util::Date getStandardDate(); + static void setValue(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumnUpdate>& xVariant, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& xFormatter, + const ::com::sun::star::util::Date& rNullDate, + const OUString& rString, + sal_Int32 nKey, + sal_Int16 nFieldType, + sal_Int16 nKeyType) throw(::com::sun::star::lang::IllegalArgumentException); + + static void setValue(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumnUpdate>& xVariant, + const ::com::sun::star::util::Date& rNullDate, + const double& rValue, + sal_Int16 nKeyType) throw(::com::sun::star::lang::IllegalArgumentException); + + static double getValue( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& xVariant, const ::com::sun::star::util::Date& rNullDate ); + + // get the columnvalue as string with a default format given by the column or a default format + // for the type + static OUString getFormattedValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& xFormatter, + const ::com::sun::star::lang::Locale& _rLocale, + const ::com::sun::star::util::Date& rNullDate); + + static OUString getFormattedValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& _xColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& xFormatter, + const ::com::sun::star::util::Date& rNullDate, + sal_Int32 nKey, + sal_Int16 nKeyType); + + static ::com::sun::star::util::Date toDate(double dVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); + static ::com::sun::star::util::Date toDate(const OUString& _sSQLDate); + static ::com::sun::star::util::Time toTime(double dVal); + static ::com::sun::star::util::Time toTime(const OUString& _sSQLDate); + static ::com::sun::star::util::DateTime toDateTime(double dVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); + static ::com::sun::star::util::DateTime toDateTime(const OUString& _sSQLDate); + + + // TODO: consider removing getMsFromTime + static sal_Int32 getMsFromTime(const ::com::sun::star::util::Time& rVal); + static sal_Int64 getNsFromTime(const ::com::sun::star::util::Time& rVal); + + static sal_Int32 toDays(const ::com::sun::star::util::Date& _rVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); + + static double toDouble(const ::com::sun::star::util::Date& rVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); + static double toDouble(const ::com::sun::star::util::Time& rVal); + static double toDouble(const ::com::sun::star::util::DateTime& rVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); + + static sal_Int32 toINT32(const ::com::sun::star::util::Date& rVal); + static sal_Int64 toINT64(const ::com::sun::star::util::Time& rVal); + + static ::com::sun::star::util::Date toDate(sal_Int32 _nVal); + static ::com::sun::star::util::Time toTime(sal_Int64 _nVal); + + /** convert a double which is a date value relative to a given fixed date into a date value relative + to the standard db null date. + */ + static double toStandardDbDate(const ::com::sun::star::util::Date& _rNullDate, double _rVal) { return _rVal + toDays(_rNullDate); } + /** convert a double which is a date value relative to the standard db null date into a date value relative + to a given fixed date. + */ + static double toNullDate(const ::com::sun::star::util::Date& _rNullDate, double _rVal) { return _rVal - toDays(_rNullDate); } + + // return the date from the numberformatsupplier or the STANDARD_DATE (1900,1,1) + static ::com::sun::star::util::Date getNULLDate(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > &xSupplier); + + // return the date in the format %04d-%02d-%02d + static OUString toDateString(const ::com::sun::star::util::Date& rDate); + // return the time in the format %02d:%02d:%02d.%09d + static OUString toTimeString(const ::com::sun::star::util::Time& rTime); + // return the DateTime in the format %04d-%02d-%02d %02d:%02d:%02d.%09d + static OUString toDateTimeString(const ::com::sun::star::util::DateTime& _rDateTime); + // return the any in an sql standard format + static OUString toSQLString(sal_Int32 eType, const ::com::sun::star::uno::Any& _rVal, sal_Bool bQuote, + const ::com::sun::star::uno::Reference< ::com::sun::star::script::XTypeConverter >& _rxTypeConverter); + + /** converts a Unicode string into a 8-bit string, using the given encoding + + @param _rSource + the source string to convert + @param _rDest + the destination string + @param _eEncoding + the encoding to use for the conversion + + @throws com::sun::star::sdbc::SQLException + if the given string contains characters which are not convertible using the given encoding + The SQLState of the exception will be set to 22018 ("Invalid character value for cast specification") + + @return + the length of the converted string + */ + static sal_Int32 convertUnicodeString( + const OUString& _rSource, + OString& _rDest, + rtl_TextEncoding _eEncoding + ) + SAL_THROW((::com::sun::star::sdbc::SQLException)); + + /** converts a Unicode string into a 8-bit string, using the given encoding + + @param _rSource + the source string to convert + + @param _rDest + the destination string + + @param _nMaxLen + the maximum length of the destination string + + @param _eEncoding + the encoding to use for the conversion + + @throws com::sun::star::sdbc::SQLException + if convertUnicodeString, which is called internally, throws such an exception + + @throws com::sun::star::sdbc::SQLException + if the conversion results in a string which is longer than _nMaxLen + + @return + the length of the converted string + */ + static sal_Int32 convertUnicodeStringToLength( + const OUString& _rSource, + OString& _rDest, + sal_Int32 _nMaxLen, + rtl_TextEncoding _eEncoding + ) + SAL_THROW((::com::sun::star::sdbc::SQLException)); + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // _DBHELPER_DBCONVERSION_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/dbexception.hxx b/include/connectivity/dbexception.hxx new file mode 100644 index 000000000000..a84450b607d8 --- /dev/null +++ b/include/connectivity/dbexception.hxx @@ -0,0 +1,353 @@ +/* -*- 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 . + */ + +#ifndef _DBHELPER_DBEXCEPTION_HXX_ +#define _DBHELPER_DBEXCEPTION_HXX_ + +#include <com/sun/star/sdbc/SQLException.hpp> +#include "connectivity/standardsqlstate.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace com +{ + namespace sun + { + namespace star + { + namespace sdb + { + class SQLContext; + struct SQLErrorEvent; + } + namespace sdbc + { + class SQLWarning; + } + } + } +} +//......................................................................... +namespace dbtools +{ +//......................................................................... + +//============================================================================== +//= Special exception if cancel is pressed in DBA UI +//============================================================================== +enum OOoBaseErrorCode +{ + ParameterInteractionCancelled = 1 +}; + +//============================================================================== +//= SQLExceptionInfo - encapsulating the type info of an SQLException-derived class +//============================================================================== + +class OOO_DLLPUBLIC_DBTOOLS SQLExceptionInfo +{ +public: + enum TYPE { SQL_EXCEPTION, SQL_WARNING, SQL_CONTEXT, UNDEFINED }; + +private: + ::com::sun::star::uno::Any m_aContent; + TYPE m_eType; // redundant (could be derived from m_aContent.getValueType()) + +public: + SQLExceptionInfo(); + SQLExceptionInfo(const ::com::sun::star::sdbc::SQLException& _rError); + SQLExceptionInfo(const ::com::sun::star::sdbc::SQLWarning& _rError); + SQLExceptionInfo(const ::com::sun::star::sdb::SQLContext& _rError); + + /** convenience constructor + + If your error processing relies on SQLExceptions, and SQLExceptionInfos, you still may + need to display an error which consists of a simple message string only. + In those cases, you can use this constructor, which behaves as if you would have used + an SQLException containing exactly the given error message. + */ + SQLExceptionInfo( const OUString& _rSimpleErrorMessage ); + + SQLExceptionInfo(const SQLExceptionInfo& _rCopySource); + + // use for events got via XSQLErrorListener::errorOccured + SQLExceptionInfo(const ::com::sun::star::uno::Any& _rError); + // use with the Reason member of an SQLErrorEvent or with NextElement of an SQLException + + /** prepends a plain error message to the chain of exceptions + @param _rSimpleErrorMessage + the error message to prepend + @param _pAsciiSQLState + the SQLState of the to-be-constructed SQLException, or NULL if this should be defaulted to HY000 + @param _nErrorCode + the ErrorCode of the to-be-constructed SQLException + */ + void prepend( const OUString& _rErrorMessage, const sal_Char* _pAsciiSQLState = NULL, const sal_Int32 _nErrorCode = 0 ); + + /** appends a plain message to the chain of exceptions + @param _eType + the type of exception to append. Must be SQL_EXCEPTION, SQL_WARNING, SQL_CONTEXT, for all other + values, the behavior is undefined. + @param _rErrorMessage + the message to append + @param _pAsciiSQLState + the SQLState of the exception to append + @param _nErrorCode + the error code of the exception to append + */ + void append( TYPE _eType, const OUString& _rErrorMessage, const sal_Char* _pAsciiSQLState = NULL, const sal_Int32 _nErrorCode = 0 ); + + /** throws (properly typed) the exception contained in the object + @precond + isValid() returns <TRUE/> + @throws SQLException + @throws RuntimeException + if the instance does not contain an SQLException + */ + void doThrow(); + + const SQLExceptionInfo& operator=(const ::com::sun::star::sdbc::SQLException& _rError); + const SQLExceptionInfo& operator=(const ::com::sun::star::sdbc::SQLWarning& _rError); + const SQLExceptionInfo& operator=(const ::com::sun::star::sdb::SQLContext& _rError); + const SQLExceptionInfo& operator=(const ::com::sun::star::sdb::SQLErrorEvent& _rErrorEvent); + const SQLExceptionInfo& operator=(const ::com::sun::star::uno::Any& _rCaughtSQLException); + + sal_Bool isKindOf(TYPE _eType) const; + // not just a simple comparisation ! e.g. getType() == SQL_CONTEXT implies isKindOf(SQL_EXCEPTION) == sal_True ! + sal_Bool isValid() const { return m_eType != UNDEFINED; } + TYPE getType() const { return m_eType; } + + operator const ::com::sun::star::sdbc::SQLException* () const; + operator const ::com::sun::star::sdbc::SQLWarning* () const; + operator const ::com::sun::star::sdb::SQLContext* () const; + + const ::com::sun::star::uno::Any& get() const { return m_aContent; } + + void clear() + { + m_aContent.clear(); + m_eType = UNDEFINED; + } + +protected: + void implDetermineType(); +}; + +//============================================================================== +//= SQLExceptionIteratorHelper - iterating through an SQLException chain +//============================================================================== + +class OOO_DLLPUBLIC_DBTOOLS SQLExceptionIteratorHelper +{ +protected: + const ::com::sun::star::sdbc::SQLException* m_pCurrent; + SQLExceptionInfo::TYPE m_eCurrentType; + +public: + /** constructs an iterator instance from an SQLException + + @param _rChainStart + the start of the exception chain to iterate. Must live as long as the iterator + instances lives, at least. + */ + SQLExceptionIteratorHelper( const ::com::sun::star::sdbc::SQLException& _rChainStart ); + + /** constructs an iterator instance from an SQLExceptionInfo + + @param _rErrorInfo + the start of the exception chain to iterate. Must live as long as the iterator + instances lives, at least. + */ + SQLExceptionIteratorHelper( const SQLExceptionInfo& _rErrorInfo ); + + /** determines whether there are more elements in the exception chain + */ + sal_Bool hasMoreElements() const { return ( m_pCurrent != NULL ); } + + /** returns the type of the current element in the exception chain + */ + SQLExceptionInfo::TYPE currentType() const { return m_eCurrentType; } + + /** retrieves the current element in the chain, or <NULL/> if the chain has been completely + traveled. + */ + const ::com::sun::star::sdbc::SQLException* current() const { return m_pCurrent; } + + /** retrieves the current element in the chain, or <NULL/> if the chain has been completely + traveled. + + In opposite to the second <member>current</member>, this version allows typed access to + the respective SQLException. + */ + void current( SQLExceptionInfo& _out_rInfo ) const; + + /** proceeds to the next element in the chain + + @return the current element in the chain, as <b>before</em> the chain move. + */ + const ::com::sun::star::sdbc::SQLException* next(); + + /** proceeds to the next element in the chain + + In opposite to the second <member>current</member>, this version allows typed access to + the respective SQLException. + */ + void next( SQLExceptionInfo& _out_rInfo ); +}; + +//================================================================================== +//= StandardExceptions +//================================================================================== +//---------------------------------------------------------------------------------- +/** returns a standard error string for a given SQLState + + @param _eState + describes the state whose description is to retrieve. Must not be SQL_ERROR_UNSPECIFIED. + @raises RuntimeException + in case of an internal error +*/ +OOO_DLLPUBLIC_DBTOOLS OUString getStandardSQLState( StandardSQLState _eState ); + +//---------------------------------------------------------------------------------- +/** returns a standard ASCII string for a given SQLState + + @param _eState + describes the state whose description is to retrieve. Must not be SQL_ERROR_UNSPECIFIED. + @return + a non-<NULL/> pointer to an ASCII character string denoting the requested SQLState + @raises RuntimeException + in case of an internal error +*/ +OOO_DLLPUBLIC_DBTOOLS const sal_Char* getStandardSQLStateAscii( StandardSQLState _eState ); + +//---------------------------------------------------------------------------------- +OOO_DLLPUBLIC_DBTOOLS void throwFunctionNotSupportedException( + const OUString& _rMsg, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context, + const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any() + ) + throw ( ::com::sun::star::sdbc::SQLException ); + +//---------------------------------------------------------------------------------- +/** throws an exception with SQL state IM001, saying that a certain function is not supported +*/ +OOO_DLLPUBLIC_DBTOOLS void throwFunctionNotSupportedException( + const sal_Char* _pAsciiFunctionName, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const ::com::sun::star::uno::Any* _pNextException = NULL + ) + throw ( ::com::sun::star::sdbc::SQLException ); + +//---------------------------------------------------------------------------------- +/** throws a function sequence (HY010) exception +*/ +OOO_DLLPUBLIC_DBTOOLS void throwFunctionSequenceException( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context, + const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any() + ) + throw ( ::com::sun::star::sdbc::SQLException ); + +//---------------------------------------------------------------------------------- +/** throw a invalid index sqlexception +*/ +OOO_DLLPUBLIC_DBTOOLS void throwInvalidIndexException( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context, + const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any() + ) + throw ( ::com::sun::star::sdbc::SQLException ); + +//---------------------------------------------------------------------------------- +/** throw a generic SQLException, i.e. one with an SQLState of HY000, an ErrorCode of 0 and no NextException +*/ +OOO_DLLPUBLIC_DBTOOLS void throwGenericSQLException( + const OUString& _rMsg, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSource + ) + throw (::com::sun::star::sdbc::SQLException); + +//---------------------------------------------------------------------------------- +/** throw a generic SQLException, i.e. one with an SQLState of HY000, an ErrorCode of 0 and no NextException +*/ +OOO_DLLPUBLIC_DBTOOLS void throwGenericSQLException( + const OUString& _rMsg, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSource, + const ::com::sun::star::uno::Any& _rNextException + ) + throw (::com::sun::star::sdbc::SQLException); + +//---------------------------------------------------------------------------------- +/** throw a SQLException with SQLState HYC00 (Optional feature not implemented) + @param _pAsciiFeatureName + an ASCII description of the feature which is not implemented. It's recommended that the feature + name is built from the name of the interface plus its method, for instance "XParameters::updateBinaryStream" + @param _rxContext + the context of the exception + @param _pNextException + the next exception to chain into the thrown exception, if any +*/ +OOO_DLLPUBLIC_DBTOOLS void throwFeatureNotImplementedException( + const sal_Char* _pAsciiFeatureName, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const ::com::sun::star::uno::Any* _pNextException = NULL + ) + throw (::com::sun::star::sdbc::SQLException); + +//---------------------------------------------------------------------------------- +/** throws an SQLException +*/ +OOO_DLLPUBLIC_DBTOOLS void throwSQLException( + const sal_Char* _pAsciiMessage, + const sal_Char* _pAsciiState, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const sal_Int32 _nErrorCode = 0, + const ::com::sun::star::uno::Any* _pNextException = NULL + ) + throw (::com::sun::star::sdbc::SQLException); + +//---------------------------------------------------------------------------------- +/** throws an SQLException +*/ +OOO_DLLPUBLIC_DBTOOLS void throwSQLException( + const sal_Char* _pAsciiMessage, + StandardSQLState _eSQLState, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const sal_Int32 _nErrorCode = 0, + const ::com::sun::star::uno::Any* _pNextException = NULL + ) + throw (::com::sun::star::sdbc::SQLException); + +//---------------------------------------------------------------------------------- +/** throws an SQLException +*/ +OOO_DLLPUBLIC_DBTOOLS void throwSQLException( + const OUString& _rMessage, + StandardSQLState _eSQLState, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const sal_Int32 _nErrorCode = 0, + const ::com::sun::star::uno::Any* _pNextException = NULL + ) + throw (::com::sun::star::sdbc::SQLException); + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // _DBHELPER_DBEXCEPTION_HXX_ + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/dbmetadata.hxx b/include/connectivity/dbmetadata.hxx new file mode 100644 index 000000000000..565854ba7ed8 --- /dev/null +++ b/include/connectivity/dbmetadata.hxx @@ -0,0 +1,192 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_INC_CONNECTIVITY_DBMETADATA_HXX +#define CONNECTIVITY_INC_CONNECTIVITY_DBMETADATA_HXX + +#include <com/sun/star/sdbc/XConnection.hpp> + +#include <memory> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace comphelper +{ + class ComponentContext; +} + +//........................................................................ +namespace dbtools +{ +//........................................................................ + + //==================================================================== + //= DatabaseMetaData + //==================================================================== + struct DatabaseMetaData_Impl; + /** encapsulates meta data about a database/connection which cannot be obtained + from the usual XDatabaseMetaData result set. + + Meta data perhaps isn't really the right term ... Some of the methods + in this class involved heuristics, some are just a convenient wrapper + around more complex ways to obtain the same information. + + @todo + Once CWS dba30 is integrated, we could easily add all the meta data + which is part of the "Info" property of a data source. + */ + class OOO_DLLPUBLIC_DBTOOLS DatabaseMetaData + { + private: + ::std::auto_ptr< DatabaseMetaData_Impl > m_pImpl; + + public: + DatabaseMetaData(); + /** constructs a DatabaseMetaData instance + @param _rxConnection + is the connection whose meta data you're interested in. + Note that some of the information provided by this class can only be obtained + if this connection denotes an application-level connection, i.e. supports + the com.sun.star.sdb.Connection service. + + @throws ::com::sun::star::lang::IllegalArgumentException + if the given connection is not <NULL/>, but the XDatabaseMetaData provided by it + are <NULL/> + @throws ::com::sun::star::sdbc::SQLException + if obtaining the meta data from the connection throws an SQLException + @throws ::com::sun::star::uno::RuntimeException + if obtaining the meta data from the connection throws an RuntimeException + */ + DatabaseMetaData( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _connection ); + DatabaseMetaData( const DatabaseMetaData& _copyFrom ); + DatabaseMetaData& operator=( const DatabaseMetaData& _copyFrom ); + + ~DatabaseMetaData(); + + public: + /** determines whether or not the instances is based on a valid connection + + As long as this method returns true<TRUE/>, you should expect all other + methods throwing an SQLException when called. + */ + bool isConnected() const; + + /** resets the instance so that it's based on a new connection + */ + inline void reset( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _connection ) + { + *this = DatabaseMetaData( _connection ); + } + + /// wraps XDatabaseMetaData::getIdentifierQuoteString + const OUString& getIdentifierQuoteString() const; + + /// wraps XDatabaseMetaData::getCatalogSeparator + const OUString& getCatalogSeparator() const; + + /** determines whether the database supports sub queries in the FROM part + of a SELECT clause are supported. + @throws ::com::sun::star::sdbc::SQLException + with SQLState 08003 (connection does not exist) if the instances was + default-constructed and does not have a connection, yet. + */ + bool supportsSubqueriesInFrom() const; + + /** checks whether the database supports primary keys + + Since there's no dedicated API to ask a database for this, a heuristics needs to be applied. + First, the <code>PrimaryKeySupport<code> settings of the data source is examined. If it is <TRUE/> + or <FALSE/>, then value is returned. If it is <NULL/>, then the database meta data are examined + for support of core SQL grammar, and the result is returned. The assumption is that a database/driver + which supports core SQL grammar usually also supports primary keys, and vice versa. At least, experience + shows this is true most of the time. + */ + bool supportsPrimaryKeys() const; + + /** determines whether names in the database should be restricted to SQL-92 identifiers + + Effectively, this method checks the EnableSQL92Check property of the data source settings, + if present. + */ + bool restrictIdentifiersToSQL92() const; + + /** determines whether when generating SQL statements, an AS keyword should be generated + before a correlation name. + + E.g., it determines whether <code>SELECT * FROM table AS correlation_name</code> or + <code>SELECT * FROM table correlation_name</code> is generated. + */ + bool generateASBeforeCorrelationName() const; + + /** should date time be escaped like '2001-01-01' => {D '2001-01-01' } + */ + bool shouldEscapeDateTime() const; + + /** auto increment columns should be automaticly used as primary key. + */ + bool isAutoIncrementPrimaryKey() const; + + /** determines the syntax to use for boolean comparison predicates + + @see ::com::sun::star::sdb::BooleanComparisonMode + */ + sal_Int32 + getBooleanComparisonMode() const; + + /** determines in relations are supported. + * + * \return <TRUE/> when relations are supported, otherwise <FALSE/> + */ + bool supportsRelations() const; + + /** determines if column alias names can be used in the order by clause. + * + * \return <TRUE/> when relations are supported, otherwise <FALSE/> + */ + bool supportsColumnAliasInOrderBy() const; + + /** determines whether user administration is supported for the database + + User administration support is controlled by the availability of the XUsersSupplier + interface, and it returning a non-NULL users container. + + @param _rContext + the component context we operate in. Might be needed to create the + css.sdbc.DriverManager instance. + */ + bool supportsUserAdministration( const ::comphelper::ComponentContext& _rContext ) const; + + /** determines whether in the application UI, empty table folders (aka catalogs/schemas) should be displayed + */ + bool displayEmptyTableFolders() const; + + /** determines that threads are supported. + * + * \return <TRUE/> when threads are supported, otherwise <FALSE/> + */ + bool supportsThreads() const; + }; + +//........................................................................ +} // namespace dbtools +//........................................................................ + +#endif // CONNECTIVITY_INC_CONNECTIVITY_DBMETADATA_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/dbtools.hxx b/include/connectivity/dbtools.hxx new file mode 100644 index 000000000000..9706af6ccb1c --- /dev/null +++ b/include/connectivity/dbtools.hxx @@ -0,0 +1,787 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_DBTOOLS_HXX_ +#define _CONNECTIVITY_DBTOOLS_HXX_ + +#include <connectivity/dbexception.hxx> +#include <comphelper/types.hxx> +#include <com/sun/star/sdbc/DataType.hpp> +#include <comphelper/stl_types.hxx> +#include <unotools/sharedunocomponent.hxx> +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/FValue.hxx" + +namespace com { namespace sun { namespace star { + +namespace sdb { + class XSingleSelectQueryComposer; + class SQLContext; +} +namespace sdbcx { + class XTablesSupplier; +} +namespace sdbc { + class XConnection; + class XDatabaseMetaData; + class XRowSet; + class XDataSource; + class SQLException; + class XParameters; + class XRowUpdate; +} +namespace beans { + class XPropertySet; +} +namespace awt { + class XWindow; +} +namespace lang { + struct Locale; + class XMultiServiceFactory; + class WrappedTargetException; +} +namespace container { + class XNameAccess; +} +namespace uno { + class XComponentContext; +} +namespace util { + class XNumberFormatTypes; + class XNumberFormatsSupplier; +} +namespace task { + class XInteractionHandler; +} + +} } } + + +//......................................................................... +namespace dbtools +{ + class ISQLStatementHelper; + typedef ::utl::SharedUNOComponent< ::com::sun::star::sdbc::XConnection > SharedConnection; + + enum EComposeRule + { + eInTableDefinitions, + eInIndexDefinitions, + eInDataManipulation, + eInProcedureCalls, + eInPrivilegeDefinitions, + eComplete + }; +//========================================================================= + // date conversion + + // calculates the default numberformat for a given datatype and a give language + OOO_DLLPUBLIC_DBTOOLS + sal_Int32 getDefaultNumberFormat(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _xColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatTypes >& _xTypes, + const ::com::sun::star::lang::Locale& _rLocale); + + // calculates the default numberformat for a given datatype and a give language + // @param _nDataType @see com.sun.star.sdbc.DataType + // @param _nScale can be zero + OOO_DLLPUBLIC_DBTOOLS + sal_Int32 getDefaultNumberFormat(sal_Int32 _nDataType, + sal_Int32 _nScale, + sal_Bool _bIsCurrency, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatTypes >& _xTypes, + const ::com::sun::star::lang::Locale& _rLocale); + +//========================================================================= + + /** creates a connection which can be used for the rowset given + + The function tries to obtain a connection for the row set with the following + steps (in this order): + <nl> + <li>If the rowset already has an ActiveConnection (means a non-<NULL/> value vor this property), + this one is used.</li> + <li>If row set is part of a database form document (see ->isEmbeddedInDatabase), + a connection for the respective database is used.</li> + <li>If in the parent hierarchy of the row set, there is an object supporting + the XConnection interface, this one is returned.</li> + <li>If the DataSourceName property of the row set is not empty, a connection for this + data source is retrieved.</li> + <li>If the URL property of the row set is not empty, an connection for this URL is + retrieved from the driver manager. + </nl> + + @param _rxRowSet + the row set + + @param _rxFactory + a service factory, which can be used to create data sources, interaction handler etc (the usual stuff) + + @param _bSetAsActiveConnection + If <TRUE/>, the calculated connection is set as ActiveConnection property on the rowset. + + If the connection was newly created by the method, and this parameter is <TRUE/>, then + the ownership of the connection is delivered to a temporary object, which observes the + row set: As soon as a connection-relevant property of the row set changes, or as soon + as somebody else sets another ActiveConnection at the row set, the original + connection (the one which this function calculated) is disposed and discarded. At this + very moment, also the temporary observer object dies. This way, it is ensured that + there's no resource leak from an un-owned connection object. + */ + OOO_DLLPUBLIC_DBTOOLS + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> connectRowset( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext, + sal_Bool _bSetAsActiveConnection + ) SAL_THROW ( ( ::com::sun::star::sdbc::SQLException + , ::com::sun::star::lang::WrappedTargetException + , ::com::sun::star::uno::RuntimeException ) ); + + /** ensures that a row set has a valid ActiveConnection, if possible + + This function does nearly the same as ->connectRowset. In fact, it is to be preferred over + ->connectRowset, if possible. + + There are a few differences: + <ul><li>If a connection could be determined for the given RowSet, it is always + set as ActiveConnection.</li> + <li>Definition of the ownership of the created connection allows for more scenarios: + <ul><li>If the connection was not newly created, the returned ->SharedConnection + instance will not have the ownership, since in this case it's assumed + that there already is an instance which has the ownership.</li> + <li>If the connection was newly created, and ->_bUseAutoConnectionDisposer + is <TRUE/>, then the returned SharedConnection instance will <em>not</em> + be the owner of the connection. Instead, the ownership will be delivered + to a temporary object as described for connectRowset.</li> + <li>If the connection was newly created, and ->_bUseAutoConnectionDisposer + is <FALSE/>, then the returned SharedConnection instance will have the + ownership of the XConnection.</li> + </ul> + </li> + </ul> + */ + OOO_DLLPUBLIC_DBTOOLS SharedConnection ensureRowSetConnection( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext, + bool _bUseAutoConnectionDisposer + ) SAL_THROW ( ( ::com::sun::star::sdbc::SQLException + , ::com::sun::star::lang::WrappedTargetException + , ::com::sun::star::uno::RuntimeException ) ); + + /** returns the connection the RowSet is currently working with (which is the ActiveConnection property) + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getConnection(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet) throw (::com::sun::star::uno::RuntimeException); + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getConnection_withFeedback( + const OUString& _rDataSourceName, + const OUString& _rUser, + const OUString& _rPwd, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext) + SAL_THROW ( (::com::sun::star::sdbc::SQLException) ); + + + /** determines whether the given component is part of a document which is an embedded database + document (such as a form) + */ + OOO_DLLPUBLIC_DBTOOLS bool isEmbeddedInDatabase( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxComponent, + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxActualConnection + ); + + /** returns the columns of the named table of the given connection + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> getTableFields( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _rxConn, + const OUString& _rName + ); + + /** returns the primary key columns of the table + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> getPrimaryKeyColumns_throw( + const ::com::sun::star::uno::Any& i_aTable + ); + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> getPrimaryKeyColumns_throw( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& i_xTable + ); + + /** get fields for a result set given by a "command descriptor" + + <p>A command descriptor here means: + <ul><li>a SDB-level connection (<type scope="com.sun.star.sdb">Connection</type></li> + <li>a string specifying the name of an object relative to the connection</li> + <li>a <type scope="com.sun.star.sdb">CommandType</type> value specifying the type + of the object</type></li> + </ul> + </p> + + @param _rxConnection + the connection relative to which the to-be-examined object exists + + @param _nCommandType + the type of the object + + @param _rCommand + the object. This may be a table name, a query name, or an SQL statement, depending on the value + of <arg>_nCommandType</arg> + + @param _rxCollectionOner + If (and only if) <arg>CommandType</arg> is CommandType.COMMAND, the fields collection which is returned + by this function here is a temporary object. It is kept alive by another object, which is to be + created temporarily, too. To ensure that the fields you get are valid as long as you need them, + the owner which controls their life time is transfered to this parameter upon return.<br/> + + Your fields live as long as this component lives.<br/> + + Additionally, you are encouraged to dispose this component as soon as you don't need the fields anymore. + It depends on the connection's implementation if this is necessary, but the is no guarantee, so to + be on the safe side with respect to resource leaks, you should dispose the component. + + @param _pErrorInfo + If not <NULL/>, then upon return from the function the instance pointed to by this argument will + contain any available error information in case something went wrong. + + @return + the container of the columns (aka fields) of the object + */ + OOO_DLLPUBLIC_DBTOOLS + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > + getFieldsByCommandDescriptor( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const sal_Int32 _nCommandType, + const OUString& _rCommand, + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& _rxKeepFieldsAlive, + SQLExceptionInfo* _pErrorInfo = NULL + ) SAL_THROW( ( ) ); + + + /** get fields for a result set given by a "command descriptor" + + <p>A command descriptor here means: + <ul><li>a SDB-level connection (<type scope="com.sun.star.sdb">Connection</type></li> + <li>a string specifying the name of an object relative to the connection</li> + <li>a <type scope="com.sun.star.sdb">CommandType</type> value specifying the type + of the object</type></li> + </ul> + </p> + + @param _rxConnection + the connection relative to which the to-be-examined object exists + + @param _nCommandType + the type of the object + + @param _rCommand + the object. This may be a table name, a query name, or an SQL statement, depending on the value + of <arg>_nCommandType</arg> + + @param _pErrorInfo + If not <NULL/>, then upon return from the function the instance pointed to by this argument will + contain any available error information in case something went wrong. + + @return + an array of strings containing the names of the columns (aka fields) of the object + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Sequence< OUString > + getFieldNamesByCommandDescriptor( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const sal_Int32 _nCommandType, + const OUString& _rCommand, + SQLExceptionInfo* _pErrorInfo = NULL + ) SAL_THROW( ( ) ); + + + /** create a new ::com::sun::star::sdbc::SQLContext, fill it with the given descriptions and the given source, + and <i>append</i> _rException (i.e. put it into the NextException member of the SQLContext). + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::sdb::SQLContext prependContextInfo(const ::com::sun::star::sdbc::SQLException& _rException, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, const OUString& _rContextDescription, const OUString& _rContextDetails ); + + OOO_DLLPUBLIC_DBTOOLS + ::com::sun::star::sdbc::SQLException prependErrorInfo( + const ::com::sun::star::sdbc::SQLException& _rChainedException, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const OUString& _rAdditionalError, + const StandardSQLState _eSQLState = SQL_ERROR_UNSPECIFIED, + const sal_Int32 _nErrorCode = 0); + + /** search the parent hierachy for a data source. + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> findDataSource(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xParent); + + /** determines the value of a booolean data source setting, given by ASCII name + + @param _rxConnection + the connection belonging to the data source whose setting is to be retrieved + @param _pAsciiSettingName + the ASCII name of the setting + */ + OOO_DLLPUBLIC_DBTOOLS bool getBooleanDataSourceSetting( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const sal_Char* _pAsciiSettingName + ); + + /** check if a specific property is enabled in the info sequence + @deprecated + Use getBooleanDataSourceSetting instead, which cares for the default of the property itself, + instead of spreading this knowledge through all callers. + */ + OOO_DLLPUBLIC_DBTOOLS + sal_Bool isDataSourcePropertyEnabled(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface>& _xProp + ,const OUString& _sProperty, + sal_Bool _bDefault = sal_False); + + /** retrieves a particular indirect data source setting + + @param _rxDataSource + a data source component + @param _pAsciiSettingsName + the ASCII name of the setting to obtain + @param _rSettingsValue + the value of the setting, upon successful return + + @return + <FALSE/> if the setting is not present in the <member scope="com::sun::star::sdb">DataSource::Info</member> + member of the data source + <TRUE/> otherwise + */ + OOO_DLLPUBLIC_DBTOOLS + bool getDataSourceSetting( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxDataSource, + const sal_Char* _pAsciiSettingsName, + ::com::sun::star::uno::Any& /* [out] */ _rSettingsValue + ); + OOO_DLLPUBLIC_DBTOOLS + bool getDataSourceSetting( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxDataSource, + const OUString& _sSettingsName, + ::com::sun::star::uno::Any& /* [out] */ _rSettingsValue + ); + + OOO_DLLPUBLIC_DBTOOLS OUString getDefaultReportEngineServiceName(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxFactory); + + /** quote the given name with the given quote string. + */ + OOO_DLLPUBLIC_DBTOOLS OUString quoteName(const OUString& _rQuote, const OUString& _rName); + + /** quote the given table name (which may contain a catalog and a schema) according to the rules provided by the meta data + */ + OOO_DLLPUBLIC_DBTOOLS + OUString quoteTableName(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData>& _rxMeta + , const OUString& _rName + ,EComposeRule _eComposeRule); + + /** split a fully qualified table name (including catalog and schema, if appliable) into it's component parts. + @param _rxConnMetaData meta data describing the connection where you got the table name from + @param _rQualifiedName fully qualified table name + @param _rCatalog (out parameter) upon return, contains the catalog name + @param _rSchema (out parameter) upon return, contains the schema name + @param _rName (out parameter) upon return, contains the table name + @param _eComposeRule where do you need the name for + */ + OOO_DLLPUBLIC_DBTOOLS void qualifiedNameComponents(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rxConnMetaData, + const OUString& _rQualifiedName, OUString& _rCatalog, OUString& _rSchema, OUString& _rName,EComposeRule _eComposeRule); + + /** calculate a NumberFormatsSupplier for use with an given connection + @param _rxConn the connection for which the formatter is requested + @param _bAllowDefault if the connection (and related components, such as it's parent) cannot supply + a formatter, we can ask the DatabaseEnvironment for a default one. This parameter + states if this is allowed. + @param _rxFactory required (only of _bAllowDefault is sal_True) for creating the DatabaseEnvironment. + @return the formatter all object related to the given connection should work with. + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier> getNumberFormats( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _rxConn, + sal_Bool _bAllowDefault = sal_False, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext = ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>() + ); + + /** create an <type scope="com::sun::star::sdb">XSingleSelectQueryComposer</type> which represents + the current settings (Command/CommandType/Filter/Order) of the given rowset. + + As such an instance can be obtained from a <type scope="com::sun::star::sdb">Connection</type> + only the function searches for the connection the RowSet is using via connectRowset. + This implies that a connection will be set on the RowSet if needed. + (need to changes this sometimes ...) + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer > getCurrentSettingsComposer( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxRowSetProps, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext + ); + + /** transfer and translate properties between two FormComponents + @param _rxOld the source property set + @param _rxNew the destination property set + @param _rLocale the locale for converting number related properties + */ + OOO_DLLPUBLIC_DBTOOLS void TransferFormComponentProperties( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxOld, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxNew, + const ::com::sun::star::lang::Locale& _rLocale + ); + + /** check if the property "Privileges" supports ::com::sun::star::sdbcx::Privilege::INSERT + @param _rxCursorSet the property set + */ + OOO_DLLPUBLIC_DBTOOLS sal_Bool canInsert(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxCursorSet); + /** check if the property "Privileges" supports ::com::sun::star::sdbcx::Privilege::UPDATE + @param _rxCursorSet the property set + */ + OOO_DLLPUBLIC_DBTOOLS sal_Bool canUpdate(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxCursorSet); + /** check if the property "Privileges" supports ::com::sun::star::sdbcx::Privilege::DELETE + @param _rxCursorSet the property set + */ + OOO_DLLPUBLIC_DBTOOLS sal_Bool canDelete(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxCursorSet); + + //---------------------------------------------------------------------------------- + /** compose a complete table name from it's up to three parts, regarding to the database meta data composing rules + */ + OOO_DLLPUBLIC_DBTOOLS OUString composeTableName( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rxMetaData, + const OUString& _rCatalog, + const OUString& _rSchema, + const OUString& _rName, + sal_Bool _bQuote, + EComposeRule _eComposeRule); + + /** composes a table name for usage in a SELECT statement + + This includes quoting of the table as indicated by the connection's meta data, plus respecting + the settings "UseCatalogInSelect" and "UseSchemaInSelect", which might be present + in the data source which the connection belongs to. + */ + OOO_DLLPUBLIC_DBTOOLS OUString composeTableNameForSelect( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const OUString& _rCatalog, + const OUString& _rSchema, + const OUString& _rName ); + + /** composes a table name for usage in a SELECT statement + + This includes quoting of the table as indicated by the connection's meta data, plus respecting + the settings "UseCatalogInSelect" and "UseSchemaInSelect", which might be present + in the data source which the connection belongs to. + */ + OOO_DLLPUBLIC_DBTOOLS OUString composeTableNameForSelect( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xTable ); + //---------------------------------------------------------------------------------- + /** compose the table name out of the property set which must support the properties from the service <member scope= "com::sun::star::sdbcx">table</member> + @param _xMetaData + The metadata from the connection. + @param _xTable + The table. + */ + OOO_DLLPUBLIC_DBTOOLS OUString composeTableName( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData>& _xMetaData, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xTable, + EComposeRule _eComposeRule, + bool _bSuppressCatalogName, + bool _bSuppressSchemaName, + bool _bQuote); + + //---------------------------------------------------------------------------------- + OOO_DLLPUBLIC_DBTOOLS sal_Int32 getSearchColumnFlag( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _rxConn, + sal_Int32 _nDataType); + // return the datasource for the given datasource name + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> getDataSource(const OUString& _rsDataSourceName, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext); + + /** search for a name that is NOT in the NameAcces + @param _rxContainer + the NameAccess container to search in + @param _rBaseName + the base name that should be used to create the new name + @param _bStartWithNumber + When <TRUE/> the name ends with number even when the name itself doesn't occur in the collection. + @return + A name which doesn't exist in the collection. + */ + OOO_DLLPUBLIC_DBTOOLS + OUString createUniqueName(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>& _rxContainer, + const OUString& _rBaseName, + sal_Bool _bStartWithNumber = sal_True); + + /** creates a unique name which is not already used in the given name array + */ + OOO_DLLPUBLIC_DBTOOLS OUString createUniqueName( + const ::com::sun::star::uno::Sequence< OUString >& _rNames, + const OUString& _rBaseName, + sal_Bool _bStartWithNumber = sal_True + ); + + /** create a name which is a valid SQL 92 identifier name + @param _rName the string which should be converted + @param _rSpecials @see com.sun.star.sdbc.XDatabaseMetaData.getExtraNameCharacters + + @see isValidSQLName + */ + OOO_DLLPUBLIC_DBTOOLS OUString convertName2SQLName(const OUString& _rName,const OUString& _rSpecials); + + /** checks whether the given name is a valid SQL name + + @param _rName the string which should be converted + @param _rSpecials @see com.sun.star.sdbc.XDatabaseMetaData.getExtraNameCharacters + + @see convertName2SQLName + */ + OOO_DLLPUBLIC_DBTOOLS sal_Bool isValidSQLName( const OUString& _rName, const OUString& _rSpecials ); + + OOO_DLLPUBLIC_DBTOOLS + void showError( const SQLExceptionInfo& _rInfo, + const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow>& _pParent, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext); + + /** implements <method scope="com.sun.star.sdb">XRowUpdate::updateObject</method> + <p>The object which is to be set is analyzed, and in case it is a simlpe scalar type for which there + is another updateXXX method, this other method is used.</p> + @param _rxUpdatedObject + the interface to forward all updateXXX calls to (except updateObject) + @param _nColumnIndex + the column index to update + @param _rValue + the value to update + @return + <TRUE/> if the update request was successfully re-routed to one of the other updateXXX methods + */ + OOO_DLLPUBLIC_DBTOOLS + sal_Bool implUpdateObject( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowUpdate >& _rxUpdatedObject, + const sal_Int32 _nColumnIndex, + const ::com::sun::star::uno::Any& _rValue) SAL_THROW ( ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ); + + + + /** ask the user for parameters if the prepared statement needs some and sets them in the prepared statement + @param _xConnection the connection must be able to create <type scope="com::sun::star::sdb">SingleSelectQueryComposer</type>s + @param _xPreparedStmt the prepared statement where the parameters could be set when needed + @param _aParametersSet contains which parameters have to asked for and which already have set. + */ + OOO_DLLPUBLIC_DBTOOLS + void askForParameters( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer >& _xComposer, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters>& _xParameters, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _rxHandler, + const ::std::vector<bool, std::allocator<bool> >& _aParametersSet = ::std::vector<bool, std::allocator<bool> >()); + + /** call the appropriate set method for the specific sql type @see com::sun::star::sdbc::DataType + @param _xParams the parameters where to set the value + @param parameterIndex the index of the parameter, 1 based + @param x the value to set + @param sqlType the corresponding sql type @see com::sun::star::sdbc::DataType + @param scale the scale of the sql type can be 0 + */ + OOO_DLLPUBLIC_DBTOOLS + void setObjectWithInfo( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters>& _xParameters, + sal_Int32 parameterIndex, + const ::com::sun::star::uno::Any& x, + sal_Int32 sqlType, + sal_Int32 scale=0) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + /** call the appropriate set method for the specific sql type @see com::sun::star::sdbc::DataType + @param _xParams the parameters where to set the value + @param parameterIndex the index of the parameter, 1 based + @param x the value to set + @param sqlType the corresponding sql type @see com::sun::star::sdbc::DataType + @param scale the scale of the sql type can be 0 + */ + OOO_DLLPUBLIC_DBTOOLS + void setObjectWithInfo( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters>& _xParameters, + sal_Int32 parameterIndex, + const ::connectivity::ORowSetValue& x, + sal_Int32 sqlType, + sal_Int32 scale=0) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + + /** implements <method scope="com.sun.star.sdb">XParameters::setObject</method> + <p>The object which is to be set is analyzed, and in case it is a simlpe scalar type for which there + is another setXXX method, this other method is used.</p> + @param _rxParameters + the interface to forward all setXXX calls to (except setObject) + @param _nColumnIndex + the column index to update + @param _rValue + the value to update + @return + <TRUE/> if the update request was successfully re-routed to one of the other updateXXX methods + */ + OOO_DLLPUBLIC_DBTOOLS + sal_Bool implSetObject( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters>& _rxParameters, + const sal_Int32 _nColumnIndex, + const ::com::sun::star::uno::Any& _rValue) SAL_THROW ( ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ) ); + + /** creates the standard sql create table statement without the key part. + @param descriptor + The descriptor of the new table. + @param _xConnection + The connection. + @param _bAddScale + The scale will also be added when the value is 0. + */ + OOO_DLLPUBLIC_DBTOOLS + OUString createStandardCreateStatement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, + ISQLStatementHelper* _pHelper, + const OUString& _sCreatePattern = OUString()); + + /** creates the standard sql statement for the key part of a create table statement. + @param descriptor + The descriptor of the new table. + @param _xConnection + The connection. + */ + OOO_DLLPUBLIC_DBTOOLS + OUString createStandardKeyStatement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection); + + /** creates the standard sql statement for the column part of a create table statement. + @param _pHelper + Allow to add special SQL constructs. + @param descriptor + The descriptor of the column. + @param _xConnection + The connection. + @param _pHelper + Allow to add special SQL constructs. + */ + OOO_DLLPUBLIC_DBTOOLS + OUString createStandardColumnPart( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor + ,const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection + ,ISQLStatementHelper* _pHelper = NULL + ,const OUString& _sCreatePattern = OUString()); + + /** creates a SQL CREATE TABLE statement + + @param descriptor + The descriptor of the new table. + @param _xConnection + The connection. + @param _pHelper + Allow to add special SQL constructs. + @param _sCreatePattern + + @return + The CREATE TABLE statement. + */ + OOO_DLLPUBLIC_DBTOOLS + OUString createSqlCreateTableStatement( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor + ,const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection + ,ISQLStatementHelper* _pHelper = NULL + ,const OUString& _sCreatePattern = OUString()); + + /** creates a SDBC column with the help of getColumns. + @param _xTable + The table. + @param _rName + The name of the column. + @param _bCase + Is the column case sensitive. + @param _bQueryForInfo + If <TRUE/> the autoincrement and currency field will be read from the meta data, otherwise the following parameters will be used instead + @param _bIsAutoIncrement + <TRUE/> if the column is an autoincrement. + @param _bIsCurrency + <TRUE/> if the column is a currency field. + @param _nDataType + The data type of the column. + */ + OOO_DLLPUBLIC_DBTOOLS + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> + createSDBCXColumn( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xTable, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, + const OUString& _rName, + sal_Bool _bCase, + sal_Bool _bQueryForInfo = sal_True, + sal_Bool _bIsAutoIncrement = sal_False, + sal_Bool _bIsCurrency = sal_False, + sal_Int32 _nDataType = com::sun::star::sdbc::DataType::OTHER); + + /** tries to locate the corresponding DataDefinitionSupplier for the given url and connection + @param _rsUrl + The URL used to connect to the database. + @param _xConnection + The connection used to find the correct driver. + @param _rxContext + Used to create the drivermanager. + @return + The datadefintion object. + */ + OOO_DLLPUBLIC_DBTOOLS ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier> getDataDefinitionByURLAndConnection( + const OUString& _rsUrl, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext); + + /** returns the table privileges to the given parameters + @param _xMetaData + The meta data. + @param _sCatalog + contains the catalog name + @param _sSchema + contains the schema name + @param _sTable + contains the table name + */ + OOO_DLLPUBLIC_DBTOOLS + sal_Int32 getTablePrivileges(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData>& _xMetaData, + const OUString& _sCatalog, + const OUString& _sSchema, + const OUString& _sTable); + + typedef ::std::pair<sal_Bool,sal_Bool> TBoolPair; + typedef ::std::pair< TBoolPair,sal_Int32 > ColumnInformation; + typedef ::std::multimap< OUString, ColumnInformation, ::comphelper::UStringMixLess> ColumnInformationMap; + /** collects the information about auto increment, currency and data type for the given column name. + The column must be quoted, * is also valid. + @param _xConnection + The connection. + @param _sComposedTableName + The quoted table name. ccc.sss.ttt + @param _sName + The name of the column, or * + @param _rInfo + The information about the column(s). + */ + OOO_DLLPUBLIC_DBTOOLS + void collectColumnInformation( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection, + const OUString& _sComposedTableName, + const OUString& _rName, + ColumnInformationMap& _rInfo); + + + /** adds a boolean comparison clause to the given SQL predicate + + @param _rExpression + the expression which is to be compared with a boolean value + @param _bValue + the boolean value which the expression is to be compared with + @param _nBooleanComparisonMode + the boolean comparison mode to be used. Usually obtained from + a css.sdb.DataSource's Settings member. + @param _out_rSQLPredicate + the buffer to which the comparison predicate will be appended + */ + OOO_DLLPUBLIC_DBTOOLS void getBoleanComparisonPredicate( + const OUString& _rExpression, + const sal_Bool _bValue, + const sal_Int32 _nBooleanComparisonMode, + OUStringBuffer& _out_rSQLPredicate + ); + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // _CONNECTIVITY_DBTOOLS_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/dbtoolsdllapi.hxx b/include/connectivity/dbtoolsdllapi.hxx new file mode 100644 index 000000000000..51210a633092 --- /dev/null +++ b/include/connectivity/dbtoolsdllapi.hxx @@ -0,0 +1,35 @@ +/* -*- 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 . + */ + +#ifndef INCLUDED_CONNECTIVITY_DBTOOLSDLLAPI_HXX +#define INCLUDED_CONNECTIVITY_DBTOOLSDLLAPI_HXX + +#include "sal/config.h" + +#include "sal/types.h" + +#if defined OOO_DLLIMPLEMENTATION_DBTOOLS +#define OOO_DLLPUBLIC_DBTOOLS SAL_DLLPUBLIC_EXPORT +#else +#define OOO_DLLPUBLIC_DBTOOLS SAL_DLLPUBLIC_IMPORT +#endif + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/filtermanager.hxx b/include/connectivity/filtermanager.hxx new file mode 100644 index 000000000000..c489a91e5033 --- /dev/null +++ b/include/connectivity/filtermanager.hxx @@ -0,0 +1,123 @@ +/* -*- 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 . + */ +#ifndef CONNECTIVITY_FILTERMANAGER_HXX +#define CONNECTIVITY_FILTERMANAGER_HXX + +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/sdb/XSQLQueryComposer.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> + +#include <rtl/ustrbuf.hxx> + +#include <vector> +#include "connectivity/dbtoolsdllapi.hxx" + +//........................................................................ +namespace dbtools +{ +//........................................................................ + + //==================================================================== + //= FilterManager + //==================================================================== + /** manages the filter of a database component with filter properties + + The idea is that the filter which a database component actually really uses is composed of several single + filter components (which all are conjunctive). + + First, there is a component which is visible to the clients of the database component itself - if they ask + the database component for the Filter property, they will get this public filter. + + Second, there is an implicit filter, which is (to be) created from the MasterFields and DetailFields + property of the database component, if the latter denote columns.<br/> + For instance, if there is a link-pair CustomerID->cid, where |CustomerID| is a column of the master + database component, and |cid| is a column of the detail database component (the database component we're responsible for), then there will + be an implicit filter "cid = :param_cid_link" (or something like this), which is never visible + to the clients of the database component, but nevertheless needs to be propagated to the aggregated RowSet.<br/> + Actually, this implicit filter is maintained by the FormParameterManager. + + Potentially, there could be more filter components (for instance, you could imagine database component + controls which act as live filter, which could be implemented with a third component), but + at the moment there are only these two. + */ + class OOO_DLLPUBLIC_DBTOOLS FilterManager + { + public: + enum FilterComponent + { + fcPublicFilter = 0, // the filter which is to be published as "Filter" property of the database component + fcLinkFilter, // the filter part which is implicitly created for a database component when connecting + // master and detail database components via column names + + FC_COMPONENT_COUNT // boundary delimiter, not to be used from outside + }; + + private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > + m_xORB; + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + m_xComponentAggregate; + ::std::vector< OUString > m_aFilterComponents; + sal_Bool m_bApplyPublicFilter; + + public: + /// ctor + explicit FilterManager( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB + ); + + /// late ctor + void initialize(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxComponentAggregate ); + + /// makes the object forgetting the references to the database component + void dispose( ); + + const OUString& getFilterComponent( FilterComponent _eWhich ) const; + void setFilterComponent( FilterComponent _eWhich, const OUString& _rComponent ); + + inline sal_Bool isApplyPublicFilter( ) const { return m_bApplyPublicFilter; } + void setApplyPublicFilter( sal_Bool _bApply ); + + private: + /** retrieves a filter which is a conjunction of all single filter components + */ + OUString getComposedFilter( ) const; + + /** appends one filter component to the statement in our composer + */ + void appendFilterComponent( OUStringBuffer& io_appendTo, const OUString& i_component ) const; + + /// checks whether there is only one (or even no) non-empty filter component + bool isThereAtMostOneComponent( OUStringBuffer& o_singleComponent ) const; + + /// returns the index of the first filter component which should be considered when building the composed filter + inline sal_Int32 getFirstApplicableFilterIndex() const + { + return m_bApplyPublicFilter ? fcPublicFilter : fcPublicFilter + 1; + } + }; + +//........................................................................ +} // namespacefrm +//........................................................................ + +#endif // CONNECTIVITY_FORMFILTERMANAGER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/formattedcolumnvalue.hxx b/include/connectivity/formattedcolumnvalue.hxx new file mode 100644 index 000000000000..fe5c4dbfff52 --- /dev/null +++ b/include/connectivity/formattedcolumnvalue.hxx @@ -0,0 +1,110 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_FORMATTEDCOLUMNVALUE_HXX +#define CONNECTIVITY_FORMATTEDCOLUMNVALUE_HXX + +#include <com/sun/star/sdbc/XRowSet.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/sdb/XColumn.hpp> +#include <com/sun/star/sdb/XColumnUpdate.hpp> +#include <com/sun/star/util/XNumberFormatter.hpp> + +#include <boost/noncopyable.hpp> + +#include <memory> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace comphelper { class ComponentContext; } + +//........................................................................ +namespace dbtools +{ +//........................................................................ + + struct FormattedColumnValue_Data; + //==================================================================== + //= FormattedColumnValue + //==================================================================== + /** a class which helps retrieving and setting the value of a database column + as formatted string. + */ + class OOO_DLLPUBLIC_DBTOOLS FormattedColumnValue : public ::boost::noncopyable + { + public: + /** constructs an instance + + The format key for the string value exchange is taken from the given column object. + If it has a non-<NULL/> property value <code>FormatKey</code>, this key is taken. + Otherwise, a default format matching the column type is determined. + + The locale of this fallback format is the current system locale. + + The number formats supplier is determined from the given <code>RowSet</code>, by + examining its <code>ActiveConnection</code>. + */ + FormattedColumnValue( + const ::comphelper::ComponentContext& _rContext, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& _rxRowSet, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn + ); + + /** constructs an instance + + The format key for the string value exchange is taken from the given column object. + If it has a non-<NULL/> property value <code>FormatKey</code>, this key is taken. + Otherwise, a default format matching the column type is determined. + + The locale of this fallback format is the current system locale. + */ + FormattedColumnValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& i_rNumberFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& i_rColumn + ); + + // note that all methods of this class need to be virtual, since it's + // used in a load-on-demand context in module SVX + + virtual ~FormattedColumnValue(); + + virtual void clear(); + + // access to the details of the formatting we determined + virtual sal_Int32 getFormatKey() const; + virtual sal_Int32 getFieldType() const; + virtual sal_Int16 getKeyType() const; + virtual const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& + getColumn() const; + virtual const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumnUpdate >& + getColumnUpdate() const; + + virtual bool setFormattedValue( const OUString& _rFormattedStringValue ) const; + virtual OUString getFormattedValue() const; + + private: + ::std::auto_ptr< FormattedColumnValue_Data > m_pData; + }; + +//........................................................................ +} // namespace dbtools +//........................................................................ + +#endif // CONNECTIVITY_FORMATTEDCOLUMNVALUE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/parameters.hxx b/include/connectivity/parameters.hxx new file mode 100644 index 000000000000..9bdbe0e5c3fb --- /dev/null +++ b/include/connectivity/parameters.hxx @@ -0,0 +1,417 @@ +/* -*- 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 . + */ +#ifndef CONNECTIVITY_PARAMETERS_HXX +#define CONNECTIVITY_PARAMETERS_HXX + +#include <map> +#include <vector> + +#include <com/sun/star/uno/XAggregation.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/form/XDatabaseParameterListener.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/task/XInteractionHandler.hpp> +#include <com/sun/star/sdbc/XParameters.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/paramwrapper.hxx" +#include <unotools/sharedunocomponent.hxx> +#include <comphelper/implementationreference.hxx> +#include <cppuhelper/interfacecontainer.hxx> + +//........................................................................ +namespace dbtools +{ +//........................................................................ + + typedef ::utl::SharedUNOComponent< ::com::sun::star::sdb::XSingleSelectQueryComposer, ::utl::DisposableComponent > + SharedQueryComposer; + + //==================================================================== + //= ParameterManager + //==================================================================== + class FilterManager; + class OOO_DLLPUBLIC_DBTOOLS ParameterManager + { + public: + /// classifies the origin of the data to fill a parameter + enum ParameterClassification + { + /** parameters which are filled from the master-detail relationship, where the detail + name is an explicit parameter name + */ + eLinkedByParamName, + /** parameters which are filled from the master-detail relationship, where the detail + name is a column name, so an implicit parameter had to be generated for it + */ + eLinkedByColumnName, + /** parameters which are filled externally (i.e. by XParameters::setXXX, or by the parameter listeners) + */ + eFilledExternally + }; + /** meta data about an inner parameter + */ + private: + struct ParameterMetaData + { + /// the type of the parameter + ParameterClassification eType; + /// the column object for this parameter, as returned by the query composer + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + xComposerColumn; + /// the indicies of inner parameters which need to be filled when this concrete parameter is set + ::std::vector< sal_Int32 > aInnerIndexes; + + /// default ctor + ParameterMetaData() + :eType( eFilledExternally ) + { + } + + /// ctor with composer column + ParameterMetaData( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn ) + :eType ( eFilledExternally ) + ,xComposerColumn ( _rxColumn ) + { + } + }; + + typedef ::std::map< OUString, ParameterMetaData > ParameterInformation; + + private: + ::osl::Mutex& m_rMutex; + ::cppu::OInterfaceContainerHelper m_aParameterListeners; + + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > + m_xContext; + + ::com::sun::star::uno::WeakReference< ::com::sun::star::beans::XPropertySet > + m_xComponent; // the database component whose parameters we're handling + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation > + m_xAggregatedRowSet; // the aggregated row set - necessary for unwrapped access to some interfaces + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters > + m_xInnerParamUpdate; // write access to the inner parameters + SharedQueryComposer m_xComposer; // query composer wrapping the statement which the *aggregate* is based on + SharedQueryComposer m_xParentComposer; // query composer wrapping the statement of our parent database component + ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > + m_xInnerParamColumns; // index access to the parameter columns, as got from the query composer + + ::dbtools::param::ParametersContainerRef + m_pOuterParameters; // the container of parameters which still need to be filled in by + // external instances + sal_Int32 m_nInnerCount; // overall number of parameters as required by the database component's aggregate + + ParameterInformation m_aParameterInformation; + + ::com::sun::star::uno::Sequence< OUString > m_aMasterFields; + ::com::sun::star::uno::Sequence< OUString > m_aDetailFields; + + OUString m_sIdentifierQuoteString; + OUString m_sSpecialCharacters; + + ::std::vector< bool > m_aParametersVisited; + + bool m_bUpToDate; + + public: + /** ctor + */ + explicit ParameterManager( + ::osl::Mutex& _rMutex, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext + ); + + /// late ctor + void initialize( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxComponent, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation >& _rxComponentAggregate + ); + + /// makes the object forgetting the references to the database component + void dispose( ); + + /// clears the instance data + void clearAllParameterInformation(); + + /// checks whether the parameter information are up-to-date + inline bool isUpToDate() const { return m_bUpToDate; } + + /** updates all parameter information represented by the instance + */ + void updateParameterInfo( FilterManager& _rFilterManager ); + + /** fills parameter values, as extensive as possible + + <p>In particular, all values which can be filled from the master-detail relationship of + between our database component and it's parent are filled in.</p> + + @param _rxCompletionHandler + an interaction handler which should be used to fill all parameters which + cannot be filled by other means. May be <NULL/> + @param _rClearForNotifies + the mutex guard to be (temporarily) cleared for notifications + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + + @return + <TRUE/> if and only if the parameter filling has <em>not</em> been cancelled by the user + */ + bool fillParameterValues( + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _rxCompletionHandler, + ::osl::ResettableMutexGuard& _rClearForNotifies + ); + + /** sets all parameter values to null (via <member>XParameters::setNull</member>) + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + */ + void setAllParametersNull() SAL_THROW( ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ) ); + + /** resets all detail columns which are, via a parameter, linked to a master column, to + the value of this master column. + + For instance, if the database component is bound to a statement <code>SELECT * from invoice where inv_id = :cid</code>, + and there is <em>one</em> master-detail link from + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + */ + void resetParameterValues() SAL_THROW(()); + + /** tells the object that it's database component is being disposed + + The object then fires the <member>XEventListener::disposing</member> notification to + the parameter listeners + */ + void disposing( const ::com::sun::star::lang::EventObject& _rDisposingEvent ); + + /** adds the given listener to the list of parameter listeners + */ + void addParameterListener( + const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& _rxListener + ); + + /** removes the given listener from the list of parameter listeners + */ + void removeParameterListener( + const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& _rxListener + ); + + // XParameters equivalents + void setNull ( sal_Int32 _nIndex, sal_Int32 sqlType); + void setObjectNull ( sal_Int32 _nIndex, sal_Int32 sqlType, const OUString& typeName); + void setBoolean ( sal_Int32 _nIndex, sal_Bool x); + void setByte ( sal_Int32 _nIndex, sal_Int8 x); + void setShort ( sal_Int32 _nIndex, sal_Int16 x); + void setInt ( sal_Int32 _nIndex, sal_Int32 x); + void setLong ( sal_Int32 _nIndex, sal_Int64 x); + void setFloat ( sal_Int32 _nIndex, float x); + void setDouble ( sal_Int32 _nIndex, double x); + void setString ( sal_Int32 _nIndex, const OUString& x); + void setBytes ( sal_Int32 _nIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x); + void setDate ( sal_Int32 _nIndex, const ::com::sun::star::util::Date& x); + void setTime ( sal_Int32 _nIndex, const ::com::sun::star::util::Time& x); + void setTimestamp ( sal_Int32 _nIndex, const ::com::sun::star::util::DateTime& x); + void setBinaryStream ( sal_Int32 _nIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream>& x, sal_Int32 length); + void setCharacterStream ( sal_Int32 _nIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream>& x, sal_Int32 length); + void setObject ( sal_Int32 _nIndex, const ::com::sun::star::uno::Any& x); + void setObjectWithInfo ( sal_Int32 _nIndex, const ::com::sun::star::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale); + void setRef ( sal_Int32 _nIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef>& x); + void setBlob ( sal_Int32 _nIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob>& x); + void setClob ( sal_Int32 _nIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob>& x); + void setArray ( sal_Int32 _nIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray>& x); + void clearParameters(); + + private: + /// checkes whether the object is already initialized, and not yet disposed + inline bool isAlive() const { return m_xComponent.get().is() && m_xInnerParamUpdate.is(); } + + /** creates a filter expression from a master-detail link where the detail denotes a column name + */ + OUString + createFilterConditionFromColumnLink( + const OUString& /* [in] */ _rMasterColumn, + const OUString& /* [in] */ _rDetailColumn, + OUString& /* [out] */ _rNewParamName + ); + + /** initializes our query composer, and the collection of inner parameter columns + + @param _rxComponent + the database component to initialize from. Must not be <NULL/> + @return + <TRUE/> if and only if the initialization was successful + + @postcond + if and only if <TRUE/> is returned, then <member>m_xInnerParamColumns</member> contains the collection of + inner parameters + */ + bool initializeComposerByComponent( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxComponent + ); + + /** collects initial meta information about inner parameters (i.e. it initially fills + <member>m_aParameterInformation</member>). + + @param _bSecondRun + if <TRUE/>, this is the second run, because we ourself previously extended the filter of + the RowSet + + @precond + <member>m_xInnerParamColumns</member> is not <NULL/> + */ + void collectInnerParameters( bool _bSecondRun ); + + /** analyzes the master-detail links for our database component, and initializes m_aMasterFields and m_aDetailFields + + @param _rFilterManager + the filter manager of the database component + @param _rColumnsInLinkDetails + will be set to <TRUE/> if and only if there were link pairs where the detail field denoted + a column name of our database component + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + */ + void analyzeFieldLinks( FilterManager& _rFilterManager, bool& /* [out] */ _rColumnsInLinkDetails ); + + /** classifies the link pairs + + @param _rxParentColumns + the columns of the parent database component + + @param _rxColumns + the columns of our own database component + + @param _out_rAdditionalFilterComponents + the additional filter components which are required for master-detail relationships where + the detail part denotes a column name. In such a case, an additional filter needs to be created, + containing a new parameter. + + @precond + <member>m_aMasterFields</member> and <member>m_aDetailFields</member> have the same length + */ + void classifyLinks( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxParentColumns, + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxColumns, + ::std::vector< OUString >& _out_rAdditionalFilterComponents + ) SAL_THROW(( ::com::sun::star::uno::Exception )); + + /** finalizes our <member>m_pOuterParameters</member> so that it can be used for + external parameter listeners + + @precond + <member>m_pOuterParameters</member> is <NULL/> + @precond + <member>m_xInnerParamUpdate</member> is not <NULL/> + */ + void createOuterParameters(); + + /** fills in the parameters values which result from the master-detail relationship + between the database component and it's parent + + @param _rxParentColumns + the columns of the parameter database component. Must not be <NULL/> + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + */ + void fillLinkedParameters( + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxParentColumns + ); + + /** completes all missing parameters via an interaction handler + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + + @return + <TRUE/> if and only if the parameter filling has <em>not</em> been cancelled by the user + */ + bool completeParameters( + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _rxCompletionHandler, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > _rxConnection + ); + + /** asks the parameter listeners to fill in final values + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + + @return + <TRUE/> if and only if the parameter filling has <em>not</em> been cancelled by the user + */ + bool consultParameterListeners( ::osl::ResettableMutexGuard& _rClearForNotifies ); + + /** mark an externally filled parameter asvisited + */ + void externalParameterVisited( sal_Int32 _nIndex ); + + private: + /** retrieves the columns of the parent database component + + @precond + the instance is alive, i.e. <member>isAlive</member> returns <TRUE/> + @return + <TRUE/> if and only if the columns could be successfully retrieved + */ + bool getParentColumns( + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& /* [out] */ _out_rxParentColumns, + bool _bFromComposer + ); + + /** retrieves the columns of our database component + + @param _bFromComposer + if <TRUE/>, the columns are obtained from the composer, else from the living database component itself + @return + <TRUE/> if and only if the columns could be successfully retrieved + */ + bool getColumns( + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& /* [out] */ _rxColumns, + bool _bFromComposer + ) SAL_THROW(( ::com::sun::star::uno::Exception )); + + /** retrieves the active connection of the database component + */ + bool getConnection( + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& /* [out] */ _rxConnection + ); + + /** caches some info about the connection of our database component + */ + void cacheConnectionInfo() SAL_THROW(( )); + + private: + ParameterManager(); // never implemented + ParameterManager( const ParameterManager& ); // never implemented + ParameterManager& operator=( const ParameterManager& ); // never implemented + }; + +//........................................................................ +} // namespacefrm +//........................................................................ + +#endif // CONNECTIVITY_PARAMETERS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/paramwrapper.hxx b/include/connectivity/paramwrapper.hxx new file mode 100644 index 000000000000..69347e9c4e6d --- /dev/null +++ b/include/connectivity/paramwrapper.hxx @@ -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 . + */ + +#ifndef CONNECTIVITY_PARAMWRAPPER_HXX +#define CONNECTIVITY_PARAMWRAPPER_HXX + +#include "connectivity/dbtoolsdllapi.hxx" +#include <connectivity/FValue.hxx> + +#include <com/sun/star/sdbc/XParameters.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XEnumerationAccess.hpp> +#include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp> + +#include <comphelper/uno3.hxx> +#include <comphelper/broadcasthelper.hxx> +#include <cppuhelper/weak.hxx> +#include <cppuhelper/propshlp.hxx> +#include <cppuhelper/compbase2.hxx> + +#include <memory> +#include <vector> + +//........................................................................ +namespace dbtools +{ +namespace param +{ +//........................................................................ + + //==================================================================== + //= ParameterWrapper + //==================================================================== + /** wraps a parameter column as got from an SQLQueryComposer, so that it has an additional + property "Value", which is forwarded to an XParameters interface + */ + class OOO_DLLPUBLIC_DBTOOLS ParameterWrapper :public ::cppu::OWeakObject + ,public ::comphelper::OMutexAndBroadcastHelper + ,public ::cppu::OPropertySetHelper + { + private: + typedef ::cppu::OWeakObject UnoBase; + typedef ::cppu::OPropertySetHelper PropertyBase; + + private: + /// the most recently set value of the parameter + ::connectivity::ORowSetValue m_aValue; + /// the positions (in our m_xValueDestination) at which the value should be set (0-based!) + ::std::vector< sal_Int32 > m_aIndexes; + + /// the "delegator" column to which standard property requests are forwarded + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xDelegator; + /// the property set info for our delegator + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > m_xDelegatorPSI; + /// the component taking the value + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters > m_xValueDestination; + /// helper for implementing XPropertySetInfo + ::std::auto_ptr< ::cppu::OPropertyArrayHelper > m_pInfoHelper; + + + public: + const ::connectivity::ORowSetValue& Value() const { return m_aValue; } + ::connectivity::ORowSetValue& Value() { return m_aValue; } + + public: + ParameterWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn + ); + + ParameterWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XParameters >& _rxAllParameters, + const ::std::vector< sal_Int32 >& _rIndexes + ); + + DECLARE_XINTERFACE() + DECLARE_XTYPEPROVIDER() + + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException ); + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + + // OPropertySetHelper + virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any& rConvertedValue, ::com::sun::star::uno::Any& rOldValue, sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue) throw( ::com::sun::star::lang::IllegalArgumentException ); + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue ) throw( ::com::sun::star::uno::Exception ); + virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const; + + // pseudo-XComponent + virtual void SAL_CALL dispose(); + + protected: + virtual ~ParameterWrapper(); + + // disambiguations + using ::cppu::OPropertySetHelper::getFastPropertyValue; + + private: + OUString impl_getPseudoAggregatePropertyName( sal_Int32 _nHandle ) const; + + private: + ParameterWrapper(); // not implemented + }; + + //==================================================================== + //= ParameterWrapperContainer + //==================================================================== + typedef ::std::vector< ::rtl::Reference< ParameterWrapper > > Parameters; + + //==================================================================== + //= ParameterWrapperContainer + //==================================================================== + typedef ::cppu::WeakComponentImplHelper2 < ::com::sun::star::container::XIndexAccess + , ::com::sun::star::container::XEnumerationAccess + > ParameterWrapperContainer_Base; + + /// class for the parameter event @see approveParameter + class OOO_DLLPUBLIC_DBTOOLS ParameterWrapperContainer : + public ParameterWrapperContainer_Base + { + private: + ::osl::Mutex m_aMutex; + Parameters m_aParameters; + + protected: + virtual ~ParameterWrapperContainer(); + + public: + /** creates an empty container + */ + ParameterWrapperContainer(); + + /** creates a container from a SingleSelectQuerAnalyzer's parameter columns + + Note that here, the simple constructor of the ParameterWrapper will be used, which does not + use a XParameters instance to forward values to, but only remembers the values itself. + */ + ParameterWrapperContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer >& _rxComposer ); + + // ::com::sun::star::container::XElementAccess + virtual ::com::sun::star::uno::Type SAL_CALL getElementType() throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Bool SAL_CALL hasElements() throw( ::com::sun::star::uno::RuntimeException ); + + // ::com::sun::star::container::XEnumerationAccess + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration() throw( ::com::sun::star::uno::RuntimeException ); + + // ::com::sun::star::container::XIndexAccess + virtual sal_Int32 SAL_CALL getCount() throw( ::com::sun::star::uno::RuntimeException ); + virtual ::com::sun::star::uno::Any SAL_CALL getByIndex(sal_Int32 _rIndex) throw( ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException ); + + public: + const Parameters& getParameters() { return m_aParameters; } + + const ::connectivity::ORowSetValue& operator[]( size_t _index ) const { return m_aParameters[ _index ]->Value(); } + ::connectivity::ORowSetValue& operator[]( size_t _index ) { return m_aParameters[ _index ]->Value(); } + + /** adds an ParameterWrapper to the end of the array + */ + void push_back( ParameterWrapper* _pParameter ) + { + m_aParameters.push_back( _pParameter ); + } + + size_t size() const { return m_aParameters.size(); } + + protected: + // XComponent + virtual void SAL_CALL disposing(); + + private: + void impl_checkDisposed_throw(); + }; + + //==================================================================== + //= ParametersContainer + //==================================================================== + typedef ::rtl::Reference< ParameterWrapperContainer > ParametersContainerRef; + +//........................................................................ +} } // namespace dbtools::param +//........................................................................ + +#endif // CONNECTIVITY_PARAMWRAPPER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/predicateinput.hxx b/include/connectivity/predicateinput.hxx new file mode 100644 index 000000000000..629419c9719d --- /dev/null +++ b/include/connectivity/predicateinput.hxx @@ -0,0 +1,125 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_PREDICATEINPUT_HXX +#define CONNECTIVITY_PREDICATEINPUT_HXX + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/util/XNumberFormatter.hpp> +#include <com/sun/star/i18n/XLocaleData4.hpp> +#include <connectivity/sqlparse.hxx> +#include "connectivity/dbtoolsdllapi.hxx" + +//......................................................................... +namespace dbtools +{ +//......................................................................... + + //===================================================================== + //= OPredicateInputController + //===================================================================== + /** A class which allows input of an SQL predicate for a row set column + into a edit field. + */ + class OOO_DLLPUBLIC_DBTOOLS OPredicateInputController + { + private: + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > + m_xConnection; + ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > + m_xFormatter; + ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData4 > + m_xLocaleData; + + ::connectivity::OSQLParser + m_aParser; + + public: + OPredicateInputController( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::connectivity::IParseContext* _pParseContext = NULL + ); + + /** transforms a "raw" predicate value (usually obtained from a user input) into a valid predicate for the given column + @param _rPredicateValue + The text to normalize. + @param _rxField + The field for which the text should be a predicate value. + @param _pErrorMessage + If not <NULL/>, and a parsing error occurs, the error message will be copied to the string the argument + points to. + */ + sal_Bool normalizePredicateString( + OUString& _rPredicateValue, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxField, + OUString* _pErrorMessage = NULL + ) const; + + /** get's a value of the predicate which can be used in a WHERE clause. + @param _rPredicateValue + the value which has been normalized using normalizePredicateString + @param _rxField + is the field for which a predicate is to be entered + @param _bForStatementUse + If <TRUE/>, the returned value can be used in an SQL statement. If <FALSE/>, it can be used + for instance for setting parameter values. + @param _pErrorMessage + If not <NULL/>, and a parsing error occurs, the error message will be copied to the string the argument + points to. + @see normalizePredicateString + */ + OUString getPredicateValue( + const OUString& _rPredicateValue, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & _rxField, + sal_Bool _bForStatementUse, + OUString* _pErrorMessage = NULL + ) const; + + OUString getPredicateValue( + const OUString& _sField + , const OUString& _rPredicateValue + , sal_Bool _bForStatementUse + , OUString* _pErrorMessage = NULL) const; + + private: + ::connectivity::OSQLParseNode* implPredicateTree( + OUString& _rErrorMessage, + const OUString& _rStatement, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & _rxField + ) const; + + sal_Bool getSeparatorChars( + const ::com::sun::star::lang::Locale& _rLocale, + sal_Unicode& _rDecSep, + sal_Unicode& _rThdSep + ) const; + + OUString implParseNode(::connectivity::OSQLParseNode* pParseNode,sal_Bool _bForStatementUse) const; + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // CONNECTIVITY_PREDICATEINPUT_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/IRefreshable.hxx b/include/connectivity/sdbcx/IRefreshable.hxx new file mode 100644 index 000000000000..629b2b3137b5 --- /dev/null +++ b/include/connectivity/sdbcx/IRefreshable.hxx @@ -0,0 +1,59 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_SDBCX_IREFRESHABLE_HXX_ +#define _CONNECTIVITY_SDBCX_IREFRESHABLE_HXX_ + +#include "connectivity/CommonTools.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + namespace sdbcx + { + class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE IRefreshableGroups + { + public: + virtual void refreshGroups() = 0; + + protected: + ~IRefreshableGroups() {} + }; + + class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE IRefreshableUsers + { + public: + virtual void refreshUsers() = 0; + + protected: + ~IRefreshableUsers() {} + }; + + class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE IRefreshableColumns + { + public: + virtual void refreshColumns() = 0; + + protected: + ~IRefreshableColumns() {} + }; + } +} +#endif //_CONNECTIVITY_SDBCX_IREFRESHABLE_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VCatalog.hxx b/include/connectivity/sdbcx/VCatalog.hxx new file mode 100644 index 000000000000..14840400b385 --- /dev/null +++ b/include/connectivity/sdbcx/VCatalog.hxx @@ -0,0 +1,125 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_CATALOG_HXX_ +#define _CONNECTIVITY_SDBCX_CATALOG_HXX_ + +#include <osl/diagnose.h> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/sdbcx/XViewsSupplier.hpp> +#include <com/sun/star/sdbcx/XUsersSupplier.hpp> +#include <com/sun/star/sdbcx/XGroupsSupplier.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/sdbc/XRow.hpp> +#include <cppuhelper/compbase5.hxx> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include "connectivity/CommonTools.hxx" +#include "connectivity/OSubComponent.hxx" +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/StdTypeDefs.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + namespace sdbcx + { + + class OCollection; + // OCatalog is a general catalog class + // other drivers can be derived their catalog from this class when they want to support sdbcx + // it holds already tables, views, groups and users + + typedef ::cppu::WeakComponentImplHelper5< ::com::sun::star::sdbcx::XTablesSupplier, + ::com::sun::star::sdbcx::XViewsSupplier, + ::com::sun::star::sdbcx::XUsersSupplier, + ::com::sun::star::sdbcx::XGroupsSupplier, + ::com::sun::star::lang::XServiceInfo> OCatalog_BASE; + + + class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE OCatalog : + public OCatalog_BASE, + public IRefreshableGroups, + public IRefreshableUsers, + public connectivity::OSubComponent<OCatalog, OCatalog_BASE> + { + friend class connectivity::OSubComponent<OCatalog, OCatalog_BASE>; + protected: + + ::osl::Mutex m_aMutex; + + // this members are deleted when the dtor is called + // they are hold weak + OCollection* m_pTables; + OCollection* m_pViews; + OCollection* m_pGroups; + OCollection* m_pUsers; + + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; // just to make things easier + + /** builds the name which should be used to access the object later on in the collection. + Will only be called in fillNames. + @param _xRow + The current row from the resultset given to fillNames. + */ + virtual OUString buildName( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow >& _xRow); + + /** fills a vector with the necessary names which can be used in combination with the collections. + For each row buildName will be called. + @param _xResult + The resultset which should be used to fill the names. Will be disposed after return and set to NULL. + @param _rNames + The vector who will be filled. + */ + void fillNames(::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet >& _xResult,TStringVector& _rNames); + + public: + OCatalog(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> &_xConnection); + virtual ~OCatalog(); + + DECLARE_SERVICE_INFO(); + + // refreshTables is called when the method getTables had been called + // the member m_pTables has to be created + virtual void refreshTables() = 0; + // refreshViews is called when the method getViews had been called + virtual void refreshViews() = 0; + + // the other refresh methods come from base classes IRefreshableGroups and IRefreshableUsers + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + // XInterface + void SAL_CALL acquire() throw(); + void SAL_CALL release() throw(); + // XTablesSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getTables( ) throw(::com::sun::star::uno::RuntimeException); + // XViewsSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getViews( ) throw(::com::sun::star::uno::RuntimeException); + // XUsersSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getUsers( ) throw(::com::sun::star::uno::RuntimeException); + // XGroupsSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getGroups( ) throw(::com::sun::star::uno::RuntimeException); + + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_CATALOG_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VCollection.hxx b/include/connectivity/sdbcx/VCollection.hxx new file mode 100644 index 000000000000..e30075f009e9 --- /dev/null +++ b/include/connectivity/sdbcx/VCollection.hxx @@ -0,0 +1,237 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_COLLECTION_HXX_ +#define _CONNECTIVITY_SDBCX_COLLECTION_HXX_ + +#include <cppuhelper/implbase10.hxx> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XEnumerationAccess.hpp> +#include <com/sun/star/container/XEnumeration.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/util/XRefreshable.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> +#include <com/sun/star/sdbcx/XAppend.hpp> +#include <com/sun/star/sdbcx/XDrop.hpp> +#include <com/sun/star/sdbc/XColumnLocate.hpp> +#include <comphelper/stl_types.hxx> +#include <cppuhelper/interfacecontainer.h> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include "connectivity/CommonTools.hxx" +#include <com/sun/star/container/XContainer.hpp> +#include "connectivity/StdTypeDefs.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <memory> + + +namespace connectivity +{ + namespace sdbcx + { + + // the class OCollection is base class for collections :-) + typedef ::cppu::ImplHelper10< ::com::sun::star::container::XNameAccess, + ::com::sun::star::container::XIndexAccess, + ::com::sun::star::container::XEnumerationAccess, + ::com::sun::star::container::XContainer, + ::com::sun::star::sdbc::XColumnLocate, + ::com::sun::star::util::XRefreshable, + ::com::sun::star::sdbcx::XDataDescriptorFactory, + ::com::sun::star::sdbcx::XAppend, + ::com::sun::star::sdbcx::XDrop, + ::com::sun::star::lang::XServiceInfo> OCollectionBase; + + typedef ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > ObjectType; + + class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE IObjectCollection + { + public: + virtual ~IObjectCollection(); + virtual void reserve(size_t nLength) = 0; + virtual bool exists(const OUString& _sName ) = 0; + virtual bool empty() = 0; + virtual void swapAll() = 0; + virtual void swap() = 0; + virtual void clear() = 0; + virtual void reFill(const TStringVector &_rVector) = 0; + virtual void insert(const OUString& _sName,const ObjectType& _xObject) = 0; + virtual bool rename(const OUString _sOldName,const OUString _sNewName) = 0; + virtual sal_Int32 size() = 0; + virtual ::com::sun::star::uno::Sequence< OUString > getElementNames() = 0; + virtual OUString getName(sal_Int32 _nIndex) = 0; + virtual void disposeAndErase(sal_Int32 _nIndex) = 0; + virtual void disposeElements() = 0; + virtual sal_Int32 findColumn( const OUString& columnName ) = 0; + virtual OUString findColumnAtIndex( sal_Int32 _nIndex) = 0; + virtual ObjectType getObject(sal_Int32 _nIndex) = 0; + virtual ObjectType getObject(const OUString& columnName) = 0; + virtual void setObject(sal_Int32 _nIndex,const ObjectType& _xObject) = 0; + virtual sal_Bool isCaseSensitive() const = 0; + }; + //************************************************************ + // OCollection + //************************************************************ + class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE OCollection : + public OCollectionBase + { + protected: + ::std::auto_ptr<IObjectCollection> m_pElements; + + ::cppu::OInterfaceContainerHelper m_aContainerListeners; + ::cppu::OInterfaceContainerHelper m_aRefreshListeners; + + protected: + ::cppu::OWeakObject& m_rParent; // parent of the collection + ::osl::Mutex& m_rMutex; // mutex of the parent + sal_Bool m_bUseIndexOnly; // is only TRUE when only an indexaccess is needed + + // the implementing class should refresh their elements + virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException) = 0; + + // will be called when a object was requested by one of the accessing methods like getByIndex + virtual ObjectType createObject(const OUString& _rName) = 0; + + // will be called when a new object should be generated by a call of createDataDescriptor + // the returned object is empty will be filled outside and added to the collection + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); + + /** appends an object described by a descriptor, under a given name + @param _rForName + is the name under which the object should be appended. Guaranteed to not be empty. + This is passed for convenience only, since it's the result of a call of + getNameForObject for the given descriptor + @param descriptor + describes the object to append + @return + the new object which is to be inserted into the collection. This might be the result + of a call of <code>createObject( _rForName )</code>, or a clone of the descriptor. + */ + virtual ObjectType appendObject( const OUString& _rForName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ); + + // called when XDrop was called + virtual void dropObject(sal_Int32 _nPos,const OUString _sElementName); + + /** returns the name for the object. The default implementation ask for the property NAME. If this doesn't satisfy, it has to be overloaded. + @param _xObject The object where the name should be extracted. + @return The name of the object. + */ + virtual OUString getNameForObject(const ObjectType& _xObject); + + /** clones the given descriptor + + The method calls createDescriptor to create a new, empty descriptor, and then copies all properties from + _descriptor to the new object, which is returned. + + This method might come handy in derived classes for implementing appendObject, when the object + is not actually appended to any backend (e.g. for the columns collection of a descriptor object itself, + where there is not yet a database backend to append the column to). + */ + ObjectType cloneDescriptor( const ObjectType& _descriptor ); + + OCollection(::cppu::OWeakObject& _rParent, + sal_Bool _bCase, + ::osl::Mutex& _rMutex, + const TStringVector &_rVector, + sal_Bool _bUseIndexOnly = sal_False, + sal_Bool _bUseHardRef = sal_True); + + /** clear the name map + <p>Does <em>not</em> dispose the objects hold by the collection.</p> + */ + void clear_NoDispose(); + + /** insert a new element into the collection + */ + void insertElement(const OUString& _sElementName,const ObjectType& _xElement); + + /** return the name of element at index _nIndex + */ + inline OUString getElementName(sal_Int32 _nIndex) + { + return m_pElements->findColumnAtIndex(_nIndex); + } + + + /** return the object, if not existent it creates it. + @param _nIndex + The index of the object to create. + @return ObjectType + */ + ObjectType getObject(sal_Int32 _nIndex); + + public: + virtual ~OCollection(); + DECLARE_SERVICE_INFO(); + + void reFill(const TStringVector &_rVector); + inline sal_Bool isCaseSensitive() const { return m_pElements->isCaseSensitive(); } + void renameObject(const OUString _sOldName,const OUString _sNewName); + + // only the name is identical to ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + // dispatch the refcounting to the parent + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::container::XElementAccess + virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw(::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL hasElements( ) throw(::com::sun::star::uno::RuntimeException); + // ::com::sun::star::container::XIndexAccess + virtual sal_Int32 SAL_CALL getCount( ) throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::container::XNameAccess + virtual ::com::sun::star::uno::Any SAL_CALL getByName( const OUString& aName ) throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< OUString > SAL_CALL getElementNames( ) throw(::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL hasByName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + // XEnumerationAccess + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration( ) throw(::com::sun::star::uno::RuntimeException); + // ::com::sun::star::util::XRefreshable + virtual void SAL_CALL refresh( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addRefreshListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XRefreshListener >& l ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeRefreshListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XRefreshListener >& l ) throw(::com::sun::star::uno::RuntimeException); + // XDataDescriptorFactory + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > SAL_CALL createDataDescriptor( ) throw(::com::sun::star::uno::RuntimeException); + // XAppend + virtual void SAL_CALL appendByDescriptor( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); + // XDrop + virtual void SAL_CALL dropByName( const OUString& elementName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL dropByIndex( sal_Int32 index ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + // XColumnLocate + virtual sal_Int32 SAL_CALL findColumn( const OUString& columnName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + // ::com::sun::star::container::XContainer + virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException); + private: + void notifyElementRemoved(const OUString& _sName); + void disposeElements(); + void dropImpl(sal_Int32 _nIndex,sal_Bool _bReallyDrop = sal_True); + }; + } +} +#endif // _CONNECTIVITY_SDBCX_COLLECTION_HXX_ + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VColumn.hxx b/include/connectivity/sdbcx/VColumn.hxx new file mode 100644 index 000000000000..42cddc51c041 --- /dev/null +++ b/include/connectivity/sdbcx/VColumn.hxx @@ -0,0 +1,118 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_SDBCX_COLUMN_HXX_ +#define _CONNECTIVITY_SDBCX_COLUMN_HXX_ + +#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> +#include <com/sun/star/container/XNamed.hpp> +#include <comphelper/IdPropArrayHelper.hxx> +#include <cppuhelper/compbase2.hxx> +#include <cppuhelper/implbase1.hxx> +#include "connectivity/CommonTools.hxx" +#include <comphelper/broadcasthelper.hxx> +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <com/sun/star/lang/XServiceInfo.hpp> + +namespace connectivity +{ + namespace sdbcx + { + class OColumn; + typedef ::comphelper::OIdPropertyArrayUsageHelper<OColumn> OColumn_PROP; + + typedef ::cppu::WeakComponentImplHelper2< ::com::sun::star::container::XNamed, + ::com::sun::star::lang::XServiceInfo> OColumnDescriptor_BASE; + typedef ::cppu::ImplHelper1< ::com::sun::star::sdbcx::XDataDescriptorFactory > OColumn_BASE; + + + class OOO_DLLPUBLIC_DBTOOLS OColumn : + public comphelper::OBaseMutex, + public OColumn_BASE, + public OColumnDescriptor_BASE, + public OColumn_PROP, + public ODescriptor + { + protected: + OUString m_TypeName; + OUString m_Description; + OUString m_DefaultValue; + + sal_Int32 m_IsNullable; + sal_Int32 m_Precision; + sal_Int32 m_Scale; + sal_Int32 m_Type; + + sal_Bool m_IsAutoIncrement; + sal_Bool m_IsRowVersion; + sal_Bool m_IsCurrency; + + OUString m_CatalogName; + OUString m_SchemaName; + OUString m_TableName; + + using OColumnDescriptor_BASE::rBHelper; + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + + virtual ~OColumn(); + public: + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + + OColumn( sal_Bool _bCase); + OColumn( const OUString& _Name, + const OUString& _TypeName, + const OUString& _DefaultValue, + const OUString& _Description, + sal_Int32 _IsNullable, + sal_Int32 _Precision, + sal_Int32 _Scale, + sal_Int32 _Type, + sal_Bool _IsAutoIncrement, + sal_Bool _IsRowVersion, + sal_Bool _IsCurrency, + sal_Bool _bCase, + const OUString& _CatalogName, + const OUString& _SchemaName, + const OUString& _TableName); + + DECLARE_SERVICE_INFO(); + //XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + // ODescriptor + virtual void construct(); + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XNamed + virtual OUString SAL_CALL getName( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + // XDataDescriptorFactory + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > SAL_CALL createDataDescriptor( ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_COLUMN_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VDescriptor.hxx b/include/connectivity/sdbcx/VDescriptor.hxx new file mode 100644 index 000000000000..aa04b5229ac9 --- /dev/null +++ b/include/connectivity/sdbcx/VDescriptor.hxx @@ -0,0 +1,95 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_DESCRIPTOR_HXX_ +#define _CONNECTIVITY_SDBCX_DESCRIPTOR_HXX_ + +#include <comphelper/propertycontainer.hxx> +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <cppuhelper/typeprovider.hxx> +#include <com/sun/star/lang/XUnoTunnel.hpp> +#include <comphelper/stl_types.hxx> +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + namespace sdbcx + { + // ========================================================================= + // = ODescriptor + // ========================================================================= + typedef ::comphelper::OPropertyContainer ODescriptor_PBASE; + class OOO_DLLPUBLIC_DBTOOLS ODescriptor + :public ODescriptor_PBASE + ,public ::com::sun::star::lang::XUnoTunnel + { + protected: + OUString m_Name; + + /** helper for derived classes to implement OPropertyArrayUsageHelper::createArrayHelper + + This method just calls describeProperties, and flags all properties as READONLY if and + only if we do *not* act as descriptor, but as final object. + + @seealso isNew + */ + ::cppu::IPropertyArrayHelper* doCreateArrayHelper() const; + + private: + comphelper::UStringMixEqual m_aCase; + sal_Bool m_bNew; + + public: + ODescriptor(::cppu::OBroadcastHelper& _rBHelper,sal_Bool _bCase, sal_Bool _bNew = sal_False); + + virtual ~ODescriptor(); + + sal_Bool isNew() const { return m_bNew; } + sal_Bool getNew() const { return m_bNew; } + virtual void setNew(sal_Bool _bNew); + + sal_Bool isCaseSensitive() const { return m_aCase.isCaseSensitive(); } + + virtual void construct(); + + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + + // compare + inline sal_Bool operator == ( const OUString & _rRH ) + { + return m_aCase(m_Name,_rRH); + } + + // com::sun::star::lang::XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Sequence< sal_Int8 > getUnoTunnelImplementationId(); + + static ODescriptor* getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSomeComp ); + // retrieves the ODescriptor implementation of a given UNO component, and returns its ->isNew flag + static sal_Bool isNew( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxDescriptor ); + }; + } + +} +#endif // _CONNECTIVITY_SDBCX_DESCRIPTOR_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VGroup.hxx b/include/connectivity/sdbcx/VGroup.hxx new file mode 100644 index 000000000000..6e4ba2355d62 --- /dev/null +++ b/include/connectivity/sdbcx/VGroup.hxx @@ -0,0 +1,103 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_GROUP_HXX_ +#define _CONNECTIVITY_SDBCX_GROUP_HXX_ + +#include <osl/diagnose.h> + + +#include <com/sun/star/sdbcx/XUsersSupplier.hpp> +#include <com/sun/star/sdbcx/XAuthorizable.hpp> +#include <com/sun/star/container/XNamed.hpp> +#include <comphelper/proparrhlp.hxx> +#include <cppuhelper/compbase4.hxx> +#include <comphelper/broadcasthelper.hxx> +#include "connectivity/sdbcx/VCollection.hxx" +#include <comphelper/propertycontainer.hxx> +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <com/sun/star/lang/XServiceInfo.hpp> + +namespace connectivity +{ + namespace sdbcx + { + typedef OCollection OUsers; + + typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::sdbcx::XUsersSupplier, + ::com::sun::star::sdbcx::XAuthorizable, + ::com::sun::star::container::XNamed, + ::com::sun::star::lang::XServiceInfo> OGroup_BASE; + + class OOO_DLLPUBLIC_DBTOOLS OGroup : + public comphelper::OBaseMutex, + public OGroup_BASE, + public IRefreshableUsers, + public ::comphelper::OPropertyArrayUsageHelper<OGroup>, + public ODescriptor + { + protected: + OUsers* m_pUsers; + + using OGroup_BASE::rBHelper; + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + public: + OGroup(sal_Bool _bCase); + OGroup( const OUString& _Name,sal_Bool _bCase); + virtual ~OGroup(); + DECLARE_SERVICE_INFO(); + + // XInterface + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + + //XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XUsersSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getUsers( ) throw(::com::sun::star::uno::RuntimeException); + // XAuthorizable + virtual sal_Int32 SAL_CALL getPrivileges( const OUString& objName, sal_Int32 objType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getGrantablePrivileges( const OUString& objName, sal_Int32 objType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL grantPrivileges( const OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL revokePrivileges( const OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XNamed + virtual OUString SAL_CALL getName( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_GROUP_HXX_ + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VIndex.hxx b/include/connectivity/sdbcx/VIndex.hxx new file mode 100644 index 000000000000..3e50ddf9459c --- /dev/null +++ b/include/connectivity/sdbcx/VIndex.hxx @@ -0,0 +1,106 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_INDEX_HXX_ +#define _CONNECTIVITY_SDBCX_INDEX_HXX_ + +#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/container/XNamed.hpp> +#include <comphelper/IdPropArrayHelper.hxx> +#include <cppuhelper/compbase2.hxx> +#include "connectivity/CommonTools.hxx" +#include <comphelper/broadcasthelper.hxx> +#include "connectivity/sdbcx/VTypeDef.hxx" +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <cppuhelper/implbase1.hxx> + +namespace connectivity +{ + namespace sdbcx + { + class OCollection; + class OIndex; + typedef ::cppu::ImplHelper1< ::com::sun::star::sdbcx::XDataDescriptorFactory > OIndex_BASE; + typedef ::comphelper::OIdPropertyArrayUsageHelper<OIndex> OIndex_PROP; + + class OOO_DLLPUBLIC_DBTOOLS OIndex : + public comphelper::OBaseMutex, + public ODescriptor_BASE, + public IRefreshableColumns, + public OIndex_PROP, + public ODescriptor, + public OIndex_BASE + { + protected: + OUString m_Catalog; + sal_Bool m_IsUnique; + sal_Bool m_IsPrimaryKeyIndex; + sal_Bool m_IsClustered; + + OCollection* m_pColumns; + + using ODescriptor_BASE::rBHelper; + virtual void refreshColumns(); + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + public: + OIndex(sal_Bool _bCase); + OIndex( const OUString& _Name, + const OUString& _Catalog, + sal_Bool _isUnique, + sal_Bool _isPrimaryKeyIndex, + sal_Bool _isClustered, + sal_Bool _bCase); + + virtual ~OIndex( ); + + DECLARE_SERVICE_INFO(); + + //XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + // ODescriptor + virtual void construct(); + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XColumnsSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getColumns( ) throw(::com::sun::star::uno::RuntimeException); + + // XNamed + virtual OUString SAL_CALL getName( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + // XDataDescriptorFactory + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > SAL_CALL createDataDescriptor( ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_INDEX_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VIndexColumn.hxx b/include/connectivity/sdbcx/VIndexColumn.hxx new file mode 100644 index 000000000000..a4de9e6bf5bd --- /dev/null +++ b/include/connectivity/sdbcx/VIndexColumn.hxx @@ -0,0 +1,65 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_INDEXCOLUMN_HXX_ +#define _CONNECTIVITY_SDBCX_INDEXCOLUMN_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sdbcx/VColumn.hxx" + +namespace connectivity +{ + namespace sdbcx + { + class OIndexColumn; + typedef ::comphelper::OIdPropertyArrayUsageHelper<OIndexColumn> OIndexColumn_PROP; + + class OOO_DLLPUBLIC_DBTOOLS OIndexColumn : + public OColumn, public OIndexColumn_PROP + { + protected: + sal_Bool m_IsAscending; + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + public: + OIndexColumn( sal_Bool _bCase); + OIndexColumn( sal_Bool _IsAscending, + const OUString& _Name, + const OUString& _TypeName, + const OUString& _DefaultValue, + sal_Int32 _IsNullable, + sal_Int32 _Precision, + sal_Int32 _Scale, + sal_Int32 _Type, + sal_Bool _IsAutoIncrement, + sal_Bool _IsRowVersion, + sal_Bool _IsCurrency, + sal_Bool _bCase, + const OUString& _CatalogName, + const OUString& _SchemaName, + const OUString& _TableName); + + virtual void construct(); + DECLARE_SERVICE_INFO(); + }; + } +} +#endif // _CONNECTIVITY_SDBCX_INDEXCOLUMN_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VKey.hxx b/include/connectivity/sdbcx/VKey.hxx new file mode 100644 index 000000000000..24d85dfb2614 --- /dev/null +++ b/include/connectivity/sdbcx/VKey.hxx @@ -0,0 +1,121 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_KEY_HXX_ +#define _CONNECTIVITY_SDBCX_KEY_HXX_ + + +#include <comphelper/IdPropArrayHelper.hxx> +#include "connectivity/CommonTools.hxx" +#include <comphelper/broadcasthelper.hxx> +#include "connectivity/sdbcx/VTypeDef.hxx" +#include <com/sun/star/container/XNamed.hpp> +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <cppuhelper/implbase1.hxx> +#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> +#include <boost/shared_ptr.hpp> + +namespace connectivity +{ + namespace sdbcx + { + + struct OOO_DLLPUBLIC_DBTOOLS KeyProperties + { + ::std::vector< OUString> m_aKeyColumnNames; + OUString m_ReferencedTable; + sal_Int32 m_Type; + sal_Int32 m_UpdateRule; + sal_Int32 m_DeleteRule; + KeyProperties(const OUString& _ReferencedTable, + sal_Int32 _Type, + sal_Int32 _UpdateRule, + sal_Int32 _DeleteRule) + :m_ReferencedTable(_ReferencedTable), + m_Type(_Type), + m_UpdateRule(_UpdateRule), + m_DeleteRule(_DeleteRule) + {} + KeyProperties():m_Type(0),m_UpdateRule(0),m_DeleteRule(0){} + }; + typedef ::boost::shared_ptr< KeyProperties > TKeyProperties; + typedef ::cppu::ImplHelper1< ::com::sun::star::sdbcx::XDataDescriptorFactory > OKey_BASE; + class OCollection; + + class OOO_DLLPUBLIC_DBTOOLS OKey : + public comphelper::OBaseMutex, + public ODescriptor_BASE, + public IRefreshableColumns, + public ::comphelper::OIdPropertyArrayUsageHelper<OKey>, + public ODescriptor, + public OKey_BASE + { + protected: + TKeyProperties m_aProps; + OCollection* m_pColumns; + + using ODescriptor_BASE::rBHelper; + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + public: + OKey(sal_Bool _bCase); + OKey(const OUString& _Name,const TKeyProperties& _rProps,sal_Bool _bCase); + /*OKey( const OUString& _Name, + const OUString& _ReferencedTable, + sal_Int32 _Type, + sal_Int32 _UpdateRule, + sal_Int32 _DeleteRule, + sal_Bool _bCase);*/ + + virtual ~OKey( ); + + DECLARE_SERVICE_INFO(); + //XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + // ODescriptor + virtual void construct(); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XColumnsSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getColumns( ) throw(::com::sun::star::uno::RuntimeException); + + // XNamed + virtual OUString SAL_CALL getName( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + // XDataDescriptorFactory + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > SAL_CALL createDataDescriptor( ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_KEY_HXX_ + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VKeyColumn.hxx b/include/connectivity/sdbcx/VKeyColumn.hxx new file mode 100644 index 000000000000..b22ea3247941 --- /dev/null +++ b/include/connectivity/sdbcx/VKeyColumn.hxx @@ -0,0 +1,67 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_KEYCOLUMN_HXX_ +#define _CONNECTIVITY_SDBCX_KEYCOLUMN_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sdbcx/VColumn.hxx" + +namespace connectivity +{ + namespace sdbcx + { + class OKeyColumn; + typedef ::comphelper::OIdPropertyArrayUsageHelper<OKeyColumn> OKeyColumn_PROP; + + class OOO_DLLPUBLIC_DBTOOLS OKeyColumn : + public OColumn, public OKeyColumn_PROP + { + protected: + OUString m_ReferencedColumn; + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + public: + OKeyColumn(sal_Bool _bCase); + OKeyColumn( const OUString& _ReferencedColumn, + const OUString& _Name, + const OUString& _TypeName, + const OUString& _DefaultValue, + sal_Int32 _IsNullable, + sal_Int32 _Precision, + sal_Int32 _Scale, + sal_Int32 _Type, + sal_Bool _IsAutoIncrement, + sal_Bool _IsRowVersion, + sal_Bool _IsCurrency, + sal_Bool _bCase, + const OUString& _CatalogName, + const OUString& _SchemaName, + const OUString& _TableName); + // just to make it not inline + virtual ~OKeyColumn(); + + virtual void construct(); + DECLARE_SERVICE_INFO(); + }; + } +} +#endif // _CONNECTIVITY_SDBCX_KEYCOLUMN_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VTable.hxx b/include/connectivity/sdbcx/VTable.hxx new file mode 100644 index 000000000000..0be41a9cd22f --- /dev/null +++ b/include/connectivity/sdbcx/VTable.hxx @@ -0,0 +1,141 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_TABLE_HXX_ +#define _CONNECTIVITY_SDBCX_TABLE_HXX_ + +#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> +#include <com/sun/star/sdbcx/XIndexesSupplier.hpp> +#include <com/sun/star/sdbcx/XRename.hpp> +#include <com/sun/star/sdbcx/XAlterTable.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/sdbcx/XKeysSupplier.hpp> +#include <comphelper/IdPropArrayHelper.hxx> +#include <cppuhelper/compbase4.hxx> +#include <cppuhelper/implbase4.hxx> +#include <comphelper/broadcasthelper.hxx> +#include <com/sun/star/container/XNamed.hpp> +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/CommonTools.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> + +namespace connectivity +{ + namespace sdbcx + { + + class OTable; + class OCollection; + + typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::sdbcx::XColumnsSupplier, + ::com::sun::star::sdbcx::XKeysSupplier, + ::com::sun::star::container::XNamed, + ::com::sun::star::lang::XServiceInfo> OTableDescriptor_BASE; + + typedef ::cppu::ImplHelper4< ::com::sun::star::sdbcx::XDataDescriptorFactory, + ::com::sun::star::sdbcx::XIndexesSupplier, + ::com::sun::star::sdbcx::XRename, + ::com::sun::star::sdbcx::XAlterTable > OTable_BASE; + + typedef ::comphelper::OIdPropertyArrayUsageHelper<OTable> OTable_PROP; + + + class OOO_DLLPUBLIC_DBTOOLS OTable : + public comphelper::OBaseMutex, + public OTable_BASE, + public OTableDescriptor_BASE, + public IRefreshableColumns, + public OTable_PROP, + public ODescriptor + { + protected: + OUString m_CatalogName; + OUString m_SchemaName; + OUString m_Description; + OUString m_Type; + + OCollection* m_pKeys; + OCollection* m_pColumns; + OCollection* m_pIndexes; + OCollection* m_pTables; // must hold his own container to notify him when renaming + + using OTableDescriptor_BASE::rBHelper; + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper(sal_Int32 _nId ) const; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + public: + OTable( OCollection* _pTables, + sal_Bool _bCase); + OTable( OCollection* _pTables, + sal_Bool _bCase, + const OUString& _Name, + const OUString& _Type, + const OUString& _Description = OUString(), + const OUString& _SchemaName = OUString(), + const OUString& _CatalogName = OUString()); + + virtual ~OTable(); + + DECLARE_SERVICE_INFO(); + //XInterface + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + + // ODescriptor + virtual void construct(); + virtual void refreshColumns(); + virtual void refreshKeys(); + virtual void refreshIndexes(); + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XColumnsSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getColumns( ) throw(::com::sun::star::uno::RuntimeException); + // XKeysSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL getKeys( ) throw(::com::sun::star::uno::RuntimeException); + // XNamed + virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + // XDataDescriptorFactory + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > SAL_CALL createDataDescriptor( void ) throw(::com::sun::star::uno::RuntimeException); + // XIndexesSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getIndexes( ) throw(::com::sun::star::uno::RuntimeException); + // XRename + virtual void SAL_CALL rename( const OUString& newName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); + // XAlterTable + virtual void SAL_CALL alterColumnByName( const OUString& colName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL alterColumnByIndex( sal_Int32 index, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); + + // helper method + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> getMetaData() const; + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_TABLE_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VTypeDef.hxx b/include/connectivity/sdbcx/VTypeDef.hxx new file mode 100644 index 000000000000..08019f9174da --- /dev/null +++ b/include/connectivity/sdbcx/VTypeDef.hxx @@ -0,0 +1,40 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_TYPEDEF_HXX_ +#define _CONNECTIVITY_SDBCX_TYPEDEF_HXX_ + +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <cppuhelper/compbase3.hxx> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/container/XNamed.hpp> + +namespace connectivity +{ + namespace sdbcx + { + typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbcx::XColumnsSupplier, + ::com::sun::star::container::XNamed, + ::com::sun::star::lang::XServiceInfo> ODescriptor_BASE; + } +} + +#endif // _CONNECTIVITY_SDBCX_TYPEDEF_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VUser.hxx b/include/connectivity/sdbcx/VUser.hxx new file mode 100644 index 000000000000..01bafc0d177c --- /dev/null +++ b/include/connectivity/sdbcx/VUser.hxx @@ -0,0 +1,100 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_USER_HXX_ +#define _CONNECTIVITY_SDBCX_USER_HXX_ + +#include <osl/diagnose.h> +#include <com/sun/star/sdbcx/XUser.hpp> +#include <com/sun/star/sdbcx/XGroupsSupplier.hpp> +#include <comphelper/proparrhlp.hxx> +#include <cppuhelper/compbase4.hxx> +#include "connectivity/CommonTools.hxx" +#include <comphelper/broadcasthelper.hxx> +#include "connectivity/sdbcx/VCollection.hxx" +#include <com/sun/star/container/XNamed.hpp> +#include "connectivity/sdbcx/IRefreshable.hxx" +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/dbtoolsdllapi.hxx" + +namespace connectivity +{ + namespace sdbcx + { + typedef OCollection OGroups; + + typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::sdbcx::XUser, + ::com::sun::star::sdbcx::XGroupsSupplier, + ::com::sun::star::container::XNamed, + ::com::sun::star::lang::XServiceInfo> OUser_BASE; + + class OOO_DLLPUBLIC_DBTOOLS OUser : + public comphelper::OBaseMutex, + public OUser_BASE, + public IRefreshableGroups, + public ::comphelper::OPropertyArrayUsageHelper<OUser>, + public ODescriptor + { + protected: + OGroups* m_pGroups; + + using OUser_BASE::rBHelper; + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + public: + OUser(sal_Bool _bCase); + OUser(const OUString& _Name,sal_Bool _bCase); + + virtual ~OUser( ); + + DECLARE_SERVICE_INFO(); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + //XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XUser + virtual void SAL_CALL changePassword( const OUString& objPassword, const OUString& newPassword ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + // XAuthorizable + virtual sal_Int32 SAL_CALL getPrivileges( const OUString& objName, sal_Int32 objType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getGrantablePrivileges( const OUString& objName, sal_Int32 objType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL grantPrivileges( const OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL revokePrivileges( const OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + // XGroupsSupplier + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getGroups( ) throw(::com::sun::star::uno::RuntimeException); + + // XNamed + virtual OUString SAL_CALL getName( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& aName ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_USER_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sdbcx/VView.hxx b/include/connectivity/sdbcx/VView.hxx new file mode 100644 index 000000000000..6134ddc4bb69 --- /dev/null +++ b/include/connectivity/sdbcx/VView.hxx @@ -0,0 +1,101 @@ +/* -*- 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 . + */ + +#ifndef _CONNECTIVITY_SDBCX_VIEW_HXX_ +#define _CONNECTIVITY_SDBCX_VIEW_HXX_ + +#include <osl/diagnose.h> +#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include <comphelper/proparrhlp.hxx> +#include <cppuhelper/compbase1.hxx> +#include "connectivity/CommonTools.hxx" +#include <cppuhelper/interfacecontainer.h> +#include <com/sun/star/container/XNamed.hpp> +#include "connectivity/sdbcx/VDescriptor.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include <comphelper/IdPropArrayHelper.hxx> +#include <cppuhelper/implbase2.hxx> + +namespace connectivity +{ + namespace sdbcx + { + + typedef ::cppu::WeakImplHelper2< ::com::sun::star::lang::XServiceInfo, + ::com::sun::star::container::XNamed> OView_BASE; + + + + class OOO_DLLPUBLIC_DBTOOLS OView : + public ::comphelper::OMutexAndBroadcastHelper, + public OView_BASE, + public ::comphelper::OIdPropertyArrayUsageHelper<OView>, + public ODescriptor + { + protected: + OUString m_CatalogName; + OUString m_SchemaName; + OUString m_Command; + sal_Int32 m_CheckOption; + // need for the getName method + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xMetaData; + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( sal_Int32 _nId) const; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + + public: + DECLARE_SERVICE_INFO(); + + OView(sal_Bool _bCase,const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _xMetaData); + OView( sal_Bool _bCase, + const OUString& _rName, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _xMetaData, + sal_Int32 _nCheckOption = 0, + const OUString& _rCommand = OUString(), + const OUString& _rSchemaName = OUString(), + const OUString& _rCatalogName = OUString()); + virtual ~OView(); + + // ODescriptor + virtual void construct(); + + // ::cppu::OComponentHelper + virtual void SAL_CALL disposing(void); + + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XNamed + virtual OUString SAL_CALL getName( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setName( const OUString& ) throw(::com::sun::star::uno::RuntimeException); + }; + } +} + +#endif // _CONNECTIVITY_SDBCX_VIEW_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sqlerror.hxx b/include/connectivity/sqlerror.hxx new file mode 100644 index 000000000000..ccad18a88d0f --- /dev/null +++ b/include/connectivity/sqlerror.hxx @@ -0,0 +1,317 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_SQLERROR_HXX +#define CONNECTIVITY_SQLERROR_HXX + +#include <com/sun/star/sdbc/SQLException.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> + +#include <boost/shared_ptr.hpp> +#include <boost/optional.hpp> +#include "connectivity/dbtoolsdllapi.hxx" + +//........................................................................ +namespace connectivity +{ +//........................................................................ + + //==================================================================== + //= ErrorCondition + //==================================================================== + /** the type of error codes to be used in SQLExceptions + + @see com::sun::star::sdbc::SQLException::ErrorCode + */ + typedef ::sal_Int32 ErrorCode; + + /** error condition values as defined in <type scope="com::sun::star::sdb">ErrorCondition</type> + */ + typedef ::sal_Int32 ErrorCondition; + + //==================================================================== + //= SQLError + //==================================================================== + class SQLError_Impl; + + /** a class which provides helpers for working with SQLErrors + + In particular, this class provides vendor-specific error codes (where + the vendor is OpenOffice.org Base), which can be used in OOo's various + database drivers, and checked in application-level code, to properly + recognize highly specific error conditions. + + @see ::com::sun::star::sdb::ErrorCondition + */ + class OOO_DLLPUBLIC_DBTOOLS SQLError + { + public: + // -------------------------------------------------------------------- + // - optional + // -------------------------------------------------------------------- + /** convenience wrapper around boost::optional, allowing implicit construction + */ + class ParamValue : public ::boost::optional< OUString > + { + typedef ::boost::optional< OUString > base_type; + + public: + ParamValue( ) : base_type( ) { } + ParamValue( OUString const& val ) : base_type( val ) { } + ParamValue( ParamValue const& rhs ) : base_type( (base_type const&)rhs ) { } + + bool is() const { return !base_type::operator!(); } + }; + + + public: + explicit SQLError( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > & _rxContext ); + ~SQLError(); + + /** returns the message associated with a given error condition, after (optionally) replacing + a placeholder with a given string + + Some error messages need to contain references to runtime-dependent data (say, the + name of a concrete table in the database), which in the resource file's strings are + represented by a placeholder, namely $1$, $2, and so on. This method allows to + retrieve such an error message, and replace upo to 3 placeholders with their concrete + values. + + In a non-product build, assertions will fire if the number of placeholders in the + message's resource string does not match the number of passed parameter values. + + As specified in the <type scope="com::sun::star::sdb">ErrorCondition</type> type, + error messages thrown by core components of OpenOffice.org Base will contain + a standardized prefix "[OOoBase]" in every message. + + @param _rParamValue1 + the value which the placeholder $1$ should be replaced with. If this value is + not present (see <code>::boost::optional::operator !</code>), then no replacement + will happen, and <code>_rParamValue2</code> and <code>_rParamValue3</code> will be + ignored. + + @param _rParamValue2 + the value which the placeholder $2$ should be replaced with. If this value is + not present (see <code>::boost::optional::operator !</code>), then no replacement + will happen, and <code>_rParamValue3</code> will be ignored. + + @param _rParamValue1 + the value which the placeholder $1$ should be replaced with. If this value is + not present (see <code>::boost::optional::operator !</code>), then no replacement + will happen. + + @see ::com::sun::star::sdb::ErrorCondition + */ + OUString getErrorMessage( + const ErrorCondition _eCondition, + const ParamValue& _rParamValue1 = ParamValue(), + const ParamValue& _rParamValue2 = ParamValue(), + const ParamValue& _rParamValue3 = ParamValue() + ) const; + + /** returns the error code associated with a given error condition + + @see getErrorMessage + @see ::com::sun::star::sdb::ErrorCondition + @see ::com::sun::star::sdbc::SQLException::ErrorCode + */ + static ErrorCode + getErrorCode( const ErrorCondition _eCondition ); + + /** returns the prefix which is used for OpenOffice.org Base's error messages + + As specified in the <type scope="com::sun::star::sdb">ErrorCondition</type> type, + error messages thrown by core components of OpenOffice.org Base will + contain a standardized prefix in every message. <code>getBaseErrorMessagePrefix</code> + returns this prefix, so clients of such error messages might decide to strip this + prefix before presenting the message to the user, or use it to determine + whether a concrete error has been raised by a OpenOffice.org core component. + */ + static const OUString& + getMessagePrefix(); + + + /** throws an SQLException describing the given error condition + + The thrown SQLException will contain the OOo-specific error code which derives + from the given error condition, and the error message associated with that condition. + + @param _eCondition + the ErrorCondition which hit you + + @param _rxContext + the context in which the error occurred. This will be filled in as + <member scope="com::sun::star::uno">Exception::Context</member> member. + + @param _rParamValue1 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the first placeholder + in this message. + + @param _rParamValue2 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the second placeholder + in this message. + + @param _rParamValue3 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the third placeholder + in this message. + + @see getErrorMessage + @see getErrorCode + */ + void raiseException( + const ErrorCondition _eCondition, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const ParamValue& _rParamValue1 = ParamValue(), + const ParamValue& _rParamValue2 = ParamValue(), + const ParamValue& _rParamValue3 = ParamValue() + ) const; + + /** throws an SQLException describing the given error condition + + The thrown SQLException will contain the OOo-specific error code which derives + from the given error condition, and the error message associated with that condition. + + Note: You should prefer the version of <type>raiseException</type> which takes + an additional <type>Context</type> parameter, since this allows clients of your + exception to examine where the error occurred. + + @param _eCondition + the ErrorCondition which hit you + + @param _rParamValue1 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the first placeholder + in this message. + + @param _rParamValue2 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the second placeholder + in this message. + + @param _rParamValue3 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the third placeholder + in this message. + + @see getErrorMessage + @see getErrorCode + */ + void raiseException( + const ErrorCondition _eCondition, + const ParamValue& _rParamValue1 = ParamValue(), + const ParamValue& _rParamValue2 = ParamValue(), + const ParamValue& _rParamValue3 = ParamValue() + ) const; + + /** raises a typed exception, that is, a UNO exception which is derived from + <type scope="com::sun::star::sdbc">SQLException</type> + + @param _eCondition + the ErrorCondition which hit you + + @param _rxContext + the context in which the error occurred. This will be filled in as + <member scope="com::sun::star::uno">Exception::Context</member> member. + + @param _rExceptionType + the type of the exception to throw. This type <em>must</em> specify + an exception class derived from <type scope="com::sun::star::sdbc">SQLException</type>. + + @param _rParamValue1 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the first placeholder + in this message. + + @param _rParamValue2 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the second placeholder + in this message. + + @param _rParamValue3 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the third placeholder + in this message. + + @throws ::std::bad_cast + if <arg>_rExceptionType</arg> does not specify an exception class derived from + <type scope="com::sun::star::sdbc">SQLException</type>. + + @see getErrorMessage + @see getErrorCode + */ + void raiseTypedException( + const ErrorCondition _eCondition, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const ::com::sun::star::uno::Type& _rExceptionType, + const ParamValue& _rParamValue1 = ParamValue(), + const ParamValue& _rParamValue2 = ParamValue(), + const ParamValue& _rParamValue3 = ParamValue() + ) const; + + /** retrieves an <code>SQLException</code> object which contains information about + the given error condition + + @param _eCondition + the ErrorCondition which hit you + + @param _rxContext + the context in which the error occurred. This will be filled in as + <member scope="com::sun::star::uno">Exception::Context</member> member. + + @param _rParamValue1 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the first placeholder + in this message. + + @param _rParamValue2 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the second placeholder + in this message. + + @param _rParamValue3 + a runtime-dependent value which should be filled into the error message + which is associated with <arg>_eCondition</arg>, replacing the third placeholder + in this message. + + @see getErrorMessage + @see getErrorCode + */ + ::com::sun::star::sdbc::SQLException + getSQLException( + const ErrorCondition _eCondition, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const ParamValue& _rParamValue1 = ParamValue(), + const ParamValue& _rParamValue2 = ParamValue(), + const ParamValue& _rParamValue3 = ParamValue() + ) const; + + private: + ::boost::shared_ptr< SQLError_Impl > m_pImpl; + }; + +//........................................................................ +} // namespace connectivity +//........................................................................ + +#endif // CONNECTIVITY_SQLERROR_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sqliterator.hxx b/include/connectivity/sqliterator.hxx new file mode 100644 index 000000000000..ee967dd7d7a3 --- /dev/null +++ b/include/connectivity/sqliterator.hxx @@ -0,0 +1,356 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_PARSE_SQLITERATOR_HXX_ +#define _CONNECTIVITY_PARSE_SQLITERATOR_HXX_ + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sqlnode.hxx" +#include <connectivity/IParseContext.hxx> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/sdbc/DataType.hpp> +#include <com/sun/star/sdbc/SQLWarning.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include "connectivity/CommonTools.hxx" +#include <rtl/ref.hxx> +#include <cppuhelper/weak.hxx> + +#include <map> +#include <memory> +#include <vector> + +namespace connectivity +{ + + class OSQLParseNode; + class OSQLParser; + + typedef ::std::pair<const OSQLParseNode*,const OSQLParseNode* > TNodePair; + + enum OSQLStatementType { + SQL_STATEMENT_UNKNOWN, + SQL_STATEMENT_SELECT, + SQL_STATEMENT_INSERT, + SQL_STATEMENT_UPDATE, + SQL_STATEMENT_DELETE, + SQL_STATEMENT_ODBC_CALL, + SQL_STATEMENT_CREATE_TABLE + }; + + struct OSQLParseTreeIteratorImpl; + + class OOO_DLLPUBLIC_DBTOOLS OSQLParseTreeIterator + { + private: + ::com::sun::star::sdbc::SQLException m_aErrors; // conatins the error while iterating through the statement + const OSQLParseNode* m_pParseTree; // current ParseTree + const OSQLParser& m_rParser; // if set used for general error messages from the context + OSQLStatementType m_eStatementType; + ::rtl::Reference<OSQLColumns> m_aSelectColumns; // all columns from the Select clause + ::rtl::Reference<OSQLColumns> m_aParameters; // all parameters + ::rtl::Reference<OSQLColumns> m_aGroupColumns; // the group by columns + ::rtl::Reference<OSQLColumns> m_aOrderColumns; // the order by columns + ::rtl::Reference<OSQLColumns> m_aCreateColumns; // the columns for Create table clause + + ::std::auto_ptr< OSQLParseTreeIteratorImpl > m_pImpl; + + void traverseParameter(const OSQLParseNode* _pParseNode,const OSQLParseNode* _pColumnRef,const OUString& _aColumnName, OUString& _aTableRange, const OUString& _rColumnAlias); + // inserts a table into the map + void traverseOneTableName( OSQLTables& _rTables,const OSQLParseNode * pTableName, const OUString & rTableRange ); + void traverseSearchCondition(OSQLParseNode * pSearchCondition); + void traverseOnePredicate( + OSQLParseNode * pColumnRef, + OUString& aValue, + OSQLParseNode * pParameter); + void traverseByColumnNames(const OSQLParseNode* pSelectNode,sal_Bool _bOrder); + void traverseParameters(const OSQLParseNode* pSelectNode); + + const OSQLParseNode* getTableNode( OSQLTables& _rTables, const OSQLParseNode* pTableRef, OUString& aTableRange ); + void getQualified_join( OSQLTables& _rTables, const OSQLParseNode *pTableRef, OUString& aTableRange ); + void getSelect_statement(OSQLTables& _rTables,const OSQLParseNode* pSelect); + OUString getUniqueColumnName(const OUString & rColumnName) const; + + /** finds the column with a given name, belonging to a given table, in a given tables collection + @param _rTables + the tables collection to look in + @param rColumnName + the column name to look for + @param rTableRange + the table alias name; if empty, look in all tables + @return + the desired column object, or <NULL/> if no such column could be found + */ + static ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > findColumn( + const OSQLTables& _rTables, const OUString & rColumnName, OUString & rTableRange ); + + /** finds a column with a given name, belonging to a given table + @param rColumnName + the column name to look for + @param rTableRange + the table alias name; if empty, look in all tables + @param _bLookInSubTables + <TRUE/> if and only if not only our direct tables, but also our sub tables (from sub selects) + should be searched + @return + */ + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > findColumn( + const OUString & rColumnName, OUString & rTableRange, bool _bLookInSubTables ); + + protected: + void setSelectColumnName(::rtl::Reference<OSQLColumns>& _rColumns,const OUString & rColumnName,const OUString & rColumnAlias, const OUString & rTableRange,sal_Bool bFkt=sal_False,sal_Int32 _nType = com::sun::star::sdbc::DataType::VARCHAR,sal_Bool bAggFkt=sal_False); + void appendColumns(::rtl::Reference<OSQLColumns>& _rColumns,const OUString& _rTableAlias,const OSQLTable& _rTable); + // Other member variables that should be available in the "set" functions + // can be defined in the derived class. They can be initialized + // in its constructor and, after the "traverse" routines have been used, + // they can be queried using other functions. + + + private: + OSQLParseTreeIterator(); // never implemented + OSQLParseTreeIterator(const OSQLParseTreeIterator & rIter); // never implemented + + public: + OSQLParseTreeIterator( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxTables, + const OSQLParser& _rParser, + const OSQLParseNode* pRoot = NULL ); + ~OSQLParseTreeIterator(); + + inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW(()) + { return ::rtl_allocateMemory( nSize ); } + inline static void * SAL_CALL operator new( size_t,void* _pHint ) SAL_THROW(()) + { return _pHint; } + inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW(()) + { ::rtl_freeMemory( pMem ); } + inline static void SAL_CALL operator delete( void *,void* ) SAL_THROW(()) + { } + + void dispose(); + bool isCaseSensitive() const; + // The parse tree to be analysed/traversed: + // If NULL is passed, the current parse tree will be deleted and the error status cleared. + void setParseTree(const OSQLParseNode * pNewParseTree); +// void setParser(const OSQLParser* _pParser) { m_pParser = _pParser; } + const OSQLParseNode * getParseTree() const { return m_pParseTree; }; + + // subtrees in case of a select statement + const OSQLParseNode* getWhereTree() const; + const OSQLParseNode* getOrderTree() const; + const OSQLParseNode* getGroupByTree() const; + const OSQLParseNode* getHavingTree() const; + + const OSQLParseNode* getSimpleWhereTree() const; + const OSQLParseNode* getSimpleOrderTree() const; + const OSQLParseNode* getSimpleGroupByTree() const; + const OSQLParseNode* getSimpleHavingTree() const; + + /** returns the errors which occurred during parsing. + + The returned object contains a chain (via SQLException::NextException) of SQLExceptions. + */ + inline const ::com::sun::star::sdbc::SQLException& getErrors() const { return m_aErrors; } + inline bool hasErrors() const { return !m_aErrors.Message.isEmpty(); } + + // statement type (already set in setParseTree): + OSQLStatementType getStatementType() const { return m_eStatementType; } + + /** traverses the complete statement tree, and fills all our data with + the information obatined during traversal. + + Implemented by calling the single traverse* methods in the proper + order (depending on the statement type). + */ + void traverseAll(); + + enum TraversalParts + { + Parameters = 0x0001, + TableNames = 0x0002, + SelectColumns = 0x0006, // note that this includes TableNames. No SelectColumns without TableNames + + // Those are not implemented currently + // GroupColumns = 0x0008, + // OrderColumns = 0x0010, + // SelectColumns = 0x0020, + // CreateColumns = 0x0040, + + All = 0xFFFF + }; + /** traverses selected parts of the statement tree, and fills our data with + the information obtained during traversal + + @param _nIncludeMask + set of TraversalParts bits, specifying which information is to be collected. + Note TraversalParts is currently not + */ + void traverseSome( sal_uInt32 _nIncludeMask ); + + // The TableRangeMap contains all tables associated with the range name found first. + const OSQLTables& getTables() const; + + ::rtl::Reference<OSQLColumns> getSelectColumns() const { return m_aSelectColumns;} + ::rtl::Reference<OSQLColumns> getGroupColumns() const { return m_aGroupColumns;} + ::rtl::Reference<OSQLColumns> getOrderColumns() const { return m_aOrderColumns;} + ::rtl::Reference<OSQLColumns> getParameters() const { return m_aParameters; } + ::rtl::Reference<OSQLColumns> getCreateColumns() const { return m_aCreateColumns;} + + /** return the columname and the table range + @param _pColumnRef + The column ref parse node. + @param _rColumnName + The column name to be set. + @param _rTableRange + The table range to be set. + */ + void getColumnRange( const OSQLParseNode* _pColumnRef, + OUString &_rColumnName, + OUString& _rTableRange) const; + + /** retrieves a column's name, table range, and alias + + @param _pColumnRef + The column_ref parse node. + @param _out_rColumnName + The column name to be set. + @param _out_rTableRange + The table range to be set. + @param _out_rColumnAliasIfPresent + If the column specified by _pColumnRef is part of the select columns, and contains a column alias there, + this alias is returned here. + */ + void getColumnRange( const OSQLParseNode* _pColumnRef, + OUString& _out_rColumnName, + OUString& _out_rTableRange, + OUString& _out_rColumnAliasIfPresent + ) const; + + /** return the alias name of a column + @param _pDerivedColumn + The parse node where SQL_ISRULE(_pDerivedColumn,derived_column) must be true + @return + The alias name of the column or an empty string. + */ + static OUString getColumnAlias(const OSQLParseNode* _pDerivedColumn); + + /** return the columname and the table range + @param _pColumnRef + The column ref parse node. + @param _xMetaData + The database meta data. + @param _rColumnName + The column name to be set. + @param _rTableRange + The table range to be set. + */ + static void getColumnRange( const OSQLParseNode* _pColumnRef, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + OUString &_rColumnName, + OUString& _rTableRange); + + // empty if ambiguous + sal_Bool getColumnTableRange(const OSQLParseNode* pNode, OUString &rTableRange) const; + + // return true when the tableNode is a rule like catalog_name, schema_name or table_name + sal_Bool isTableNode(const OSQLParseNode* _pTableNode) const; + + // tries to find the correct type of the function + sal_Int32 getFunctionReturnType(const OSQLParseNode* _pNode ); + + // returns a lis of all joined columns + ::std::vector< TNodePair >& getJoinConditions() const; + + private: + /** traverses the list of table names, and filles _rTables + */ + bool traverseTableNames( OSQLTables& _rTables ); + + /// traverses columns in a SELECT statement + bool traverseSelectColumnNames(const OSQLParseNode* pSelectNode); + /// traverses columns in a CREATE TABLE statement + void traverseCreateColumns(const OSQLParseNode* pSelectNode); + + bool traverseOrderByColumnNames(const OSQLParseNode* pSelectNode); + bool traverseGroupByColumnNames(const OSQLParseNode* pSelectNode); + + bool traverseSelectionCriteria(const OSQLParseNode* pSelectNode); + + private: + /** constructs a new iterator, which inherits some of the settings from a parent iterator + */ + OSQLParseTreeIterator( + const OSQLParseTreeIterator& _rParentIterator, + const OSQLParser& _rParser, + const OSQLParseNode* pRoot ); + + /** creates a table object and inserts it into our tables collection + + only used when we're iterating through a CREATE TABLE statement + */ + OSQLTable impl_createTableObject( + const OUString& rTableName, const OUString& rCatalogName, const OUString& rSchemaName ); + + /** locates a record source (a table or query) with the given name + */ + OSQLTable impl_locateRecordSource( + const OUString& _rComposedName + ); + + /** implementation for both traverseAll and traverseSome + */ + void impl_traverse( sal_uInt32 _nIncludeMask ); + + /** retrieves the parameter columns of the given query + */ + void impl_getQueryParameterColumns( const OSQLTable& _rQuery ); + + void setOrderByColumnName(const OUString & rColumnName, OUString & rTableRange, sal_Bool bAscending); + void setGroupByColumnName(const OUString & rColumnName, OUString & rTableRange); + + private: + /** appends an SQLException corresponding to the given error code to our error collection + + @param _eError + the code of the error which occurred + @param _pReplaceToken1 + if not <NULL/>, the first occurrence of '#' in the error message will be replaced + with the given token + @param _pReplaceToken2 + if not <NULL/>, and if _rReplaceToken1 is not <NULL/>, the second occurrence of '#' + in the error message will be replaced with _rReplaceToken2 + */ + void impl_appendError( IParseContext::ErrorCode _eError, + const OUString* _pReplaceToken1 = NULL, const OUString* _pReplaceToken2 = NULL ); + + /** appends an SQLException corresponding to the given error code to our error collection + */ + void impl_appendError( const ::com::sun::star::sdbc::SQLException& _rError ); + + /** resets our errors + */ + inline void impl_resetErrors() + { + m_aErrors = ::com::sun::star::sdbc::SQLException(); + } + void impl_fillJoinConditions(const OSQLParseNode* i_pJoinCondition); + }; +} + +#endif // _CONNECTIVITY_PARSE_SQLITERATOR_HXX_ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sqlnode.hxx b/include/connectivity/sqlnode.hxx new file mode 100644 index 000000000000..f988f78e7e14 --- /dev/null +++ b/include/connectivity/sqlnode.hxx @@ -0,0 +1,466 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_SQLNODE_HXX +#define _CONNECTIVITY_SQLNODE_HXX + +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/dbmetadata.hxx" +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/util/XNumberFormatTypes.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <vector> +#include <functional> +#include <set> +#include <boost/shared_ptr.hpp> +#include <rtl/ustrbuf.hxx> + +// forward declarations +namespace com +{ + namespace sun + { + namespace star + { + namespace beans + { + class XPropertySet; + } + namespace util + { + class XNumberFormatter; + } + namespace container + { + class XNameAccess; + } + } + } +} + +#define ORDER_BY_CHILD_POS 5 +#define TABLE_EXPRESSION_CHILD_COUNT 9 + +namespace connectivity +{ + class OSQLParser; + class OSQLParseNode; + class IParseContext; + + typedef ::std::vector< OSQLParseNode* > OSQLParseNodes; + + enum SQLNodeType {SQL_NODE_RULE, SQL_NODE_LISTRULE, SQL_NODE_COMMALISTRULE, + SQL_NODE_KEYWORD, SQL_NODE_COMPARISON, SQL_NODE_NAME, + SQL_NODE_STRING, SQL_NODE_INTNUM, SQL_NODE_APPROXNUM, + SQL_NODE_EQUAL,SQL_NODE_LESS,SQL_NODE_GREAT,SQL_NODE_LESSEQ,SQL_NODE_GREATEQ,SQL_NODE_NOTEQUAL, + SQL_NODE_PUNCTUATION, SQL_NODE_AMMSC, SQL_NODE_ACCESS_DATE,SQL_NODE_DATE,SQL_NODE_CONCAT}; + + typedef ::std::set< OUString > QueryNameSet; + //================================================================== + //= SQLParseNodeParameter + //================================================================== + struct OOO_DLLPUBLIC_DBTOOLS SQLParseNodeParameter + { + const ::com::sun::star::lang::Locale& rLocale; + ::dbtools::DatabaseMetaData aMetaData; + OSQLParser* pParser; + ::boost::shared_ptr< QueryNameSet > pSubQueryHistory; + ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > xFormatter; + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xField; + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > xQueries; // see bParseToSDBCLevel + const IParseContext& m_rContext; + sal_Char cDecSep; + bool bQuote : 1; /// should we quote identifiers? + bool bInternational : 1; /// should we internationalize keywords and placeholders? + bool bPredicate : 1; /// are we going to parse a mere predicate? + bool bParseToSDBCLevel : 1; /// should we create an SDBC-level statement (e.g. with substituted sub queries)? + + SQLParseNodeParameter( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _xFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _xField, + const ::com::sun::star::lang::Locale& _rLocale, + const IParseContext* _pContext, + bool _bIntl, + bool _bQuote, + sal_Char _cDecSep, + bool _bPredicate, + bool _bParseToSDBC + ); + ~SQLParseNodeParameter(); + }; + + //========================================================================== + //= OSQLParseNode + //========================================================================== + class OOO_DLLPUBLIC_DBTOOLS OSQLParseNode + { + friend class OSQLParser; + + OSQLParseNodes m_aChildren; + OSQLParseNode* m_pParent; // pParent for reverse linkage in the tree + OUString m_aNodeValue; // token name, or empty in case of rules, + // or OUString in case of + // OUString, INT, etc. + SQLNodeType m_eNodeType; // see above + sal_uInt32 m_nNodeID; // ::com::sun::star::chaos::Rule ID (if IsRule()) + // or Token ID (if !IsRule()) + // ::com::sun::star::chaos::Rule IDs and Token IDs can't + // be distinguished by their values, + // IsRule has to be used for that! + public: + enum Rule + { + UNKNOWN_RULE = 0, // ID indicating that a node is no rule with a matching Rule-enum value (see getKnownRuleID) + // we make sure it is 0 so that it is the default-constructor value of this enum + // and std::map<foo,Rule>::operator[](bar) default-inserts UNKNOWN_RULE rather than select_statement (!) + select_statement, + table_exp, + table_ref_commalist, + table_ref, + catalog_name, + schema_name, + table_name, + opt_column_commalist, + column_commalist, + column_ref_commalist, + column_ref, + opt_order_by_clause, + ordering_spec_commalist, + ordering_spec, + opt_asc_desc, + where_clause, + opt_where_clause, + search_condition, + comparison_predicate, + between_predicate, + like_predicate, + opt_escape, + test_for_null, + scalar_exp_commalist, + scalar_exp, + parameter_ref, + parameter, + general_set_fct, + range_variable, + column, + delete_statement_positioned, + delete_statement_searched, + update_statement_positioned, + update_statement_searched, + assignment_commalist, + assignment, + values_or_query_spec, + insert_statement, + insert_atom_commalist, + insert_atom, + predicate_check, + from_clause, + qualified_join, + cross_union, + select_sublist, + derived_column, + column_val, + set_fct_spec, + boolean_term, + boolean_primary, + num_value_exp, + join_type, + position_exp, + extract_exp, + length_exp, + char_value_fct, + odbc_call_spec, + in_predicate, + existence_test, + unique_test, + all_or_any_predicate, + named_columns_join, + join_condition, + joined_table, + boolean_factor, + sql_not, + boolean_test, + manipulative_statement, + subquery, + value_exp_commalist, + odbc_fct_spec, + union_statement, + outer_join_type, + char_value_exp, + term, + value_exp_primary, + value_exp, + selection, + fold, + char_substring_fct, + factor, + base_table_def, + base_table_element_commalist, + data_type, + column_def, + table_node, + as_clause, + opt_as, + op_column_commalist, + table_primary_as_range_column, + datetime_primary, + concatenation, + char_factor, + bit_value_fct, + comparison_predicate_part_2, + parenthesized_boolean_value_expression, + character_string_type, + other_like_predicate_part_2, + between_predicate_part_2, + cast_spec, + rule_count // last value + }; + + // must be ascii encoding for the value + OSQLParseNode(const sal_Char* _pValueStr, + SQLNodeType _eNodeType, + sal_uInt32 _nNodeID = 0); + + OSQLParseNode(const OString& _rValue, + SQLNodeType eNewNodeType, + sal_uInt32 nNewNodeID=0); + + OSQLParseNode(const OUString& _rValue, + SQLNodeType _eNodeType, + sal_uInt32 _nNodeID = 0); + + // copies the respective ParseNode + OSQLParseNode(const OSQLParseNode& rParseNode); + OSQLParseNode& operator=(const OSQLParseNode& rParseNode); + + sal_Bool operator==(OSQLParseNode& rParseNode) const; + + // destructor destructs the tree recursively + virtual ~OSQLParseNode(); + + OSQLParseNode* getParent() const {return m_pParent;}; + + void setParent(OSQLParseNode* pParseNode) {m_pParent = pParseNode;}; + + size_t count() const {return m_aChildren.size();}; + inline OSQLParseNode* getChild(sal_uInt32 nPos) const; + + void append(OSQLParseNode* pNewSubTree); + void insert(sal_uInt32 nPos, OSQLParseNode* pNewSubTree); + + OSQLParseNode* replace(OSQLParseNode* pOldSubTree, OSQLParseNode* pNewSubTree); + + OSQLParseNode* removeAt(sal_uInt32 nPos); + + void replaceNodeValue(const OUString& rTableAlias,const OUString& rColumnName); + + /** parses the node to a string which can be passed to a driver's connection for execution + + Any particles of the parse tree which represent application-level features - such + as queries appearing in the FROM part - are substituted, so that the resulting statement can + be executed at an SDBC-level connection. + + @param _out_rString + is an output parameter taking the resulting SQL statement + + @param _rxConnection + the connection relative to which to parse. This must be an SDB-level connection (e.g. + support the XQueriesSupplier interface) for the method to be able to do all necessary + substitutions. + + @param _rParser + the SQLParser used to create the node. This is needed in case we need to parse + sub queries which are present in the SQL statement - those sub queries need to be parsed, + too, to check whether they contain nested sub queries. + + @param _pErrorHolder + takes the error which occurred while generating the statement, if any. Might be <NULL/>, + in this case the error is not reported back, and can only be recognized by examing the + return value. + + @return + <TRUE/> if and only if the parsing was successful.<br/> + + Currently, there's only one condition how this method can fail: If it contains a nested + query which causes a cycle. E.g., consider a statement <code>SELECT * from "foo"</code>, + where <code>foo</code> is a query defined as <code>SELECT * FROM "bar"</code>, where + <code>bar</code> is defined as <code>SELECT * FROM "foo"</code>. This statement obviously + cannot be parsed to an executable statement. + + If this method returns <FALSE/>, you're encouraged to check and handle the error in + <arg>_pErrorHolder</arg>. + */ + bool parseNodeToExecutableStatement( OUString& _out_rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + OSQLParser& _rParser, + ::com::sun::star::sdbc::SQLException* _pErrorHolder ) const; + + void parseNodeToStr(OUString& rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const IParseContext* pContext = NULL, + sal_Bool _bIntl = sal_False, + sal_Bool _bQuote= sal_True) const; + + // quoted and internationalised + void parseNodeToPredicateStr(OUString& rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter, + const ::com::sun::star::lang::Locale& rIntl, + sal_Char _cDec, + const IParseContext* pContext = NULL ) const; + + void parseNodeToPredicateStr(OUString& rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & _xField, + const ::com::sun::star::lang::Locale& rIntl, + sal_Char _cDec, + const IParseContext* pContext = NULL ) const; + + OSQLParseNode* getByRule(OSQLParseNode::Rule eRule) const; + +#if OSL_DEBUG_LEVEL > 1 + // shows the ParseTree with tabs and linefeeds + void showParseTree( OUString& rString ) const; + void showParseTree( OUStringBuffer& _inout_rBuf, sal_uInt32 nLevel ) const; +#endif + + SQLNodeType getNodeType() const {return m_eNodeType;}; + + // RuleId returns the RuleID of the node's rule (only if IsRule()) + sal_uInt32 getRuleID() const {return m_nNodeID;} + + /** returns the ID of the rule represented by the node + If the node does not represent a rule, UNKNOWN_RULE is returned + */ + Rule getKnownRuleID() const; + + // returns the TokenId of the node's token (only if !isRule()) + sal_uInt32 getTokenID() const {return m_nNodeID;} + + // IsRule tests whether a node is a rule (NonTerminal) + // ATTENTION: rules can be leaves, for example empty lists + sal_Bool isRule() const + { return (m_eNodeType == SQL_NODE_RULE) || (m_eNodeType == SQL_NODE_LISTRULE) + || (m_eNodeType == SQL_NODE_COMMALISTRULE);} + + // IsToken tests whether a Node is a Token (Terminal but not a rule) + sal_Bool isToken() const {return !isRule();} + + const OUString& getTokenValue() const {return m_aNodeValue;} + + void setTokenValue(const OUString& rString) { if (isToken()) m_aNodeValue = rString;} + + sal_Bool isLeaf() const {return m_aChildren.empty();} + + // negate only a searchcondition, any other rule could cause a gpf + static void negateSearchCondition(OSQLParseNode*& pSearchCondition,sal_Bool bNegate=sal_False); + + // normalize a logic form + // e.q. (a or b) and (c or d) <=> a and c or a and d or b and c or b and d + static void disjunctiveNormalForm(OSQLParseNode*& pSearchCondition); + + // Simplifies logic expressions + // a and a = a + // a or a = a + // a and ( a + b) = a + // a or a and b = a + static void absorptions(OSQLParseNode*& pSearchCondition); + + // erase unnecessary braces + static void eraseBraces(OSQLParseNode*& pSearchCondition); + + // makes the logic formula a little smaller + static void compress(OSQLParseNode*& pSearchCondition); + // return the catalog, schema and tablename form this node + // _pTableNode must be a rule of that above or a SQL_TOKEN_NAME + static sal_Bool getTableComponents(const OSQLParseNode* _pTableNode, + ::com::sun::star::uno::Any &_rCatalog, + OUString &_rSchema, + OUString &_rTable + ,const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _xMetaData); + + // substitute all occurrences of :var or [name] into the dynamic parameter ? + // _pNode will be modified if parameters exists + static void substituteParameterNames(OSQLParseNode* _pNode); + + /** return a table range when it exists. + */ + static OUString getTableRange(const OSQLParseNode* _pTableRef); + + protected: + // ParseNodeToStr concatenates all Tokens (leaves) of the ParseNodes. + void parseNodeToStr(OUString& rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & _xField, + const ::com::sun::star::lang::Locale& rIntl, + const IParseContext* pContext, + bool _bIntl, + bool _bQuote, + sal_Char _cDecSep, + bool _bPredicate, + bool _bSubstitute) const; + + private: + void impl_parseNodeToString_throw( OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const; + void impl_parseLikeNodeToString_throw( OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const; + void impl_parseTableRangeNodeToString_throw( OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const; + + /** parses a table_name node into a SQL statement particle. + @return + <TRUE/> if and only if parsing was successful, <FALSE/> if default handling should + be applied. + */ + bool impl_parseTableNameNodeToString_throw( OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const; + + sal_Bool addDateValue(OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const; + OUString convertDateTimeString(const SQLParseNodeParameter& rParam, const OUString& rString) const; + OUString convertDateString(const SQLParseNodeParameter& rParam, const OUString& rString) const; + OUString convertTimeString(const SQLParseNodeParameter& rParam, const OUString& rString) const; + void parseLeaf(OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const; + }; + + //----------------------------------------------------------------------------- + inline OSQLParseNode* OSQLParseNode::getChild(sal_uInt32 nPos) const + { + OSL_ENSURE(nPos < m_aChildren.size(), "Invalid Position"); + + // return m_aChildren[nPos]; + return m_aChildren.at(nPos); + } + + // utilities to query for a specific rule, token or punctuation + #define SQL_ISRULE(pParseNode, eRule) ((pParseNode)->isRule() && (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::eRule)) + #define SQL_ISRULEOR2(pParseNode, e1, e2) ((pParseNode)->isRule() && ( \ + (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e1) || \ + (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e2))) + #define SQL_ISRULEOR3(pParseNode, e1, e2, e3) ((pParseNode)->isRule() && ( \ + (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e1) || \ + (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e2) || \ + (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e3))) + #define SQL_ISTOKEN(pParseNode, token) ((pParseNode)->isToken() && (pParseNode)->getTokenID() == SQL_TOKEN_##token) + #define SQL_ISTOKENOR2(pParseNode, tok0, tok1) ((pParseNode)->isToken() && ( (pParseNode)->getTokenID() == SQL_TOKEN_##tok0 || (pParseNode)->getTokenID() == SQL_TOKEN_##tok1 )) + #define SQL_ISTOKENOR3(pParseNode, tok0, tok1, tok2) ((pParseNode)->isToken() && ( (pParseNode)->getTokenID() == SQL_TOKEN_##tok0 || (pParseNode)->getTokenID() == SQL_TOKEN_##tok1 || (pParseNode)->getTokenID() == SQL_TOKEN_##tok2 )) + #define SQL_ISPUNCTUATION(pParseNode, aString) ((pParseNode)->getNodeType() == SQL_NODE_PUNCTUATION && !(pParseNode)->getTokenValue().compareToAscii(aString)) +} + +#endif //_CONNECTIVITY_SQLNODE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/sqlparse.hxx b/include/connectivity/sqlparse.hxx new file mode 100644 index 000000000000..892d3ecb8db5 --- /dev/null +++ b/include/connectivity/sqlparse.hxx @@ -0,0 +1,253 @@ +/* -*- 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 . + */ +#ifndef _CONNECTIVITY_SQLPARSE_HXX +#define _CONNECTIVITY_SQLPARSE_HXX + +#include <com/sun/star/uno/Reference.h> +#include <osl/mutex.hxx> +#include <connectivity/sqlnode.hxx> +#ifndef DISABLE_DBCONNECTIVITY +#ifndef YYBISON +#ifndef FLEX_SCANNER +#include "sqlbison.hxx" +#endif +#endif +#endif +#include <com/sun/star/i18n/XCharacterClassification.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/i18n/XLocaleData4.hpp> +#include "connectivity/IParseContext.hxx" +#include "connectivity/dbtoolsdllapi.hxx" +#include "connectivity/sqlerror.hxx" +#include <salhelper/singletonref.hxx> + +#include <map> + +// forward declarations +namespace com +{ + namespace sun + { + namespace star + { + namespace beans + { + class XPropertySet; + } + namespace util + { + class XNumberFormatter; + } + namespace lang + { + struct Locale; + } + } + } +} +namespace connectivity +{ + class OSQLScanner; + class SQLError; + + //========================================================================== + //= OParseContext + //========================================================================== + class OOO_DLLPUBLIC_DBTOOLS OParseContext : public IParseContext + { + public: + OParseContext(); + + virtual ~OParseContext(); + // retrieves language specific error messages + virtual OUString getErrorMessage(ErrorCode _eCodes) const; + + // retrieves language specific keyword strings (only ASCII allowed) + virtual OString getIntlKeywordAscii(InternationalKeyCode _eKey) const; + + // finds out, if we have an international keyword (only ASCII allowed) + virtual InternationalKeyCode getIntlKeyCode(const OString& rToken) const; + + // determines the default international setting + static const ::com::sun::star::lang::Locale& getDefaultLocale(); + + /** get's a locale instance which should be used when parsing in the context specified by this instance + <p>if this is not overridden by derived classes, it returns the static default locale.</p> + */ + virtual ::com::sun::star::lang::Locale getPreferredLocale( ) const; + }; + + //========================================================================== + // OSQLParseNodesContainer + // grabage collection of nodes + //========================================================================== + class OSQLParseNodesContainer + { + ::osl::Mutex m_aMutex; + ::std::vector< OSQLParseNode* > m_aNodes; + public: + OSQLParseNodesContainer(); + ~OSQLParseNodesContainer(); + + void push_back(OSQLParseNode* _pNode); + void erase(OSQLParseNode* _pNode); + void clear(); + void clearAndDelete(); + }; + + typedef salhelper::SingletonRef<OSQLParseNodesContainer> OSQLParseNodesGarbageCollector; + + //========================================================================== + //= OSQLParser + //========================================================================== + struct OSQLParser_Data + { + ::com::sun::star::lang::Locale aLocale; + ::connectivity::SQLError aErrors; + + OSQLParser_Data( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext ) + :aErrors( _rxContext ) + { + } + }; + + /** Parser for SQL92 + */ + class OOO_DLLPUBLIC_DBTOOLS OSQLParser + { + friend class OSQLParseNode; + friend class OSQLInternalNode; + friend struct SQLParseNodeParameter; + + private: + typedef ::std::map< sal_uInt32, OSQLParseNode::Rule > RuleIDMap; + // static parts for parsers + static sal_uInt32 s_nRuleIDs[OSQLParseNode::rule_count + 1]; + static RuleIDMap s_aReverseRuleIDLookup; + static OParseContext s_aDefaultContext; + + static OSQLScanner* s_pScanner; + static OSQLParseNodesGarbageCollector* s_pGarbageCollector; + static sal_Int32 s_nRefCount; + + // information on the current parse action + const IParseContext* m_pContext; + OSQLParseNode* m_pParseTree; // result from parsing + ::std::auto_ptr< OSQLParser_Data > + m_pData; + OUString m_sFieldName; // current field name for a predicate + OUString m_sErrorMessage;// current error msg + + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + m_xField; // current field + ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > + m_xFormatter; // current number formatter + sal_Int32 m_nFormatKey; // numberformat, which should be used + sal_Int32 m_nDateFormatKey; + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext; + ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XCharacterClassification> m_xCharClass; + static ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData4> s_xLocaleData; + ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData> xDummy; // can be deleted after 627 + + // convert a string into double trim it to scale of _nscale and than transform it back to string + OUString stringToDouble(const OUString& _rValue,sal_Int16 _nScale); + OSQLParseNode* buildDate(sal_Int32 _nType,OSQLParseNode*& pLiteral); + bool extractDate(OSQLParseNode* pLiteral,double& _rfValue); + void killThousandSeparator(OSQLParseNode* pLiteral); + OSQLParseNode* convertNode(sal_Int32 nType,OSQLParseNode*& pLiteral); + // makes a string out of a number, pLiteral will be deleted + OSQLParseNode* buildNode_STR_NUM(OSQLParseNode*& pLiteral); + OSQLParseNode* buildNode_Date(const double& fValue, sal_Int32 nType); + + static ::osl::Mutex& getMutex(); + + public: + // if NULL, a default context will be used + // the context must live as long as the parser + OSQLParser(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, const IParseContext* _pContext = NULL); + ~OSQLParser(); + + // Parsing an SQLStatement + OSQLParseNode* parseTree(OUString& rErrorMessage, + const OUString& rStatement, + sal_Bool bInternational = sal_False); + + // Check a Predicate + OSQLParseNode* predicateTree(OUString& rErrorMessage, const OUString& rStatement, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & xField); + + // Access to the context + const IParseContext& getContext() const {return *m_pContext;} + + /// access to the SQLError instance owned by this parser + const SQLError& getErrorHelper() const; + + // TokenIDToStr: token name belonging to a token number. + static OString TokenIDToStr(sal_uInt32 nTokenID, const IParseContext* pContext = NULL); + +#if OSL_DEBUG_LEVEL > 1 + // (empty string if not found) + static OUString RuleIDToStr(sal_uInt32 nRuleID); +#endif + + // StrToRuleID calculates the RuleID for a OUString (that is, ::com::sun::star::sdbcx::Index in yytname) + // (0 if not found). The search for an ID based on a String is + // extremely inefficient (sequential search for OUString)! + static sal_uInt32 StrToRuleID(const OString & rValue); + + static OSQLParseNode::Rule RuleIDToRule( sal_uInt32 _nRule ); + + // RuleId with enum, far more efficient + static sal_uInt32 RuleID(OSQLParseNode::Rule eRule); + // compares the _sFunctionName with all known function names and return the DataType of the return value + static sal_Int32 getFunctionReturnType(const OUString& _sFunctionName, const IParseContext* pContext = NULL); + + // returns the type for a parameter in a given function name + static sal_Int32 getFunctionParameterType(sal_uInt32 _nTokenId,sal_uInt32 _nPos); + + void error(const sal_Char *fmt); + int SQLlex(); +#ifdef YYBISON + void setParseTree(OSQLParseNode * pNewParseTree); + + // Is the parse in a special mode? + // Predicate chack is used to check a condition for a field + sal_Bool inPredicateCheck() const {return m_xField.is();} + const OUString& getFieldName() const {return m_sFieldName;} + + void reduceLiteral(OSQLParseNode*& pLiteral, sal_Bool bAppendBlank); + // does not change the pLiteral argument + sal_Int16 buildNode(OSQLParseNode*& pAppend,OSQLParseNode* pCompare,OSQLParseNode* pLiteral,OSQLParseNode* pLiteral2); + + sal_Int16 buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral); + // pCompre will be deleted if it is not used + sal_Int16 buildPredicateRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare,OSQLParseNode* pLiteral2 = NULL); + + sal_Int16 buildLikeRule(OSQLParseNode*& pAppend,OSQLParseNode*& pLiteral,const OSQLParseNode* pEscape); + sal_Int16 buildStringNodes(OSQLParseNode*& pLiteral); +#else +#endif + }; +} + + +#endif //_CONNECTIVITY_SQLPARSE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/standardsqlstate.hxx b/include/connectivity/standardsqlstate.hxx new file mode 100644 index 000000000000..fb896d1a8af8 --- /dev/null +++ b/include/connectivity/standardsqlstate.hxx @@ -0,0 +1,68 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_STANDARD_SQL_STATE_HXX +#define CONNECTIVITY_STANDARD_SQL_STATE_HXX + +//......................................................................... +namespace dbtools +{ +//......................................................................... + + //---------------------------------------------------------------------------------- + /** standard SQLStates to be used with an SQLException + + Extend this list whenever you need a new state ... + + @see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcodbc_error_codes.asp + */ + enum StandardSQLState + { + SQL_WRONG_PARAMETER_NUMBER, // 07001 + SQL_INVALID_DESCRIPTOR_INDEX, // 07009 + SQL_UNABLE_TO_CONNECT, // 08001 + SQL_NUMERIC_OUT_OF_RANGE, // 22003 + SQL_INVALID_DATE_TIME, // 22007 + SQL_INVALID_CURSOR_STATE, // 24000 + SQL_TABLE_OR_VIEW_EXISTS, // 42S01 + SQL_TABLE_OR_VIEW_NOT_FOUND, // 42S02 + SQL_INDEX_ESISTS, // 42S11 + SQL_INDEX_NOT_FOUND, // 42S12 + SQL_COLUMN_EXISTS, // 42S21 + SQL_COLUMN_NOT_FOUND, // 42S22 + SQL_GENERAL_ERROR, // HY000 + SQL_INVALID_SQL_DATA_TYPE, // HY004 + SQL_OPERATION_CANCELED, // HY008 + SQL_FUNCTION_SEQUENCE_ERROR, // HY010 + SQL_INVALID_CURSOR_POSITION, // HY109 + SQL_INVALID_BOOKMARK_VALUE, // HY111 + SQL_FEATURE_NOT_IMPLEMENTED, // HYC00 + SQL_FUNCTION_NOT_SUPPORTED, // IM001 + SQL_CONNECTION_DOES_NOT_EXIST, // 08003 + + SQL_ERROR_UNSPECIFIED = SAL_MAX_ENUM // special value indicating that an SQLState is not to be specified + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // CONNECTIVITY_STANDARD_SQL_STATE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/statementcomposer.hxx b/include/connectivity/statementcomposer.hxx new file mode 100644 index 000000000000..56b10ebd0d11 --- /dev/null +++ b/include/connectivity/statementcomposer.hxx @@ -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 . + */ + +#ifndef CONNECTIVITY_STATEMENTCOMPOSER_HXX +#define CONNECTIVITY_STATEMENTCOMPOSER_HXX + +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> + +#include <boost/noncopyable.hpp> + +#include <memory> +#include "connectivity/dbtoolsdllapi.hxx" + +//........................................................................ +namespace dbtools +{ +//........................................................................ + + //==================================================================== + //= StatementComposer + //==================================================================== + struct StatementComposer_Data; + /** a class which is able to compose queries (SELECT statements) from a command and a command type + */ + class OOO_DLLPUBLIC_DBTOOLS StatementComposer : public ::boost::noncopyable + { + ::std::auto_ptr< StatementComposer_Data > m_pData; + + public: + /** constructs an instance + + @param _rxConnection + the connection to work with. Must not be <NULL/>. + */ + StatementComposer( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const OUString& _rCommand, + const sal_Int32 _nCommandType, + const sal_Bool _bEscapeProcessing + ); + + ~StatementComposer(); + + /** controls whether or not the instance disposes its XSingleSelectQueryComposer upon + destruction + + Unless you explicitly call this method with the parameter being <TRUE/>, + the XSingleSelectQueryComposer will be disposed when the StatementComposer + instance is destroyed. + */ + void setDisposeComposer( bool _bDoDispose ); + + void setFilter( const OUString& _rFilter ); + void setOrder( const OUString& _rOrder ); + + /** returns the composer which has been fed with the current settings + + @throws ::com::sun::star::sdbc::SQLException + if such an exception occurs while creating the composer + */ + ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer > + getComposer(); + + /** returns the composer statement + + Effectively, this is equivalent to calling getComposer, and asking the composer + for its Query attribute. + + @throws ::com::sun::star::sdbc::SQLException + if such an exception occurs while creating the composer + */ + OUString + getQuery(); + + private: + StatementComposer(); // not implemented + }; + +//........................................................................ +} // namespace dbtools +//........................................................................ + +#endif // CONNECTIVITY_STATEMENTCOMPOSER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/virtualdbtools.hxx b/include/connectivity/virtualdbtools.hxx new file mode 100644 index 000000000000..352c98d7a8c4 --- /dev/null +++ b/include/connectivity/virtualdbtools.hxx @@ -0,0 +1,371 @@ +/* -*- 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 . + */ + +#ifndef CONNECTIVITY_VIRTUAL_DBTOOLS_HXX +#define CONNECTIVITY_VIRTUAL_DBTOOLS_HXX + +#include <rtl/ref.hxx> +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/util/Date.hpp> +#include <com/sun/star/sdbc/SQLException.hpp> +#include <com/sun/star/uno/Sequence.hxx> + +#include <vector> +#include <memory> +#include "connectivity/dbtoolsdllapi.hxx" + +//======================================================================== +//= forward declarations +//======================================================================== +namespace com { + namespace sun { + namespace star { + namespace util { + class XNumberFormatter; + class XNumberFormatTypes; + class XNumberFormatsSupplier; + } + namespace beans { + class XPropertySet; + } + namespace lang { + class XMultiServiceFactory; + class XComponent; + class WrappedTargetException; + struct Locale; + } + namespace sdbc { + class XDatabaseMetaData; + class XConnection; + class XRowSet; + class XDataSource; + } + namespace sdb { + class XColumn; + class SQLContext; + } + namespace uno { + class XComponentContext; + } + namespace container { + class XNameAccess; + } + } + } +} + +namespace dbtools { + class SQLExceptionInfo; + class FormattedColumnValue; +} + +namespace comphelper { + class ComponentContext; +} + +//======================================================================== +//= entry into this library +//======================================================================== +/** this is the entry point for the load-on-call usage of the DBTOOLS + library. + <p>When you need one of the simple objects in this library, load the lib + and call this method. The returned pointer is a pointer to an IDataAccessToolsFactory + instance, which is acquired <em>once</em>.</p> + @return + a pointer to an object implementing the IDataAccessToolsFactory interface, + aquired exactly <em>once</em>. +*/ +extern "C" OOO_DLLPUBLIC_DBTOOLS void* SAL_CALL createDataAccessToolsFactory(); + +//======================================================================== +//= +//======================================================================== +//........................................................................ +namespace connectivity +{ +//........................................................................ + + class IParseContext; + //.................................................................... + namespace simple + { + //.................................................................... + + typedef void* (SAL_CALL * createDataAccessToolsFactoryFunction)( ); + + //================================================================ + //= IDataAccessTools + //================================================================ + class OOO_DLLPUBLIC_DBTOOLS IDataAccessTools : public ::rtl::IReference + { + public: + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getConnection_withFeedback( + const OUString& _rDataSourceName, + const OUString& _rUser, + const OUString& _rPwd, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext + ) const SAL_THROW ( (::com::sun::star::sdbc::SQLException) ) = 0; + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> connectRowset( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext, + sal_Bool _bSetAsActiveConnection + ) const SAL_THROW ( ( ::com::sun::star::sdbc::SQLException + , ::com::sun::star::lang::WrappedTargetException + , ::com::sun::star::uno::RuntimeException ) ) = 0; + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getRowSetConnection( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet>& _rxRowSet) + const SAL_THROW ( (::com::sun::star::uno::RuntimeException) ) = 0; + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier> getNumberFormats( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _rxConn, + sal_Bool _bAllowDefault + ) const = 0; + + virtual sal_Int32 getDefaultNumberFormat( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatTypes >& _rxTypes, + const ::com::sun::star::lang::Locale& _rLocale + ) const = 0; + + virtual void TransferFormComponentProperties( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxOld, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxNew, + const ::com::sun::star::lang::Locale& _rLocale + ) const = 0; + + virtual OUString quoteName( + const OUString& _rQuote, + const OUString& _rName + ) const = 0; + + virtual OUString composeTableNameForSelect( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const OUString& _rCatalog, + const OUString& _rSchema, + const OUString& _rName + ) const = 0; + + virtual OUString composeTableNameForSelect( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xTable + ) const = 0; + + virtual ::com::sun::star::sdb::SQLContext prependContextInfo( + ::com::sun::star::sdbc::SQLException& _rException, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext, + const OUString& _rContextDescription, + const OUString& _rContextDetails + ) const = 0; + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource > getDataSource( + const OUString& _rsRegisteredName, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext>& _rxContext + ) const = 0; + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > + getFieldsByCommandDescriptor( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const sal_Int32 _nCommandType, + const OUString& _rCommand, + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& _rxKeepFieldsAlive, + ::dbtools::SQLExceptionInfo* _pErrorInfo = NULL + ) SAL_THROW( ( ) ) = 0; + + virtual ::com::sun::star::uno::Sequence< OUString > + getFieldNamesByCommandDescriptor( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const sal_Int32 _nCommandType, + const OUString& _rCommand, + ::dbtools::SQLExceptionInfo* _pErrorInfo = NULL + ) SAL_THROW( ( ) ) = 0; + + /** check if the property "Privileges" supports ::com::sun::star::sdbcx::Privilege::INSERT + @param _rxCursorSet the property set + */ + virtual sal_Bool canInsert(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxCursorSet) const = 0; + + /** check if the property "Privileges" supports ::com::sun::star::sdbcx::Privilege::UPDATE + @param _rxCursorSet the property set + */ + virtual sal_Bool canUpdate(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxCursorSet) const = 0; + + /** check if the property "Privileges" supports ::com::sun::star::sdbcx::Privilege::DELETE + @param _rxCursorSet the property set + */ + virtual sal_Bool canDelete(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxCursorSet) const = 0; + + /** determines whether the given component is part of a document which is an embedded database + document (such as a form) + */ + virtual bool isEmbeddedInDatabase( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxComponent, + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxActualConnection + ) = 0; + + protected: + ~IDataAccessTools() {} + }; + + //================================================================ + //= IDataAccessCharSet + //================================================================ + /** simple wrapper for the <type>OCharsetMap</type> + */ + class OOO_DLLPUBLIC_DBTOOLS IDataAccessCharSet : + public ::rtl::IReference + { + // to be extended if necessary .... + public: + /** enumerates all supported char sets + @return the number of charsets supported + */ + virtual sal_Int32 getSupportedTextEncodings( + ::std::vector< rtl_TextEncoding >& /* [out] */ _rEncs + ) const = 0; + + protected: + ~IDataAccessCharSet() {} + }; + + //================================================================ + //= IDataAccessTypeConversion + //================================================================ + class OOO_DLLPUBLIC_DBTOOLS IDataAccessTypeConversion : + public ::rtl::IReference + { + public: + virtual ::com::sun::star::util::Date getStandardDate() const = 0; + + virtual double getValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn>& _rxVariant, + const ::com::sun::star::util::Date& rNullDate ) const = 0; + + virtual OUString getFormattedValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, + const ::com::sun::star::util::Date& _rNullDate, + sal_Int32 _nKey, + sal_Int16 _nKeyType) const = 0; + + virtual OUString getFormattedValue( + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _rxColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter>& _rxFormatter, + const ::com::sun::star::lang::Locale& _rLocale, + const ::com::sun::star::util::Date& _rNullDate + ) const = 0; + + protected: + ~IDataAccessTypeConversion() {} + }; + + //================================================================ + //= ISQLParseNode + //================================================================ + /** a simple version of the OSQLParseNode, with all methods beeing virtual + */ + class OOO_DLLPUBLIC_DBTOOLS ISQLParseNode : public ::rtl::IReference + { + public: + virtual void parseNodeToStr(OUString& _rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const IParseContext* _pContext + ) const = 0; + + virtual void parseNodeToPredicateStr(OUString& _rString, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _rxConnection, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxField, + const ::com::sun::star::lang::Locale& _rIntl, + const sal_Char _cDecSeparator, + const IParseContext* _pContext + ) const = 0; + + protected: + ~ISQLParseNode() {} + }; + + //================================================================ + //= ISQLParser + //================================================================ + /** a simple version of the OSQLParser, with all methods beeing virtual + */ + class OOO_DLLPUBLIC_DBTOOLS ISQLParser : public ::rtl::IReference + { + public: + virtual ::rtl::Reference< ISQLParseNode > predicateTree( + OUString& rErrorMessage, + const OUString& rStatement, + const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxField + ) const = 0; + + virtual const IParseContext& getContext() const = 0; + + protected: + ~ISQLParser() {} + }; + + //================================================================ + //= IDataAccessToolsFactory + //================================================================ + /** the main factory for runtime-loadable tools in the DBTOOLS library + */ + class OOO_DLLPUBLIC_DBTOOLS IDataAccessToolsFactory : + public ::rtl::IReference + { + public: + /// creates a simple version of the class OSQLParser + virtual ::rtl::Reference< ISQLParser > createSQLParser( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, + const IParseContext* _pContext + ) const = 0; + + /// creates a helper for charset related functionality (<type>OCharsetMap</type>) + virtual ::rtl::Reference< IDataAccessCharSet > createCharsetHelper( ) const = 0; + + /// creates a simple version of the DBTypeConversion helper + virtual ::rtl::Reference< IDataAccessTypeConversion > getTypeConversionHelper() = 0; + + /// creates a helper which can be used to access the static methods in dbtools.hxx + virtual ::rtl::Reference< IDataAccessTools > getDataAccessTools() = 0; + + virtual ::std::auto_ptr< ::dbtools::FormattedColumnValue > createFormattedColumnValue( + const ::comphelper::ComponentContext& _rContext, + const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& _rxRowSet, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxColumn + ) = 0; + + protected: + ~IDataAccessToolsFactory() {} + }; + + //.................................................................... + } // namespace simple + //.................................................................... + +//........................................................................ +} // namespace connectivity +//........................................................................ + +#endif // CONNECTIVITY_VIRTUAL_DBTOOLS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/connectivity/warningscontainer.hxx b/include/connectivity/warningscontainer.hxx new file mode 100644 index 000000000000..5a013f9a5145 --- /dev/null +++ b/include/connectivity/warningscontainer.hxx @@ -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 . + */ + +#ifndef DBTOOLS_WARNINGSCONTAINER_HXX +#define DBTOOLS_WARNINGSCONTAINER_HXX + +#include <com/sun/star/sdbc/XWarningsSupplier.hpp> +#include <com/sun/star/sdb/SQLContext.hpp> + +#include "connectivity/dbtoolsdllapi.hxx" + +//......................................................................... +namespace dbtools +{ +//......................................................................... + + //===================================================================== + //= IWarningsContainer + //===================================================================== + class SAL_NO_VTABLE IWarningsContainer + { + public: + virtual void appendWarning(const ::com::sun::star::sdbc::SQLException& _rWarning) = 0; + virtual void appendWarning(const ::com::sun::star::sdbc::SQLWarning& _rWarning) = 0; + virtual void appendWarning(const ::com::sun::star::sdb::SQLContext& _rContext) = 0; + + protected: + ~IWarningsContainer() {} + }; + + //==================================================================== + //= WarningsContainer + //==================================================================== + /** helper class for implementing XWarningsSupplier, which mixes own warnings with + warnings obtained from an external instance + */ + class OOO_DLLPUBLIC_DBTOOLS WarningsContainer : public IWarningsContainer + { + private: + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XWarningsSupplier > m_xExternalWarnings; + ::com::sun::star::uno::Any m_aOwnWarnings; + + public: + WarningsContainer() { } + WarningsContainer( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XWarningsSupplier >& _rxExternalWarnings ) + :m_xExternalWarnings( _rxExternalWarnings ) + { + } + virtual ~WarningsContainer(); + + void setExternalWarnings( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XWarningsSupplier >& _rxExternalWarnings ) + { + m_xExternalWarnings = _rxExternalWarnings; + } + + // convenience + /** appends an SQLWarning instance to the chain + @param _rWarning + the warning message + @param _pAsciiSQLState + the SQLState of the warning + @param _rxContext + the context of the warning + */ + void appendWarning( + const OUString& _rWarning, + const sal_Char* _pAsciiSQLState, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext ); + + // IWarningsContainer + virtual void appendWarning(const ::com::sun::star::sdbc::SQLException& _rWarning); + virtual void appendWarning(const ::com::sun::star::sdbc::SQLWarning& _rWarning); + virtual void appendWarning(const ::com::sun::star::sdb::SQLContext& _rContext); + + // XWarningsSupplier equivalents + ::com::sun::star::uno::Any SAL_CALL getWarnings( ) const; + void SAL_CALL clearWarnings( ); + }; + +//......................................................................... +} // namespace dbtools +//......................................................................... + +#endif // DBTOOLS_WARNINGSCONTAINER_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |