1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <com/sun/star/lang/DisposedException.hpp>
21 #include <com/sun/star/sdbc/ColumnSearch.hpp>
22 #include <com/sun/star/sdbc/XConnection.hpp>
23 #include <comphelper/sequence.hxx>
24 #include <cppuhelper/supportsservice.hxx>
25 #include <unotools/configmgr.hxx>
26 #include <comphelper/types.hxx>
27 #include <com/sun/star/sdb/SQLFilterOperator.hpp>
28 #include <querycomposer.hxx>
29 #include <composertools.hxx>
32 using namespace dbaccess
;
33 using namespace comphelper
;
34 using namespace connectivity
;
35 using namespace ::com::sun::star::uno
;
36 using namespace ::com::sun::star::beans
;
37 using namespace ::com::sun::star::sdbc
;
38 using namespace ::com::sun::star::sdb
;
39 using namespace ::com::sun::star::sdbcx
;
40 using namespace ::com::sun::star::container
;
41 using namespace ::com::sun::star::lang
;
42 using namespace ::cppu
;
43 using namespace ::osl
;
44 using namespace ::utl
;
47 OQueryComposer::OQueryComposer(const Reference
< XConnection
>& _xConnection
)
48 : OSubComponent(m_aMutex
,_xConnection
)
50 OSL_ENSURE(_xConnection
.is()," Connection can't be null!");
52 Reference
<XMultiServiceFactory
> xFac( _xConnection
, UNO_QUERY_THROW
);
53 m_xComposer
.set( xFac
->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER
), UNO_QUERY_THROW
);
54 m_xComposerHelper
.set( xFac
->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER
), UNO_QUERY_THROW
);
57 OQueryComposer::~OQueryComposer()
61 void SAL_CALL
OQueryComposer::disposing()
63 ::comphelper::disposeComponent(m_xComposerHelper
);
64 ::comphelper::disposeComponent(m_xComposer
);
67 // css::lang::XTypeProvider
68 Sequence
< Type
> SAL_CALL
OQueryComposer::getTypes()
70 return ::comphelper::concatSequences(OSubComponent::getTypes(),OQueryComposer_BASE::getTypes());
73 Sequence
< sal_Int8
> SAL_CALL
OQueryComposer::getImplementationId()
75 return css::uno::Sequence
<sal_Int8
>();
78 Any SAL_CALL
OQueryComposer::queryInterface( const Type
& rType
)
80 Any aRet
= OSubComponent::queryInterface(rType
);
82 aRet
= OQueryComposer_BASE::queryInterface(rType
);
87 OUString
OQueryComposer::getImplementationName( )
89 return "com.sun.star.sdb.dbaccess.OQueryComposer";
92 sal_Bool
OQueryComposer::supportsService( const OUString
& _rServiceName
)
94 return cppu::supportsService(this, _rServiceName
);
97 Sequence
< OUString
> OQueryComposer::getSupportedServiceNames( )
99 return { SERVICE_SDB_SQLQUERYCOMPOSER
};
103 OUString SAL_CALL
OQueryComposer::getQuery( )
105 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
107 ::osl::MutexGuard
aGuard( m_aMutex
);
108 Reference
<XPropertySet
> xProp(m_xComposer
,UNO_QUERY
);
111 xProp
->getPropertyValue(PROPERTY_ORIGINAL
) >>= sQuery
;
115 void SAL_CALL
OQueryComposer::setQuery( const OUString
& command
)
117 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
119 ::osl::MutexGuard
aGuard( m_aMutex
);
121 m_xComposer
->setQuery(command
);
122 m_sOrgFilter
= m_xComposer
->getFilter();
123 m_sOrgOrder
= m_xComposer
->getOrder();
126 OUString SAL_CALL
OQueryComposer::getComposedQuery( )
128 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
130 MutexGuard
aGuard(m_aMutex
);
132 return m_xComposer
->getQuery();
135 OUString SAL_CALL
OQueryComposer::getFilter( )
137 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
138 MutexGuard
aGuard(m_aMutex
);
139 FilterCreator aFilterCreator
;
140 aFilterCreator
= std::for_each(m_aFilters
.begin(),m_aFilters
.end(),aFilterCreator
);
141 return aFilterCreator
.getComposedAndClear();
144 Sequence
< Sequence
< PropertyValue
> > SAL_CALL
OQueryComposer::getStructuredFilter( )
146 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
148 MutexGuard
aGuard(m_aMutex
);
149 return m_xComposer
->getStructuredFilter();
152 OUString SAL_CALL
OQueryComposer::getOrder( )
154 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
156 ::osl::MutexGuard
aGuard( m_aMutex
);
157 OrderCreator aOrderCreator
;
158 aOrderCreator
= std::for_each(m_aOrders
.begin(),m_aOrders
.end(),aOrderCreator
);
159 return aOrderCreator
.getComposedAndClear();
162 void SAL_CALL
OQueryComposer::appendFilterByColumn( const Reference
< XPropertySet
>& column
)
164 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
165 ::osl::MutexGuard
aGuard( m_aMutex
);
167 m_xComposerHelper
->setQuery(getQuery());
168 m_xComposerHelper
->setFilter(OUString());
169 m_xComposerHelper
->appendFilterByColumn(column
, true, SQLFilterOperator::EQUAL
);
171 FilterCreator aFilterCreator
;
172 aFilterCreator
.append(getFilter());
173 aFilterCreator
.append(m_xComposerHelper
->getFilter());
175 setFilter( aFilterCreator
.getComposedAndClear() );
178 void SAL_CALL
OQueryComposer::appendOrderByColumn( const Reference
< XPropertySet
>& column
, sal_Bool ascending
)
180 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
181 ::osl::MutexGuard
aGuard( m_aMutex
);
183 m_xComposerHelper
->setQuery(getQuery());
184 m_xComposerHelper
->setOrder(OUString());
185 m_xComposerHelper
->appendOrderByColumn(column
,ascending
);
187 OrderCreator aOrderCreator
;
188 aOrderCreator
.append(getOrder());
189 aOrderCreator
.append(m_xComposerHelper
->getOrder());
191 setOrder(aOrderCreator
.getComposedAndClear());
194 void SAL_CALL
OQueryComposer::setFilter( const OUString
& filter
)
196 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
198 ::osl::MutexGuard
aGuard( m_aMutex
);
199 FilterCreator aFilterCreator
;
200 aFilterCreator
.append(m_sOrgFilter
);
201 aFilterCreator
.append(filter
);
204 if ( !filter
.isEmpty() )
205 m_aFilters
.push_back(filter
);
207 m_xComposer
->setFilter( aFilterCreator
.getComposedAndClear() );
210 void SAL_CALL
OQueryComposer::setOrder( const OUString
& order
)
212 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
214 ::osl::MutexGuard
aGuard( m_aMutex
);
216 OrderCreator aOrderCreator
;
217 aOrderCreator
.append(m_sOrgOrder
);
218 aOrderCreator
.append(order
);
221 if ( !order
.isEmpty() )
222 m_aOrders
.push_back(order
);
224 m_xComposer
->setOrder(aOrderCreator
.getComposedAndClear());
228 Reference
< XNameAccess
> SAL_CALL
OQueryComposer::getTables( )
230 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
232 ::osl::MutexGuard
aGuard( m_aMutex
);
233 return Reference
<XTablesSupplier
>(m_xComposer
,UNO_QUERY_THROW
)->getTables();
237 Reference
< XNameAccess
> SAL_CALL
OQueryComposer::getColumns( )
239 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
241 ::osl::MutexGuard
aGuard( m_aMutex
);
242 return Reference
<XColumnsSupplier
>(m_xComposer
,UNO_QUERY_THROW
)->getColumns();
245 Reference
< XIndexAccess
> SAL_CALL
OQueryComposer::getParameters( )
247 ::connectivity::checkDisposed(OSubComponent::rBHelper
.bDisposed
);
249 ::osl::MutexGuard
aGuard( m_aMutex
);
250 return Reference
<XParametersSupplier
>(m_xComposer
,UNO_QUERY_THROW
)->getParameters();
253 void SAL_CALL
OQueryComposer::acquire() throw()
255 OSubComponent::acquire();
258 void SAL_CALL
OQueryComposer::release() throw()
260 OSubComponent::release();
263 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */