1*2f86921cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2f86921cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2f86921cSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2f86921cSAndrew Rist * distributed with this work for additional information
6*2f86921cSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2f86921cSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2f86921cSAndrew Rist * "License"); you may not use this file except in compliance
9*2f86921cSAndrew Rist * with the License. You may obtain a copy of the License at
10*2f86921cSAndrew Rist *
11*2f86921cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2f86921cSAndrew Rist *
13*2f86921cSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2f86921cSAndrew Rist * software distributed under the License is distributed on an
15*2f86921cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2f86921cSAndrew Rist * KIND, either express or implied. See the License for the
17*2f86921cSAndrew Rist * specific language governing permissions and limitations
18*2f86921cSAndrew Rist * under the License.
19*2f86921cSAndrew Rist *
20*2f86921cSAndrew Rist *************************************************************/
21*2f86921cSAndrew Rist
22*2f86921cSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_ucb.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <cachedcontentresultset.hxx>
28cdf0e10cSrcweir #include <com/sun/star/sdbc/FetchDirection.hpp>
29cdf0e10cSrcweir #include <com/sun/star/ucb/FetchError.hpp>
30cdf0e10cSrcweir #include <com/sun/star/ucb/ResultSetException.hpp>
31cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
32cdf0e10cSrcweir #include <com/sun/star/script/XTypeConverter.hpp>
33cdf0e10cSrcweir #include <com/sun/star/sdbc/ResultSetType.hpp>
34cdf0e10cSrcweir #include <rtl/ustring.hxx>
35cdf0e10cSrcweir #include <osl/diagnose.h>
36cdf0e10cSrcweir
37cdf0e10cSrcweir using namespace com::sun::star::beans;
38cdf0e10cSrcweir using namespace com::sun::star::lang;
39cdf0e10cSrcweir using namespace com::sun::star::script;
40cdf0e10cSrcweir using namespace com::sun::star::sdbc;
41cdf0e10cSrcweir using namespace com::sun::star::ucb;
42cdf0e10cSrcweir using namespace com::sun::star::uno;
43cdf0e10cSrcweir using namespace com::sun::star::util;
44cdf0e10cSrcweir using namespace cppu;
45cdf0e10cSrcweir using namespace rtl;
46cdf0e10cSrcweir
47cdf0e10cSrcweir #define COMSUNSTARUCBCCRS_DEFAULT_FETCH_SIZE 256
48cdf0e10cSrcweir #define COMSUNSTARUCBCCRS_DEFAULT_FETCH_DIRECTION FetchDirection::FORWARD
49cdf0e10cSrcweir
50cdf0e10cSrcweir //--------------------------------------------------------------------------
51cdf0e10cSrcweir //--------------------------------------------------------------------------
52cdf0e10cSrcweir //define for getXXX methods of interface XRow
53cdf0e10cSrcweir //--------------------------------------------------------------------------
54cdf0e10cSrcweir //--------------------------------------------------------------------------
55cdf0e10cSrcweir
56cdf0e10cSrcweir //if you change this macro please pay attention to
57cdf0e10cSrcweir //function ::getObject, where this is similar implemented
58cdf0e10cSrcweir
59cdf0e10cSrcweir #define XROW_GETXXX( getXXX, Type ) \
60cdf0e10cSrcweir impl_EnsureNotDisposed(); \
61cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex ); \
62cdf0e10cSrcweir sal_Int32 nRow = m_nRow; \
63cdf0e10cSrcweir sal_Int32 nFetchSize = m_nFetchSize; \
64cdf0e10cSrcweir sal_Int32 nFetchDirection = m_nFetchDirection; \
65cdf0e10cSrcweir if( !m_aCache.hasRow( nRow ) ) \
66cdf0e10cSrcweir { \
67cdf0e10cSrcweir if( !m_aCache.hasCausedException( nRow ) ) \
68cdf0e10cSrcweir { \
69cdf0e10cSrcweir if( !m_xFetchProvider.is() ) \
70cdf0e10cSrcweir { \
71cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" ); \
72cdf0e10cSrcweir throw SQLException(); \
73cdf0e10cSrcweir } \
74cdf0e10cSrcweir aGuard.clear(); \
75cdf0e10cSrcweir if( impl_isForwardOnly() ) \
76cdf0e10cSrcweir applyPositionToOrigin( nRow ); \
77cdf0e10cSrcweir \
78cdf0e10cSrcweir impl_fetchData( nRow, nFetchSize, nFetchDirection ); \
79cdf0e10cSrcweir } \
80cdf0e10cSrcweir aGuard.reacquire(); \
81cdf0e10cSrcweir if( !m_aCache.hasRow( nRow ) ) \
82cdf0e10cSrcweir { \
83cdf0e10cSrcweir m_bLastReadWasFromCache = sal_False; \
84cdf0e10cSrcweir aGuard.clear(); \
85cdf0e10cSrcweir applyPositionToOrigin( nRow ); \
86cdf0e10cSrcweir impl_init_xRowOrigin(); \
87cdf0e10cSrcweir return m_xRowOrigin->getXXX( columnIndex ); \
88cdf0e10cSrcweir } \
89cdf0e10cSrcweir } \
90cdf0e10cSrcweir const Any& rValue = m_aCache.getAny( nRow, columnIndex );\
91cdf0e10cSrcweir Type aRet = Type(); \
92cdf0e10cSrcweir m_bLastReadWasFromCache = sal_True; \
93cdf0e10cSrcweir m_bLastCachedReadWasNull = !( rValue >>= aRet ); \
94cdf0e10cSrcweir /* Last chance. Try type converter service... */ \
95cdf0e10cSrcweir if ( m_bLastCachedReadWasNull && rValue.hasValue() ) \
96cdf0e10cSrcweir { \
97cdf0e10cSrcweir Reference< XTypeConverter > xConverter \
98cdf0e10cSrcweir = getTypeConverter(); \
99cdf0e10cSrcweir if ( xConverter.is() ) \
100cdf0e10cSrcweir { \
101cdf0e10cSrcweir try \
102cdf0e10cSrcweir { \
103cdf0e10cSrcweir Any aConvAny = xConverter->convertTo( \
104cdf0e10cSrcweir rValue, \
105cdf0e10cSrcweir getCppuType( static_cast< \
106cdf0e10cSrcweir const Type * >( 0 ) ) ); \
107cdf0e10cSrcweir m_bLastCachedReadWasNull = !( aConvAny >>= aRet ); \
108cdf0e10cSrcweir } \
109cdf0e10cSrcweir catch ( IllegalArgumentException ) \
110cdf0e10cSrcweir { \
111cdf0e10cSrcweir } \
112cdf0e10cSrcweir catch ( CannotConvertException ) \
113cdf0e10cSrcweir { \
114cdf0e10cSrcweir } \
115cdf0e10cSrcweir } \
116cdf0e10cSrcweir } \
117cdf0e10cSrcweir return aRet;
118cdf0e10cSrcweir
119cdf0e10cSrcweir //--------------------------------------------------------------------------
120cdf0e10cSrcweir //--------------------------------------------------------------------------
121cdf0e10cSrcweir // CCRS_Cache methoeds.
122cdf0e10cSrcweir //--------------------------------------------------------------------------
123cdf0e10cSrcweir //--------------------------------------------------------------------------
124cdf0e10cSrcweir
CCRS_Cache(const Reference<XContentIdentifierMapping> & xMapping)125cdf0e10cSrcweir CachedContentResultSet::CCRS_Cache::CCRS_Cache(
126cdf0e10cSrcweir const Reference< XContentIdentifierMapping > & xMapping )
127cdf0e10cSrcweir : m_pResult( NULL )
128cdf0e10cSrcweir , m_xContentIdentifierMapping( xMapping )
129cdf0e10cSrcweir , m_pMappedReminder( NULL )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
~CCRS_Cache()133cdf0e10cSrcweir CachedContentResultSet::CCRS_Cache::~CCRS_Cache()
134cdf0e10cSrcweir {
135cdf0e10cSrcweir delete m_pResult;
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir void SAL_CALL CachedContentResultSet::CCRS_Cache
clear()139cdf0e10cSrcweir ::clear()
140cdf0e10cSrcweir {
141cdf0e10cSrcweir if( m_pResult )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir delete m_pResult;
144cdf0e10cSrcweir m_pResult = NULL;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir clearMappedReminder();
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
149cdf0e10cSrcweir void SAL_CALL CachedContentResultSet::CCRS_Cache
loadData(const FetchResult & rResult)150cdf0e10cSrcweir ::loadData( const FetchResult& rResult )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir clear();
153cdf0e10cSrcweir m_pResult = new FetchResult( rResult );
154cdf0e10cSrcweir }
155cdf0e10cSrcweir
156cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
hasRow(sal_Int32 row)157cdf0e10cSrcweir ::hasRow( sal_Int32 row )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir if( !m_pResult )
160cdf0e10cSrcweir return sal_False;
161cdf0e10cSrcweir long nStart = m_pResult->StartIndex;
162cdf0e10cSrcweir long nEnd = nStart;
163cdf0e10cSrcweir if( m_pResult->Orientation )
164cdf0e10cSrcweir nEnd += m_pResult->Rows.getLength() - 1;
165cdf0e10cSrcweir else
166cdf0e10cSrcweir nStart -= m_pResult->Rows.getLength() + 1;
167cdf0e10cSrcweir
168cdf0e10cSrcweir return nStart <= row && row <= nEnd;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir
171cdf0e10cSrcweir sal_Int32 SAL_CALL CachedContentResultSet::CCRS_Cache
getMaxRow()172cdf0e10cSrcweir ::getMaxRow()
173cdf0e10cSrcweir {
174cdf0e10cSrcweir if( !m_pResult )
175cdf0e10cSrcweir return 0;
176cdf0e10cSrcweir long nEnd = m_pResult->StartIndex;
177cdf0e10cSrcweir if( m_pResult->Orientation )
178cdf0e10cSrcweir return nEnd += m_pResult->Rows.getLength() - 1;
179cdf0e10cSrcweir else
180cdf0e10cSrcweir return nEnd;
181cdf0e10cSrcweir }
182cdf0e10cSrcweir
183cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
hasKnownLast()184cdf0e10cSrcweir ::hasKnownLast()
185cdf0e10cSrcweir {
186cdf0e10cSrcweir if( !m_pResult )
187cdf0e10cSrcweir return sal_False;
188cdf0e10cSrcweir
189cdf0e10cSrcweir if( ( m_pResult->FetchError & FetchError::ENDOFDATA )
190cdf0e10cSrcweir && m_pResult->Orientation
191cdf0e10cSrcweir && m_pResult->Rows.getLength() )
192cdf0e10cSrcweir return sal_True;
193cdf0e10cSrcweir
194cdf0e10cSrcweir return sal_False;
195cdf0e10cSrcweir }
196cdf0e10cSrcweir
197cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
hasCausedException(sal_Int32 nRow)198cdf0e10cSrcweir ::hasCausedException( sal_Int32 nRow )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir if( !m_pResult )
201cdf0e10cSrcweir return sal_False;
202cdf0e10cSrcweir if( !( m_pResult->FetchError & FetchError::EXCEPTION ) )
203cdf0e10cSrcweir return sal_False;
204cdf0e10cSrcweir
205cdf0e10cSrcweir long nEnd = m_pResult->StartIndex;
206cdf0e10cSrcweir if( m_pResult->Orientation )
207cdf0e10cSrcweir nEnd += m_pResult->Rows.getLength();
208cdf0e10cSrcweir
209cdf0e10cSrcweir return nRow == nEnd+1;
210cdf0e10cSrcweir }
211cdf0e10cSrcweir
212cdf0e10cSrcweir Any& SAL_CALL CachedContentResultSet::CCRS_Cache
getRowAny(sal_Int32 nRow)213cdf0e10cSrcweir ::getRowAny( sal_Int32 nRow )
214cdf0e10cSrcweir throw( SQLException,
215cdf0e10cSrcweir RuntimeException )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir if( !nRow )
218cdf0e10cSrcweir throw SQLException();
219cdf0e10cSrcweir if( !m_pResult )
220cdf0e10cSrcweir throw SQLException();
221cdf0e10cSrcweir if( !hasRow( nRow ) )
222cdf0e10cSrcweir throw SQLException();
223cdf0e10cSrcweir
224cdf0e10cSrcweir long nDiff = nRow - m_pResult->StartIndex;
225cdf0e10cSrcweir if( nDiff < 0 )
226cdf0e10cSrcweir nDiff *= -1;
227cdf0e10cSrcweir
228cdf0e10cSrcweir return (m_pResult->Rows)[nDiff];
229cdf0e10cSrcweir }
230cdf0e10cSrcweir
231cdf0e10cSrcweir void SAL_CALL CachedContentResultSet::CCRS_Cache
remindMapped(sal_Int32 nRow)232cdf0e10cSrcweir ::remindMapped( sal_Int32 nRow )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir //remind that this row was mapped
235cdf0e10cSrcweir if( !m_pResult )
236cdf0e10cSrcweir return;
237cdf0e10cSrcweir long nDiff = nRow - m_pResult->StartIndex;
238cdf0e10cSrcweir if( nDiff < 0 )
239cdf0e10cSrcweir nDiff *= -1;
240cdf0e10cSrcweir Sequence< sal_Bool >* pMappedReminder = getMappedReminder();
241cdf0e10cSrcweir if( nDiff < pMappedReminder->getLength() )
242cdf0e10cSrcweir (*pMappedReminder)[nDiff] = sal_True;
243cdf0e10cSrcweir }
244cdf0e10cSrcweir
245cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet::CCRS_Cache
isRowMapped(sal_Int32 nRow)246cdf0e10cSrcweir ::isRowMapped( sal_Int32 nRow )
247cdf0e10cSrcweir {
248cdf0e10cSrcweir if( !m_pMappedReminder || !m_pResult )
249cdf0e10cSrcweir return sal_False;
250cdf0e10cSrcweir long nDiff = nRow - m_pResult->StartIndex;
251cdf0e10cSrcweir if( nDiff < 0 )
252cdf0e10cSrcweir nDiff *= -1;
253cdf0e10cSrcweir if( nDiff < m_pMappedReminder->getLength() )
254cdf0e10cSrcweir return (*m_pMappedReminder)[nDiff];
255cdf0e10cSrcweir return sal_False;
256cdf0e10cSrcweir }
257cdf0e10cSrcweir
258cdf0e10cSrcweir void SAL_CALL CachedContentResultSet::CCRS_Cache
clearMappedReminder()259cdf0e10cSrcweir ::clearMappedReminder()
260cdf0e10cSrcweir {
261cdf0e10cSrcweir delete m_pMappedReminder;
262cdf0e10cSrcweir m_pMappedReminder = NULL;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir Sequence< sal_Bool >* SAL_CALL CachedContentResultSet::CCRS_Cache
getMappedReminder()266cdf0e10cSrcweir ::getMappedReminder()
267cdf0e10cSrcweir {
268cdf0e10cSrcweir if( !m_pMappedReminder )
269cdf0e10cSrcweir {
270cdf0e10cSrcweir sal_Int32 nCount = m_pResult->Rows.getLength();
271cdf0e10cSrcweir m_pMappedReminder = new Sequence< sal_Bool >( nCount );
272cdf0e10cSrcweir for( ;nCount; nCount-- )
273cdf0e10cSrcweir (*m_pMappedReminder)[nCount] = sal_False;
274cdf0e10cSrcweir }
275cdf0e10cSrcweir return m_pMappedReminder;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir
278cdf0e10cSrcweir const Any& SAL_CALL CachedContentResultSet::CCRS_Cache
getAny(sal_Int32 nRow,sal_Int32 nColumnIndex)279cdf0e10cSrcweir ::getAny( sal_Int32 nRow, sal_Int32 nColumnIndex )
280cdf0e10cSrcweir throw( SQLException,
281cdf0e10cSrcweir RuntimeException )
282cdf0e10cSrcweir {
283cdf0e10cSrcweir if( !nColumnIndex )
284cdf0e10cSrcweir throw SQLException();
285cdf0e10cSrcweir if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir Any& rRow = getRowAny( nRow );
288cdf0e10cSrcweir Sequence< Any > aValue;
289cdf0e10cSrcweir rRow >>= aValue;
290cdf0e10cSrcweir if( m_xContentIdentifierMapping->mapRow( aValue ) )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir rRow <<= aValue;
293cdf0e10cSrcweir remindMapped( nRow );
294cdf0e10cSrcweir }
295cdf0e10cSrcweir else
296cdf0e10cSrcweir m_xContentIdentifierMapping.clear();
297cdf0e10cSrcweir }
298cdf0e10cSrcweir const Sequence< Any >& rRow =
299cdf0e10cSrcweir (* reinterpret_cast< const Sequence< Any > * >
300cdf0e10cSrcweir (getRowAny( nRow ).getValue() ));
301cdf0e10cSrcweir
302cdf0e10cSrcweir if( nColumnIndex > rRow.getLength() )
303cdf0e10cSrcweir throw SQLException();
304cdf0e10cSrcweir return rRow[nColumnIndex-1];
305cdf0e10cSrcweir }
306cdf0e10cSrcweir
307cdf0e10cSrcweir const rtl::OUString& SAL_CALL CachedContentResultSet::CCRS_Cache
getContentIdentifierString(sal_Int32 nRow)308cdf0e10cSrcweir ::getContentIdentifierString( sal_Int32 nRow )
309cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
310cdf0e10cSrcweir {
311cdf0e10cSrcweir try
312cdf0e10cSrcweir {
313cdf0e10cSrcweir if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
314cdf0e10cSrcweir {
315cdf0e10cSrcweir Any& rRow = getRowAny( nRow );
316cdf0e10cSrcweir rtl::OUString aValue;
317cdf0e10cSrcweir rRow >>= aValue;
318cdf0e10cSrcweir rRow <<= m_xContentIdentifierMapping->mapContentIdentifierString( aValue );
319cdf0e10cSrcweir remindMapped( nRow );
320cdf0e10cSrcweir }
321cdf0e10cSrcweir return (* reinterpret_cast< const rtl::OUString * >
322cdf0e10cSrcweir (getRowAny( nRow ).getValue() ));
323cdf0e10cSrcweir }
324cdf0e10cSrcweir catch( SQLException )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir throw RuntimeException();
327cdf0e10cSrcweir }
328cdf0e10cSrcweir }
329cdf0e10cSrcweir
330cdf0e10cSrcweir const Reference< XContentIdentifier >& SAL_CALL CachedContentResultSet::CCRS_Cache
getContentIdentifier(sal_Int32 nRow)331cdf0e10cSrcweir ::getContentIdentifier( sal_Int32 nRow )
332cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir try
335cdf0e10cSrcweir {
336cdf0e10cSrcweir if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
337cdf0e10cSrcweir {
338cdf0e10cSrcweir Any& rRow = getRowAny( nRow );
339cdf0e10cSrcweir Reference< XContentIdentifier > aValue;
340cdf0e10cSrcweir rRow >>= aValue;
341cdf0e10cSrcweir rRow <<= m_xContentIdentifierMapping->mapContentIdentifier( aValue );
342cdf0e10cSrcweir remindMapped( nRow );
343cdf0e10cSrcweir }
344cdf0e10cSrcweir return (* reinterpret_cast< const Reference< XContentIdentifier > * >
345cdf0e10cSrcweir (getRowAny( nRow ).getValue() ));
346cdf0e10cSrcweir }
347cdf0e10cSrcweir catch( SQLException )
348cdf0e10cSrcweir {
349cdf0e10cSrcweir throw RuntimeException();
350cdf0e10cSrcweir }
351cdf0e10cSrcweir }
352cdf0e10cSrcweir
353cdf0e10cSrcweir const Reference< XContent >& SAL_CALL CachedContentResultSet::CCRS_Cache
getContent(sal_Int32 nRow)354cdf0e10cSrcweir ::getContent( sal_Int32 nRow )
355cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir try
358cdf0e10cSrcweir {
359cdf0e10cSrcweir if( m_xContentIdentifierMapping.is() && !isRowMapped( nRow ) )
360cdf0e10cSrcweir {
361cdf0e10cSrcweir Any& rRow = getRowAny( nRow );
362cdf0e10cSrcweir Reference< XContent > aValue;
363cdf0e10cSrcweir rRow >>= aValue;
364cdf0e10cSrcweir rRow <<= m_xContentIdentifierMapping->mapContent( aValue );
365cdf0e10cSrcweir remindMapped( nRow );
366cdf0e10cSrcweir }
367cdf0e10cSrcweir return (* reinterpret_cast< const Reference< XContent > * >
368cdf0e10cSrcweir (getRowAny( nRow ).getValue() ));
369cdf0e10cSrcweir }
370cdf0e10cSrcweir catch( SQLException )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir throw RuntimeException();
373cdf0e10cSrcweir }
374cdf0e10cSrcweir }
375cdf0e10cSrcweir
376cdf0e10cSrcweir //--------------------------------------------------------------------------
377cdf0e10cSrcweir //--------------------------------------------------------------------------
378cdf0e10cSrcweir // class CCRS_PropertySetInfo
379cdf0e10cSrcweir //--------------------------------------------------------------------------
380cdf0e10cSrcweir //--------------------------------------------------------------------------
381cdf0e10cSrcweir
382cdf0e10cSrcweir class CCRS_PropertySetInfo :
383cdf0e10cSrcweir public cppu::OWeakObject,
384cdf0e10cSrcweir public com::sun::star::lang::XTypeProvider,
385cdf0e10cSrcweir public com::sun::star::beans::XPropertySetInfo
386cdf0e10cSrcweir {
387cdf0e10cSrcweir friend class CachedContentResultSet;
388cdf0e10cSrcweir
389cdf0e10cSrcweir //my Properties
390cdf0e10cSrcweir Sequence< com::sun::star::beans::Property >*
391cdf0e10cSrcweir m_pProperties;
392cdf0e10cSrcweir
393cdf0e10cSrcweir //some helping variables ( names for my special properties )
394cdf0e10cSrcweir static rtl::OUString m_aPropertyNameForCount;
395cdf0e10cSrcweir static rtl::OUString m_aPropertyNameForFinalCount;
396cdf0e10cSrcweir static rtl::OUString m_aPropertyNameForFetchSize;
397cdf0e10cSrcweir static rtl::OUString m_aPropertyNameForFetchDirection;
398cdf0e10cSrcweir
399cdf0e10cSrcweir long m_nFetchSizePropertyHandle;
400cdf0e10cSrcweir long m_nFetchDirectionPropertyHandle;
401cdf0e10cSrcweir
402cdf0e10cSrcweir private:
403cdf0e10cSrcweir sal_Int32 SAL_CALL
404cdf0e10cSrcweir impl_getRemainedHandle() const;
405cdf0e10cSrcweir
406cdf0e10cSrcweir sal_Bool SAL_CALL
407cdf0e10cSrcweir impl_queryProperty(
408cdf0e10cSrcweir const rtl::OUString& rName
409cdf0e10cSrcweir , com::sun::star::beans::Property& rProp ) const;
410cdf0e10cSrcweir sal_Int32 SAL_CALL
411cdf0e10cSrcweir impl_getPos( const rtl::OUString& rName ) const;
412cdf0e10cSrcweir
413cdf0e10cSrcweir static sal_Bool SAL_CALL
414cdf0e10cSrcweir impl_isMyPropertyName( const rtl::OUString& rName );
415cdf0e10cSrcweir
416cdf0e10cSrcweir public:
417cdf0e10cSrcweir CCRS_PropertySetInfo( Reference<
418cdf0e10cSrcweir XPropertySetInfo > xPropertySetInfoOrigin );
419cdf0e10cSrcweir
420cdf0e10cSrcweir virtual ~CCRS_PropertySetInfo();
421cdf0e10cSrcweir
422cdf0e10cSrcweir // XInterface
423cdf0e10cSrcweir XINTERFACE_DECL()
424cdf0e10cSrcweir
425cdf0e10cSrcweir // XTypeProvider
426cdf0e10cSrcweir XTYPEPROVIDER_DECL()
427cdf0e10cSrcweir
428cdf0e10cSrcweir // XPropertySetInfo
429cdf0e10cSrcweir virtual Sequence< com::sun::star::beans::Property > SAL_CALL
430cdf0e10cSrcweir getProperties()
431cdf0e10cSrcweir throw( RuntimeException );
432cdf0e10cSrcweir
433cdf0e10cSrcweir virtual com::sun::star::beans::Property SAL_CALL
434cdf0e10cSrcweir getPropertyByName( const rtl::OUString& aName )
435cdf0e10cSrcweir throw( com::sun::star::beans::UnknownPropertyException, RuntimeException );
436cdf0e10cSrcweir
437cdf0e10cSrcweir virtual sal_Bool SAL_CALL
438cdf0e10cSrcweir hasPropertyByName( const rtl::OUString& Name )
439cdf0e10cSrcweir throw( RuntimeException );
440cdf0e10cSrcweir };
441cdf0e10cSrcweir
442cdf0e10cSrcweir OUString CCRS_PropertySetInfo::m_aPropertyNameForCount( OUString::createFromAscii( "RowCount" ) );
443cdf0e10cSrcweir OUString CCRS_PropertySetInfo::m_aPropertyNameForFinalCount( OUString::createFromAscii( "IsRowCountFinal" ) );
444cdf0e10cSrcweir OUString CCRS_PropertySetInfo::m_aPropertyNameForFetchSize( OUString::createFromAscii( "FetchSize" ) );
445cdf0e10cSrcweir OUString CCRS_PropertySetInfo::m_aPropertyNameForFetchDirection( OUString::createFromAscii( "FetchDirection" ) );
446cdf0e10cSrcweir
CCRS_PropertySetInfo(Reference<XPropertySetInfo> xInfo)447cdf0e10cSrcweir CCRS_PropertySetInfo::CCRS_PropertySetInfo(
448cdf0e10cSrcweir Reference< XPropertySetInfo > xInfo )
449cdf0e10cSrcweir : m_pProperties( NULL )
450cdf0e10cSrcweir , m_nFetchSizePropertyHandle( -1 )
451cdf0e10cSrcweir , m_nFetchDirectionPropertyHandle( -1 )
452cdf0e10cSrcweir {
453cdf0e10cSrcweir //initialize list of properties:
454cdf0e10cSrcweir
455cdf0e10cSrcweir // it is required, that the received xInfo contains the two
456cdf0e10cSrcweir // properties with names 'm_aPropertyNameForCount' and
457cdf0e10cSrcweir // 'm_aPropertyNameForFinalCount'
458cdf0e10cSrcweir
459cdf0e10cSrcweir if( xInfo.is() )
460cdf0e10cSrcweir {
461cdf0e10cSrcweir Sequence<Property> aProps = xInfo->getProperties();
462cdf0e10cSrcweir m_pProperties = new Sequence<Property> ( aProps );
463cdf0e10cSrcweir }
464cdf0e10cSrcweir else
465cdf0e10cSrcweir {
466cdf0e10cSrcweir OSL_ENSURE( sal_False, "The received XPropertySetInfo doesn't contain required properties" );
467cdf0e10cSrcweir m_pProperties = new Sequence<Property>;
468cdf0e10cSrcweir }
469cdf0e10cSrcweir
470cdf0e10cSrcweir //ensure, that we haven't got the Properties 'FetchSize' and 'Direction' twice:
471cdf0e10cSrcweir sal_Int32 nFetchSize = impl_getPos( m_aPropertyNameForFetchSize );
472cdf0e10cSrcweir sal_Int32 nFetchDirection = impl_getPos( m_aPropertyNameForFetchDirection );
473cdf0e10cSrcweir sal_Int32 nDeleted = 0;
474cdf0e10cSrcweir if( nFetchSize != -1 )
475cdf0e10cSrcweir nDeleted++;
476cdf0e10cSrcweir if( nFetchDirection != -1 )
477cdf0e10cSrcweir nDeleted++;
478cdf0e10cSrcweir
479cdf0e10cSrcweir Sequence< Property >* pOrigProps = new Sequence<Property> ( *m_pProperties );
480cdf0e10cSrcweir sal_Int32 nOrigProps = pOrigProps->getLength();
481cdf0e10cSrcweir
482cdf0e10cSrcweir m_pProperties->realloc( nOrigProps + 2 - nDeleted );//note that nDeleted is <= 2
483cdf0e10cSrcweir for( sal_Int32 n = 0, m = 0; n < nOrigProps; n++, m++ )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir if( n == nFetchSize || n == nFetchDirection )
486cdf0e10cSrcweir m--;
487cdf0e10cSrcweir else
488cdf0e10cSrcweir (*m_pProperties)[ m ] = (*pOrigProps)[ n ];
489cdf0e10cSrcweir }
490cdf0e10cSrcweir {
491cdf0e10cSrcweir Property& rMyProp = (*m_pProperties)[ nOrigProps - nDeleted ];
492cdf0e10cSrcweir rMyProp.Name = m_aPropertyNameForFetchSize;
493cdf0e10cSrcweir rMyProp.Type = getCppuType( static_cast< const sal_Int32 * >( 0 ) );
494cdf0e10cSrcweir rMyProp.Attributes = PropertyAttribute::BOUND | PropertyAttribute::MAYBEDEFAULT;
495cdf0e10cSrcweir
496cdf0e10cSrcweir if( nFetchSize != -1 )
497cdf0e10cSrcweir m_nFetchSizePropertyHandle = (*pOrigProps)[nFetchSize].Handle;
498cdf0e10cSrcweir else
499cdf0e10cSrcweir m_nFetchSizePropertyHandle = impl_getRemainedHandle();
500cdf0e10cSrcweir
501cdf0e10cSrcweir rMyProp.Handle = m_nFetchSizePropertyHandle;
502cdf0e10cSrcweir
503cdf0e10cSrcweir }
504cdf0e10cSrcweir {
505cdf0e10cSrcweir Property& rMyProp = (*m_pProperties)[ nOrigProps - nDeleted + 1 ];
506cdf0e10cSrcweir rMyProp.Name = m_aPropertyNameForFetchDirection;
507cdf0e10cSrcweir rMyProp.Type = getCppuType( static_cast< const sal_Bool * >( 0 ) );
508cdf0e10cSrcweir rMyProp.Attributes = PropertyAttribute::BOUND | PropertyAttribute::MAYBEDEFAULT;
509cdf0e10cSrcweir
510cdf0e10cSrcweir if( nFetchSize != -1 )
511cdf0e10cSrcweir m_nFetchDirectionPropertyHandle = (*pOrigProps)[nFetchDirection].Handle;
512cdf0e10cSrcweir else
513cdf0e10cSrcweir m_nFetchDirectionPropertyHandle = impl_getRemainedHandle();
514cdf0e10cSrcweir
515cdf0e10cSrcweir m_nFetchDirectionPropertyHandle = rMyProp.Handle;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir delete pOrigProps;
518cdf0e10cSrcweir }
519cdf0e10cSrcweir
~CCRS_PropertySetInfo()520cdf0e10cSrcweir CCRS_PropertySetInfo::~CCRS_PropertySetInfo()
521cdf0e10cSrcweir {
522cdf0e10cSrcweir delete m_pProperties;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir
525cdf0e10cSrcweir //--------------------------------------------------------------------------
526cdf0e10cSrcweir // XInterface methods.
527cdf0e10cSrcweir //--------------------------------------------------------------------------
528cdf0e10cSrcweir //list all interfaces inclusive baseclasses of interfaces
529cdf0e10cSrcweir XINTERFACE_IMPL_2( CCRS_PropertySetInfo
530cdf0e10cSrcweir , XTypeProvider
531cdf0e10cSrcweir , XPropertySetInfo
532cdf0e10cSrcweir );
533cdf0e10cSrcweir
534cdf0e10cSrcweir //--------------------------------------------------------------------------
535cdf0e10cSrcweir // XTypeProvider methods.
536cdf0e10cSrcweir //--------------------------------------------------------------------------
537cdf0e10cSrcweir //list all interfaces exclusive baseclasses
538cdf0e10cSrcweir XTYPEPROVIDER_IMPL_2( CCRS_PropertySetInfo
539cdf0e10cSrcweir , XTypeProvider
540cdf0e10cSrcweir , XPropertySetInfo
541cdf0e10cSrcweir );
542cdf0e10cSrcweir //--------------------------------------------------------------------------
543cdf0e10cSrcweir // XPropertySetInfo methods.
544cdf0e10cSrcweir //--------------------------------------------------------------------------
545cdf0e10cSrcweir //virtual
546cdf0e10cSrcweir Sequence< Property > SAL_CALL CCRS_PropertySetInfo
getProperties()547cdf0e10cSrcweir ::getProperties() throw( RuntimeException )
548cdf0e10cSrcweir {
549cdf0e10cSrcweir return *m_pProperties;
550cdf0e10cSrcweir }
551cdf0e10cSrcweir
552cdf0e10cSrcweir //virtual
553cdf0e10cSrcweir Property SAL_CALL CCRS_PropertySetInfo
getPropertyByName(const rtl::OUString & aName)554cdf0e10cSrcweir ::getPropertyByName( const rtl::OUString& aName )
555cdf0e10cSrcweir throw( UnknownPropertyException, RuntimeException )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir if ( !aName.getLength() )
558cdf0e10cSrcweir throw UnknownPropertyException();
559cdf0e10cSrcweir
560cdf0e10cSrcweir Property aProp;
561cdf0e10cSrcweir if ( impl_queryProperty( aName, aProp ) )
562cdf0e10cSrcweir return aProp;
563cdf0e10cSrcweir
564cdf0e10cSrcweir throw UnknownPropertyException();
565cdf0e10cSrcweir }
566cdf0e10cSrcweir
567cdf0e10cSrcweir //virtual
568cdf0e10cSrcweir sal_Bool SAL_CALL CCRS_PropertySetInfo
hasPropertyByName(const rtl::OUString & Name)569cdf0e10cSrcweir ::hasPropertyByName( const rtl::OUString& Name )
570cdf0e10cSrcweir throw( RuntimeException )
571cdf0e10cSrcweir {
572cdf0e10cSrcweir return ( impl_getPos( Name ) != -1 );
573cdf0e10cSrcweir }
574cdf0e10cSrcweir
575cdf0e10cSrcweir //--------------------------------------------------------------------------
576cdf0e10cSrcweir // impl_ methods.
577cdf0e10cSrcweir //--------------------------------------------------------------------------
578cdf0e10cSrcweir
579cdf0e10cSrcweir sal_Int32 SAL_CALL CCRS_PropertySetInfo
impl_getPos(const OUString & rName) const580cdf0e10cSrcweir ::impl_getPos( const OUString& rName ) const
581cdf0e10cSrcweir {
582cdf0e10cSrcweir for( sal_Int32 nN = m_pProperties->getLength(); nN--; )
583cdf0e10cSrcweir {
584cdf0e10cSrcweir const Property& rMyProp = (*m_pProperties)[nN];
585cdf0e10cSrcweir if( rMyProp.Name == rName )
586cdf0e10cSrcweir return nN;
587cdf0e10cSrcweir }
588cdf0e10cSrcweir return -1;
589cdf0e10cSrcweir }
590cdf0e10cSrcweir
591cdf0e10cSrcweir sal_Bool SAL_CALL CCRS_PropertySetInfo
impl_queryProperty(const OUString & rName,Property & rProp) const592cdf0e10cSrcweir ::impl_queryProperty( const OUString& rName, Property& rProp ) const
593cdf0e10cSrcweir {
594cdf0e10cSrcweir for( sal_Int32 nN = m_pProperties->getLength(); nN--; )
595cdf0e10cSrcweir {
596cdf0e10cSrcweir const Property& rMyProp = (*m_pProperties)[nN];
597cdf0e10cSrcweir if( rMyProp.Name == rName )
598cdf0e10cSrcweir {
599cdf0e10cSrcweir rProp.Name = rMyProp.Name;
600cdf0e10cSrcweir rProp.Handle = rMyProp.Handle;
601cdf0e10cSrcweir rProp.Type = rMyProp.Type;
602cdf0e10cSrcweir rProp.Attributes = rMyProp.Attributes;
603cdf0e10cSrcweir
604cdf0e10cSrcweir return sal_True;
605cdf0e10cSrcweir }
606cdf0e10cSrcweir }
607cdf0e10cSrcweir return sal_False;
608cdf0e10cSrcweir }
609cdf0e10cSrcweir
610cdf0e10cSrcweir //static
611cdf0e10cSrcweir sal_Bool SAL_CALL CCRS_PropertySetInfo
impl_isMyPropertyName(const OUString & rPropertyName)612cdf0e10cSrcweir ::impl_isMyPropertyName( const OUString& rPropertyName )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir return ( rPropertyName == m_aPropertyNameForCount
615cdf0e10cSrcweir || rPropertyName == m_aPropertyNameForFinalCount
616cdf0e10cSrcweir || rPropertyName == m_aPropertyNameForFetchSize
617cdf0e10cSrcweir || rPropertyName == m_aPropertyNameForFetchDirection );
618cdf0e10cSrcweir }
619cdf0e10cSrcweir
620cdf0e10cSrcweir sal_Int32 SAL_CALL CCRS_PropertySetInfo
impl_getRemainedHandle() const621cdf0e10cSrcweir ::impl_getRemainedHandle( ) const
622cdf0e10cSrcweir {
623cdf0e10cSrcweir sal_Int32 nHandle = 1;
624cdf0e10cSrcweir
625cdf0e10cSrcweir if( !m_pProperties )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir OSL_ENSURE( sal_False, "Properties not initialized yet" );
628cdf0e10cSrcweir return nHandle;
629cdf0e10cSrcweir }
630cdf0e10cSrcweir sal_Bool bFound = sal_True;
631cdf0e10cSrcweir while( bFound )
632cdf0e10cSrcweir {
633cdf0e10cSrcweir bFound = sal_False;
634cdf0e10cSrcweir for( sal_Int32 nN = m_pProperties->getLength(); nN--; )
635cdf0e10cSrcweir {
636cdf0e10cSrcweir if( nHandle == (*m_pProperties)[nN].Handle )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir bFound = sal_True;
639cdf0e10cSrcweir nHandle++;
640cdf0e10cSrcweir break;
641cdf0e10cSrcweir }
642cdf0e10cSrcweir }
643cdf0e10cSrcweir }
644cdf0e10cSrcweir return nHandle;
645cdf0e10cSrcweir }
646cdf0e10cSrcweir
647cdf0e10cSrcweir //--------------------------------------------------------------------------
648cdf0e10cSrcweir //--------------------------------------------------------------------------
649cdf0e10cSrcweir // class CachedContentResultSet
650cdf0e10cSrcweir //--------------------------------------------------------------------------
651cdf0e10cSrcweir //--------------------------------------------------------------------------
652cdf0e10cSrcweir
CachedContentResultSet(const Reference<XMultiServiceFactory> & xSMgr,const Reference<XResultSet> & xOrigin,const Reference<XContentIdentifierMapping> & xContentIdentifierMapping)653cdf0e10cSrcweir CachedContentResultSet::CachedContentResultSet(
654cdf0e10cSrcweir const Reference< XMultiServiceFactory > & xSMgr
655cdf0e10cSrcweir , const Reference< XResultSet > & xOrigin
656cdf0e10cSrcweir , const Reference< XContentIdentifierMapping > &
657cdf0e10cSrcweir xContentIdentifierMapping )
658cdf0e10cSrcweir : ContentResultSetWrapper( xOrigin )
659cdf0e10cSrcweir
660cdf0e10cSrcweir , m_xSMgr( xSMgr )
661cdf0e10cSrcweir , m_xFetchProvider( NULL )
662cdf0e10cSrcweir , m_xFetchProviderForContentAccess( NULL )
663cdf0e10cSrcweir
664cdf0e10cSrcweir , m_xMyPropertySetInfo( NULL )
665cdf0e10cSrcweir , m_pMyPropSetInfo( NULL )
666cdf0e10cSrcweir
667cdf0e10cSrcweir , m_xContentIdentifierMapping( xContentIdentifierMapping )
668cdf0e10cSrcweir , m_nRow( 0 ) // Position is one-based. Zero means: before first element.
669cdf0e10cSrcweir , m_bAfterLast( sal_False )
670cdf0e10cSrcweir , m_nLastAppliedPos( 0 )
671cdf0e10cSrcweir , m_bAfterLastApplied( sal_False )
672cdf0e10cSrcweir , m_nKnownCount( 0 )
673cdf0e10cSrcweir , m_bFinalCount( sal_False )
674cdf0e10cSrcweir , m_nFetchSize(
675cdf0e10cSrcweir COMSUNSTARUCBCCRS_DEFAULT_FETCH_SIZE )
676cdf0e10cSrcweir , m_nFetchDirection(
677cdf0e10cSrcweir COMSUNSTARUCBCCRS_DEFAULT_FETCH_DIRECTION )
678cdf0e10cSrcweir
679cdf0e10cSrcweir , m_bLastReadWasFromCache( sal_False )
680cdf0e10cSrcweir , m_bLastCachedReadWasNull( sal_True )
681cdf0e10cSrcweir , m_aCache( m_xContentIdentifierMapping )
682cdf0e10cSrcweir , m_aCacheContentIdentifierString( m_xContentIdentifierMapping )
683cdf0e10cSrcweir , m_aCacheContentIdentifier( m_xContentIdentifierMapping )
684cdf0e10cSrcweir , m_aCacheContent( m_xContentIdentifierMapping )
685cdf0e10cSrcweir , m_bTriedToGetTypeConverter( sal_False )
686cdf0e10cSrcweir , m_xTypeConverter( NULL )
687cdf0e10cSrcweir {
688cdf0e10cSrcweir m_xFetchProvider = Reference< XFetchProvider >( m_xResultSetOrigin, UNO_QUERY );
689cdf0e10cSrcweir OSL_ENSURE( m_xFetchProvider.is(), "interface XFetchProvider is required" );
690cdf0e10cSrcweir
691cdf0e10cSrcweir m_xFetchProviderForContentAccess = Reference< XFetchProviderForContentAccess >( m_xResultSetOrigin, UNO_QUERY );
692cdf0e10cSrcweir OSL_ENSURE( m_xFetchProviderForContentAccess.is(), "interface XFetchProviderForContentAccess is required" );
693cdf0e10cSrcweir
694cdf0e10cSrcweir impl_init();
695cdf0e10cSrcweir };
696cdf0e10cSrcweir
~CachedContentResultSet()697cdf0e10cSrcweir CachedContentResultSet::~CachedContentResultSet()
698cdf0e10cSrcweir {
699cdf0e10cSrcweir impl_deinit();
700cdf0e10cSrcweir //do not delete m_pMyPropSetInfo, cause it is hold via reference
701cdf0e10cSrcweir };
702cdf0e10cSrcweir
703cdf0e10cSrcweir //--------------------------------------------------------------------------
704cdf0e10cSrcweir // impl_ methods.
705cdf0e10cSrcweir //--------------------------------------------------------------------------
706cdf0e10cSrcweir
707cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
applyPositionToOrigin(sal_Int32 nRow)708cdf0e10cSrcweir ::applyPositionToOrigin( sal_Int32 nRow )
709cdf0e10cSrcweir throw( SQLException,
710cdf0e10cSrcweir RuntimeException )
711cdf0e10cSrcweir {
712cdf0e10cSrcweir impl_EnsureNotDisposed();
713cdf0e10cSrcweir //-------------------------------------------------------------------------
714cdf0e10cSrcweir /**
715cdf0e10cSrcweir @returns
716cdf0e10cSrcweir <TRUE/> if the cursor is on a valid row; <FALSE/> if it is off
717cdf0e10cSrcweir the result set.
718cdf0e10cSrcweir */
719cdf0e10cSrcweir
720cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
721cdf0e10cSrcweir OSL_ENSURE( nRow >= 0, "only positive values supported" );
722cdf0e10cSrcweir if( !m_xResultSetOrigin.is() )
723cdf0e10cSrcweir {
724cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
725cdf0e10cSrcweir return sal_False;
726cdf0e10cSrcweir }
727cdf0e10cSrcweir // OSL_ENSURE( nRow <= m_nKnownCount, "don't step into regions you don't know with this method" );
728cdf0e10cSrcweir
729cdf0e10cSrcweir sal_Int32 nLastAppliedPos = m_nLastAppliedPos;
730cdf0e10cSrcweir sal_Bool bAfterLastApplied = m_bAfterLastApplied;
731cdf0e10cSrcweir sal_Bool bAfterLast = m_bAfterLast;
732cdf0e10cSrcweir sal_Int32 nForwardOnly = m_nForwardOnly;
733cdf0e10cSrcweir
734cdf0e10cSrcweir aGuard.clear();
735cdf0e10cSrcweir
736cdf0e10cSrcweir if( bAfterLastApplied || nLastAppliedPos != nRow )
737cdf0e10cSrcweir {
738cdf0e10cSrcweir if( nForwardOnly == 1 )
739cdf0e10cSrcweir {
740cdf0e10cSrcweir if( bAfterLastApplied || bAfterLast || !nRow || nRow < nLastAppliedPos )
741cdf0e10cSrcweir throw SQLException();
742cdf0e10cSrcweir
743cdf0e10cSrcweir sal_Int32 nN = nRow - nLastAppliedPos;
744cdf0e10cSrcweir sal_Int32 nM;
745cdf0e10cSrcweir for( nM = 0; nN--; nM++ )
746cdf0e10cSrcweir {
747cdf0e10cSrcweir if( !m_xResultSetOrigin->next() )
748cdf0e10cSrcweir break;
749cdf0e10cSrcweir }
750cdf0e10cSrcweir
751cdf0e10cSrcweir aGuard.reacquire();
752cdf0e10cSrcweir m_nLastAppliedPos += nM;
753cdf0e10cSrcweir m_bAfterLastApplied = nRow != m_nLastAppliedPos;
754cdf0e10cSrcweir return nRow == m_nLastAppliedPos;
755cdf0e10cSrcweir }
756cdf0e10cSrcweir
757cdf0e10cSrcweir if( !nRow ) //absolute( 0 ) will throw exception
758cdf0e10cSrcweir {
759cdf0e10cSrcweir m_xResultSetOrigin->beforeFirst();
760cdf0e10cSrcweir
761cdf0e10cSrcweir aGuard.reacquire();
762cdf0e10cSrcweir m_nLastAppliedPos = 0;
763cdf0e10cSrcweir m_bAfterLastApplied = sal_False;
764cdf0e10cSrcweir return sal_False;
765cdf0e10cSrcweir }
766cdf0e10cSrcweir try
767cdf0e10cSrcweir {
768cdf0e10cSrcweir //move absolute, if !nLastAppliedPos
769cdf0e10cSrcweir //because move relative would throw exception
770cdf0e10cSrcweir if( !nLastAppliedPos || bAfterLast || bAfterLastApplied )
771cdf0e10cSrcweir {
772cdf0e10cSrcweir sal_Bool bValid = m_xResultSetOrigin->absolute( nRow );
773cdf0e10cSrcweir
774cdf0e10cSrcweir aGuard.reacquire();
775cdf0e10cSrcweir m_nLastAppliedPos = nRow;
776cdf0e10cSrcweir m_bAfterLastApplied = !bValid;
777cdf0e10cSrcweir return bValid;
778cdf0e10cSrcweir }
779cdf0e10cSrcweir else
780cdf0e10cSrcweir {
781cdf0e10cSrcweir sal_Bool bValid = m_xResultSetOrigin->relative( nRow - nLastAppliedPos );
782cdf0e10cSrcweir
783cdf0e10cSrcweir aGuard.reacquire();
784cdf0e10cSrcweir m_nLastAppliedPos += ( nRow - nLastAppliedPos );
785cdf0e10cSrcweir m_bAfterLastApplied = !bValid;
786cdf0e10cSrcweir return bValid;
787cdf0e10cSrcweir }
788cdf0e10cSrcweir }
789cdf0e10cSrcweir catch( SQLException& rEx )
790cdf0e10cSrcweir {
791cdf0e10cSrcweir if( !bAfterLastApplied && !bAfterLast && nRow > nLastAppliedPos && impl_isForwardOnly() )
792cdf0e10cSrcweir {
793cdf0e10cSrcweir sal_Int32 nN = nRow - nLastAppliedPos;
794cdf0e10cSrcweir sal_Int32 nM;
795cdf0e10cSrcweir for( nM = 0; nN--; nM++ )
796cdf0e10cSrcweir {
797cdf0e10cSrcweir if( !m_xResultSetOrigin->next() )
798cdf0e10cSrcweir break;
799cdf0e10cSrcweir }
800cdf0e10cSrcweir
801cdf0e10cSrcweir aGuard.reacquire();
802cdf0e10cSrcweir m_nLastAppliedPos += nM;
803cdf0e10cSrcweir m_bAfterLastApplied = nRow != m_nLastAppliedPos;
804cdf0e10cSrcweir }
805cdf0e10cSrcweir else
806cdf0e10cSrcweir throw rEx;
807cdf0e10cSrcweir }
808cdf0e10cSrcweir
809cdf0e10cSrcweir return nRow == m_nLastAppliedPos;
810cdf0e10cSrcweir }
811cdf0e10cSrcweir return sal_True;
812cdf0e10cSrcweir };
813cdf0e10cSrcweir
814cdf0e10cSrcweir //--------------------------------------------------------------------------
815cdf0e10cSrcweir //--------------------------------------------------------------------------
816cdf0e10cSrcweir //define for fetching data
817cdf0e10cSrcweir //--------------------------------------------------------------------------
818cdf0e10cSrcweir //--------------------------------------------------------------------------
819cdf0e10cSrcweir
820cdf0e10cSrcweir #define FETCH_XXX( aCache, fetchInterface, fetchMethod ) \
821cdf0e10cSrcweir sal_Bool bDirection = !!( \
822cdf0e10cSrcweir nFetchDirection != FetchDirection::REVERSE ); \
823cdf0e10cSrcweir FetchResult aResult = \
824cdf0e10cSrcweir fetchInterface->fetchMethod( nRow, nFetchSize, bDirection ); \
825cdf0e10cSrcweir osl::ClearableGuard< osl::Mutex > aGuard2( m_aMutex ); \
826cdf0e10cSrcweir aCache.loadData( aResult ); \
827cdf0e10cSrcweir sal_Int32 nMax = aCache.getMaxRow(); \
828cdf0e10cSrcweir sal_Int32 nCurCount = m_nKnownCount; \
829cdf0e10cSrcweir sal_Bool bIsFinalCount = aCache.hasKnownLast(); \
830cdf0e10cSrcweir sal_Bool bCurIsFinalCount = m_bFinalCount; \
831cdf0e10cSrcweir aGuard2.clear(); \
832cdf0e10cSrcweir if( nMax > nCurCount ) \
833cdf0e10cSrcweir impl_changeRowCount( nCurCount, nMax ); \
834cdf0e10cSrcweir if( bIsFinalCount && !bCurIsFinalCount ) \
835cdf0e10cSrcweir impl_changeIsRowCountFinal( bCurIsFinalCount, bIsFinalCount );
836cdf0e10cSrcweir
837cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_fetchData(sal_Int32 nRow,sal_Int32 nFetchSize,sal_Int32 nFetchDirection)838cdf0e10cSrcweir ::impl_fetchData( sal_Int32 nRow
839cdf0e10cSrcweir , sal_Int32 nFetchSize, sal_Int32 nFetchDirection )
840cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
841cdf0e10cSrcweir {
842cdf0e10cSrcweir FETCH_XXX( m_aCache, m_xFetchProvider, fetch );
843cdf0e10cSrcweir }
844cdf0e10cSrcweir
845cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_changeRowCount(sal_Int32 nOld,sal_Int32 nNew)846cdf0e10cSrcweir ::impl_changeRowCount( sal_Int32 nOld, sal_Int32 nNew )
847cdf0e10cSrcweir {
848cdf0e10cSrcweir OSL_ENSURE( nNew > nOld, "RowCount only can grow" );
849cdf0e10cSrcweir if( nNew <= nOld )
850cdf0e10cSrcweir return;
851cdf0e10cSrcweir
852cdf0e10cSrcweir //create PropertyChangeEvent and set value
853cdf0e10cSrcweir PropertyChangeEvent aEvt;
854cdf0e10cSrcweir {
855cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
856cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this );
857cdf0e10cSrcweir aEvt.Further = sal_False;
858cdf0e10cSrcweir aEvt.OldValue <<= nOld;
859cdf0e10cSrcweir aEvt.NewValue <<= nNew;
860cdf0e10cSrcweir
861cdf0e10cSrcweir m_nKnownCount = nNew;
862cdf0e10cSrcweir }
863cdf0e10cSrcweir
864cdf0e10cSrcweir //send PropertyChangeEvent to listeners
865cdf0e10cSrcweir impl_notifyPropertyChangeListeners( aEvt );
866cdf0e10cSrcweir }
867cdf0e10cSrcweir
868cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_changeIsRowCountFinal(sal_Bool bOld,sal_Bool bNew)869cdf0e10cSrcweir ::impl_changeIsRowCountFinal( sal_Bool bOld, sal_Bool bNew )
870cdf0e10cSrcweir {
871cdf0e10cSrcweir OSL_ENSURE( !bOld && bNew, "This change is not allowed for IsRowCountFinal" );
872cdf0e10cSrcweir if( ! (!bOld && bNew ) )
873cdf0e10cSrcweir return;
874cdf0e10cSrcweir
875cdf0e10cSrcweir //create PropertyChangeEvent and set value
876cdf0e10cSrcweir PropertyChangeEvent aEvt;
877cdf0e10cSrcweir {
878cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
879cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this );
880cdf0e10cSrcweir aEvt.Further = sal_False;
881cdf0e10cSrcweir aEvt.OldValue <<= bOld;
882cdf0e10cSrcweir aEvt.NewValue <<= bNew;
883cdf0e10cSrcweir
884cdf0e10cSrcweir m_bFinalCount = bNew;
885cdf0e10cSrcweir }
886cdf0e10cSrcweir
887cdf0e10cSrcweir //send PropertyChangeEvent to listeners
888cdf0e10cSrcweir impl_notifyPropertyChangeListeners( aEvt );
889cdf0e10cSrcweir }
890cdf0e10cSrcweir
891cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
impl_isKnownValidPosition(sal_Int32 nRow)892cdf0e10cSrcweir ::impl_isKnownValidPosition( sal_Int32 nRow )
893cdf0e10cSrcweir {
894cdf0e10cSrcweir return m_nKnownCount && nRow
895cdf0e10cSrcweir && nRow <= m_nKnownCount;
896cdf0e10cSrcweir }
897cdf0e10cSrcweir
898cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
impl_isKnownInvalidPosition(sal_Int32 nRow)899cdf0e10cSrcweir ::impl_isKnownInvalidPosition( sal_Int32 nRow )
900cdf0e10cSrcweir {
901cdf0e10cSrcweir if( !nRow )
902cdf0e10cSrcweir return sal_True;
903cdf0e10cSrcweir if( !m_bFinalCount )
904cdf0e10cSrcweir return sal_False;
905cdf0e10cSrcweir return nRow > m_nKnownCount;
906cdf0e10cSrcweir }
907cdf0e10cSrcweir
908cdf0e10cSrcweir
909cdf0e10cSrcweir //virtual
910cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_initPropertySetInfo()911cdf0e10cSrcweir ::impl_initPropertySetInfo()
912cdf0e10cSrcweir {
913cdf0e10cSrcweir ContentResultSetWrapper::impl_initPropertySetInfo();
914cdf0e10cSrcweir
915cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
916cdf0e10cSrcweir if( m_pMyPropSetInfo )
917cdf0e10cSrcweir return;
918cdf0e10cSrcweir m_pMyPropSetInfo = new CCRS_PropertySetInfo( m_xPropertySetInfo );
919cdf0e10cSrcweir m_xMyPropertySetInfo = m_pMyPropSetInfo;
920cdf0e10cSrcweir m_xPropertySetInfo = m_xMyPropertySetInfo;
921cdf0e10cSrcweir }
922cdf0e10cSrcweir
923cdf0e10cSrcweir //--------------------------------------------------------------------------
924cdf0e10cSrcweir // XInterface methods. ( inherited )
925cdf0e10cSrcweir //--------------------------------------------------------------------------
XINTERFACE_COMMON_IMPL(CachedContentResultSet)926cdf0e10cSrcweir XINTERFACE_COMMON_IMPL( CachedContentResultSet )
927cdf0e10cSrcweir
928cdf0e10cSrcweir Any SAL_CALL CachedContentResultSet
929cdf0e10cSrcweir ::queryInterface( const Type& rType )
930cdf0e10cSrcweir throw ( RuntimeException )
931cdf0e10cSrcweir {
932cdf0e10cSrcweir //list all interfaces inclusive baseclasses of interfaces
933cdf0e10cSrcweir
934cdf0e10cSrcweir Any aRet = ContentResultSetWrapper::queryInterface( rType );
935cdf0e10cSrcweir if( aRet.hasValue() )
936cdf0e10cSrcweir return aRet;
937cdf0e10cSrcweir
938cdf0e10cSrcweir aRet = cppu::queryInterface( rType,
939cdf0e10cSrcweir static_cast< XTypeProvider* >( this ),
940cdf0e10cSrcweir static_cast< XServiceInfo* >( this ) );
941cdf0e10cSrcweir
942cdf0e10cSrcweir return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
943cdf0e10cSrcweir }
944cdf0e10cSrcweir
945cdf0e10cSrcweir //--------------------------------------------------------------------------
946cdf0e10cSrcweir // XTypeProvider methods.
947cdf0e10cSrcweir //--------------------------------------------------------------------------
948cdf0e10cSrcweir //list all interfaces exclusive baseclasses
949cdf0e10cSrcweir XTYPEPROVIDER_IMPL_11( CachedContentResultSet
950cdf0e10cSrcweir , XTypeProvider
951cdf0e10cSrcweir , XServiceInfo
952cdf0e10cSrcweir , XComponent
953cdf0e10cSrcweir , XCloseable
954cdf0e10cSrcweir , XResultSetMetaDataSupplier
955cdf0e10cSrcweir , XPropertySet
956cdf0e10cSrcweir
957cdf0e10cSrcweir , XPropertyChangeListener
958cdf0e10cSrcweir , XVetoableChangeListener
959cdf0e10cSrcweir
960cdf0e10cSrcweir , XContentAccess
961cdf0e10cSrcweir
962cdf0e10cSrcweir , XResultSet
963cdf0e10cSrcweir , XRow );
964cdf0e10cSrcweir
965cdf0e10cSrcweir //--------------------------------------------------------------------------
966cdf0e10cSrcweir // XServiceInfo methods.
967cdf0e10cSrcweir //--------------------------------------------------------------------------
968cdf0e10cSrcweir
969cdf0e10cSrcweir XSERVICEINFO_NOFACTORY_IMPL_1( CachedContentResultSet,
970cdf0e10cSrcweir OUString::createFromAscii(
971cdf0e10cSrcweir "com.sun.star.comp.ucb.CachedContentResultSet" ),
972cdf0e10cSrcweir OUString::createFromAscii(
973cdf0e10cSrcweir CACHED_CONTENT_RESULTSET_SERVICE_NAME ) );
974cdf0e10cSrcweir
975cdf0e10cSrcweir //--------------------------------------------------------------------------
976cdf0e10cSrcweir // XPropertySet methods. ( inherited )
977cdf0e10cSrcweir //--------------------------------------------------------------------------
978cdf0e10cSrcweir
979cdf0e10cSrcweir // virtual
980cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
setPropertyValue(const OUString & aPropertyName,const Any & aValue)981cdf0e10cSrcweir ::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
982cdf0e10cSrcweir throw( UnknownPropertyException,
983cdf0e10cSrcweir PropertyVetoException,
984cdf0e10cSrcweir IllegalArgumentException,
985cdf0e10cSrcweir WrappedTargetException,
986cdf0e10cSrcweir RuntimeException )
987cdf0e10cSrcweir {
988cdf0e10cSrcweir impl_EnsureNotDisposed();
989cdf0e10cSrcweir
990cdf0e10cSrcweir if( !getPropertySetInfo().is() )
991cdf0e10cSrcweir {
992cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
993cdf0e10cSrcweir throw UnknownPropertyException();
994cdf0e10cSrcweir }
995cdf0e10cSrcweir
996cdf0e10cSrcweir Property aProp = m_pMyPropSetInfo->getPropertyByName( aPropertyName );
997cdf0e10cSrcweir //throws UnknownPropertyException, if so
998cdf0e10cSrcweir
999cdf0e10cSrcweir if( aProp.Attributes & PropertyAttribute::READONLY )
1000cdf0e10cSrcweir {
1001cdf0e10cSrcweir //It is assumed, that the properties
1002cdf0e10cSrcweir //'RowCount' and 'IsRowCountFinal' are readonly!
1003cdf0e10cSrcweir throw IllegalArgumentException();
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir if( aProp.Name == CCRS_PropertySetInfo
1006cdf0e10cSrcweir ::m_aPropertyNameForFetchDirection )
1007cdf0e10cSrcweir {
1008cdf0e10cSrcweir //check value
1009cdf0e10cSrcweir sal_Int32 nNew;
1010cdf0e10cSrcweir if( !( aValue >>= nNew ) )
1011cdf0e10cSrcweir {
1012cdf0e10cSrcweir throw IllegalArgumentException();
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir
1015cdf0e10cSrcweir if( nNew == FetchDirection::UNKNOWN )
1016cdf0e10cSrcweir {
1017cdf0e10cSrcweir nNew = COMSUNSTARUCBCCRS_DEFAULT_FETCH_DIRECTION;
1018cdf0e10cSrcweir }
1019cdf0e10cSrcweir else if( !( nNew == FetchDirection::FORWARD
1020cdf0e10cSrcweir || nNew == FetchDirection::REVERSE ) )
1021cdf0e10cSrcweir {
1022cdf0e10cSrcweir throw IllegalArgumentException();
1023cdf0e10cSrcweir }
1024cdf0e10cSrcweir
1025cdf0e10cSrcweir //create PropertyChangeEvent and set value
1026cdf0e10cSrcweir PropertyChangeEvent aEvt;
1027cdf0e10cSrcweir {
1028cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1029cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this );
1030cdf0e10cSrcweir aEvt.PropertyName = aPropertyName;
1031cdf0e10cSrcweir aEvt.Further = sal_False;
1032cdf0e10cSrcweir aEvt.PropertyHandle = m_pMyPropSetInfo->
1033cdf0e10cSrcweir m_nFetchDirectionPropertyHandle;
1034cdf0e10cSrcweir aEvt.OldValue <<= m_nFetchDirection;
1035cdf0e10cSrcweir aEvt.NewValue <<= nNew;
1036cdf0e10cSrcweir
1037cdf0e10cSrcweir m_nFetchDirection = nNew;
1038cdf0e10cSrcweir }
1039cdf0e10cSrcweir
1040cdf0e10cSrcweir //send PropertyChangeEvent to listeners
1041cdf0e10cSrcweir impl_notifyPropertyChangeListeners( aEvt );
1042cdf0e10cSrcweir }
1043cdf0e10cSrcweir else if( aProp.Name == CCRS_PropertySetInfo
1044cdf0e10cSrcweir ::m_aPropertyNameForFetchSize )
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir //check value
1047cdf0e10cSrcweir sal_Int32 nNew;
1048cdf0e10cSrcweir if( !( aValue >>= nNew ) )
1049cdf0e10cSrcweir {
1050cdf0e10cSrcweir throw IllegalArgumentException();
1051cdf0e10cSrcweir }
1052cdf0e10cSrcweir
1053cdf0e10cSrcweir if( nNew < 0 )
1054cdf0e10cSrcweir {
1055cdf0e10cSrcweir nNew = COMSUNSTARUCBCCRS_DEFAULT_FETCH_SIZE;
1056cdf0e10cSrcweir }
1057cdf0e10cSrcweir
1058cdf0e10cSrcweir //create PropertyChangeEvent and set value
1059cdf0e10cSrcweir PropertyChangeEvent aEvt;
1060cdf0e10cSrcweir {
1061cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1062cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this );
1063cdf0e10cSrcweir aEvt.PropertyName = aPropertyName;
1064cdf0e10cSrcweir aEvt.Further = sal_False;
1065cdf0e10cSrcweir aEvt.PropertyHandle = m_pMyPropSetInfo->
1066cdf0e10cSrcweir m_nFetchSizePropertyHandle;
1067cdf0e10cSrcweir aEvt.OldValue <<= m_nFetchSize;
1068cdf0e10cSrcweir aEvt.NewValue <<= nNew;
1069cdf0e10cSrcweir
1070cdf0e10cSrcweir m_nFetchSize = nNew;
1071cdf0e10cSrcweir }
1072cdf0e10cSrcweir
1073cdf0e10cSrcweir //send PropertyChangeEvent to listeners
1074cdf0e10cSrcweir impl_notifyPropertyChangeListeners( aEvt );
1075cdf0e10cSrcweir }
1076cdf0e10cSrcweir else
1077cdf0e10cSrcweir {
1078cdf0e10cSrcweir impl_init_xPropertySetOrigin();
1079cdf0e10cSrcweir {
1080cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1081cdf0e10cSrcweir if( !m_xPropertySetOrigin.is() )
1082cdf0e10cSrcweir {
1083cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1084cdf0e10cSrcweir return;
1085cdf0e10cSrcweir }
1086cdf0e10cSrcweir }
1087cdf0e10cSrcweir m_xPropertySetOrigin->setPropertyValue( aPropertyName, aValue );
1088cdf0e10cSrcweir }
1089cdf0e10cSrcweir }
1090cdf0e10cSrcweir
1091cdf0e10cSrcweir //--------------------------------------------------------------------------
1092cdf0e10cSrcweir // virtual
1093cdf0e10cSrcweir Any SAL_CALL CachedContentResultSet
getPropertyValue(const OUString & rPropertyName)1094cdf0e10cSrcweir ::getPropertyValue( const OUString& rPropertyName )
1095cdf0e10cSrcweir throw( UnknownPropertyException,
1096cdf0e10cSrcweir WrappedTargetException,
1097cdf0e10cSrcweir RuntimeException )
1098cdf0e10cSrcweir {
1099cdf0e10cSrcweir impl_EnsureNotDisposed();
1100cdf0e10cSrcweir
1101cdf0e10cSrcweir if( !getPropertySetInfo().is() )
1102cdf0e10cSrcweir {
1103cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1104cdf0e10cSrcweir throw UnknownPropertyException();
1105cdf0e10cSrcweir }
1106cdf0e10cSrcweir
1107cdf0e10cSrcweir Property aProp = m_pMyPropSetInfo->getPropertyByName( rPropertyName );
1108cdf0e10cSrcweir //throws UnknownPropertyException, if so
1109cdf0e10cSrcweir
1110cdf0e10cSrcweir Any aValue;
1111cdf0e10cSrcweir if( rPropertyName == CCRS_PropertySetInfo
1112cdf0e10cSrcweir ::m_aPropertyNameForCount )
1113cdf0e10cSrcweir {
1114cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1115cdf0e10cSrcweir aValue <<= m_nKnownCount;
1116cdf0e10cSrcweir }
1117cdf0e10cSrcweir else if( rPropertyName == CCRS_PropertySetInfo
1118cdf0e10cSrcweir ::m_aPropertyNameForFinalCount )
1119cdf0e10cSrcweir {
1120cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1121cdf0e10cSrcweir aValue <<= m_bFinalCount;
1122cdf0e10cSrcweir }
1123cdf0e10cSrcweir else if( rPropertyName == CCRS_PropertySetInfo
1124cdf0e10cSrcweir ::m_aPropertyNameForFetchSize )
1125cdf0e10cSrcweir {
1126cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1127cdf0e10cSrcweir aValue <<= m_nFetchSize;
1128cdf0e10cSrcweir }
1129cdf0e10cSrcweir else if( rPropertyName == CCRS_PropertySetInfo
1130cdf0e10cSrcweir ::m_aPropertyNameForFetchDirection )
1131cdf0e10cSrcweir {
1132cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1133cdf0e10cSrcweir aValue <<= m_nFetchDirection;
1134cdf0e10cSrcweir }
1135cdf0e10cSrcweir else
1136cdf0e10cSrcweir {
1137cdf0e10cSrcweir impl_init_xPropertySetOrigin();
1138cdf0e10cSrcweir {
1139cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1140cdf0e10cSrcweir if( !m_xPropertySetOrigin.is() )
1141cdf0e10cSrcweir {
1142cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1143cdf0e10cSrcweir throw UnknownPropertyException();
1144cdf0e10cSrcweir }
1145cdf0e10cSrcweir }
1146cdf0e10cSrcweir aValue = m_xPropertySetOrigin->getPropertyValue( rPropertyName );
1147cdf0e10cSrcweir }
1148cdf0e10cSrcweir return aValue;
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir
1151cdf0e10cSrcweir //--------------------------------------------------------------------------
1152cdf0e10cSrcweir // own methods. ( inherited )
1153cdf0e10cSrcweir //--------------------------------------------------------------------------
1154cdf0e10cSrcweir
1155cdf0e10cSrcweir //virtual
1156cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_disposing(const EventObject & rEventObject)1157cdf0e10cSrcweir ::impl_disposing( const EventObject& rEventObject )
1158cdf0e10cSrcweir throw( RuntimeException )
1159cdf0e10cSrcweir {
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir impl_EnsureNotDisposed();
1162cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1163cdf0e10cSrcweir //release all references to the broadcaster:
1164cdf0e10cSrcweir m_xFetchProvider.clear();
1165cdf0e10cSrcweir m_xFetchProviderForContentAccess.clear();
1166cdf0e10cSrcweir }
1167cdf0e10cSrcweir ContentResultSetWrapper::impl_disposing( rEventObject );
1168cdf0e10cSrcweir }
1169cdf0e10cSrcweir
1170cdf0e10cSrcweir //virtual
1171cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_propertyChange(const PropertyChangeEvent & rEvt)1172cdf0e10cSrcweir ::impl_propertyChange( const PropertyChangeEvent& rEvt )
1173cdf0e10cSrcweir throw( RuntimeException )
1174cdf0e10cSrcweir {
1175cdf0e10cSrcweir impl_EnsureNotDisposed();
1176cdf0e10cSrcweir
1177cdf0e10cSrcweir PropertyChangeEvent aEvt( rEvt );
1178cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this );
1179cdf0e10cSrcweir aEvt.Further = sal_False;
1180cdf0e10cSrcweir //---------
1181cdf0e10cSrcweir
1182cdf0e10cSrcweir if( CCRS_PropertySetInfo
1183cdf0e10cSrcweir ::impl_isMyPropertyName( rEvt.PropertyName ) )
1184cdf0e10cSrcweir {
1185cdf0e10cSrcweir //don't notify foreign events on fetchsize and fetchdirection
1186cdf0e10cSrcweir if( aEvt.PropertyName == CCRS_PropertySetInfo
1187cdf0e10cSrcweir ::m_aPropertyNameForFetchSize
1188cdf0e10cSrcweir || aEvt.PropertyName == CCRS_PropertySetInfo
1189cdf0e10cSrcweir ::m_aPropertyNameForFetchDirection )
1190cdf0e10cSrcweir return;
1191cdf0e10cSrcweir
1192cdf0e10cSrcweir //adjust my props 'RowCount' and 'IsRowCountFinal'
1193cdf0e10cSrcweir if( aEvt.PropertyName == CCRS_PropertySetInfo
1194cdf0e10cSrcweir ::m_aPropertyNameForCount )
1195cdf0e10cSrcweir {//RowCount changed
1196cdf0e10cSrcweir
1197cdf0e10cSrcweir //check value
1198cdf0e10cSrcweir sal_Int32 nNew = 0;
1199cdf0e10cSrcweir if( !( aEvt.NewValue >>= nNew ) )
1200cdf0e10cSrcweir {
1201cdf0e10cSrcweir OSL_ENSURE( sal_False, "PropertyChangeEvent contains wrong data" );
1202cdf0e10cSrcweir return;
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir
1205cdf0e10cSrcweir impl_changeRowCount( m_nKnownCount, nNew );
1206cdf0e10cSrcweir }
1207cdf0e10cSrcweir else if( aEvt.PropertyName == CCRS_PropertySetInfo
1208cdf0e10cSrcweir ::m_aPropertyNameForFinalCount )
1209cdf0e10cSrcweir {//IsRowCountFinal changed
1210cdf0e10cSrcweir
1211cdf0e10cSrcweir //check value
1212cdf0e10cSrcweir sal_Bool bNew = sal_False;
1213cdf0e10cSrcweir if( !( aEvt.NewValue >>= bNew ) )
1214cdf0e10cSrcweir {
1215cdf0e10cSrcweir OSL_ENSURE( sal_False, "PropertyChangeEvent contains wrong data" );
1216cdf0e10cSrcweir return;
1217cdf0e10cSrcweir }
1218cdf0e10cSrcweir impl_changeIsRowCountFinal( m_bFinalCount, bNew );
1219cdf0e10cSrcweir }
1220cdf0e10cSrcweir return;
1221cdf0e10cSrcweir }
1222cdf0e10cSrcweir
1223cdf0e10cSrcweir //-----------
1224cdf0e10cSrcweir impl_notifyPropertyChangeListeners( aEvt );
1225cdf0e10cSrcweir }
1226cdf0e10cSrcweir
1227cdf0e10cSrcweir
1228cdf0e10cSrcweir //virtual
1229cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
impl_vetoableChange(const PropertyChangeEvent & rEvt)1230cdf0e10cSrcweir ::impl_vetoableChange( const PropertyChangeEvent& rEvt )
1231cdf0e10cSrcweir throw( PropertyVetoException,
1232cdf0e10cSrcweir RuntimeException )
1233cdf0e10cSrcweir {
1234cdf0e10cSrcweir impl_EnsureNotDisposed();
1235cdf0e10cSrcweir
1236cdf0e10cSrcweir //don't notify events on my properties, cause they are not vetoable
1237cdf0e10cSrcweir if( CCRS_PropertySetInfo
1238cdf0e10cSrcweir ::impl_isMyPropertyName( rEvt.PropertyName ) )
1239cdf0e10cSrcweir {
1240cdf0e10cSrcweir return;
1241cdf0e10cSrcweir }
1242cdf0e10cSrcweir
1243cdf0e10cSrcweir
1244cdf0e10cSrcweir PropertyChangeEvent aEvt( rEvt );
1245cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this );
1246cdf0e10cSrcweir aEvt.Further = sal_False;
1247cdf0e10cSrcweir
1248cdf0e10cSrcweir impl_notifyVetoableChangeListeners( aEvt );
1249cdf0e10cSrcweir }
1250cdf0e10cSrcweir
1251cdf0e10cSrcweir //--------------------------------------------------------------------------
1252cdf0e10cSrcweir // XContentAccess methods. ( inherited ) ( -- position dependent )
1253cdf0e10cSrcweir //--------------------------------------------------------------------------
1254cdf0e10cSrcweir
1255cdf0e10cSrcweir #define XCONTENTACCESS_queryXXX( queryXXX, XXX, TYPE ) \
1256cdf0e10cSrcweir impl_EnsureNotDisposed(); \
1257cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex ); \
1258cdf0e10cSrcweir sal_Int32 nRow = m_nRow; \
1259cdf0e10cSrcweir sal_Int32 nFetchSize = m_nFetchSize; \
1260cdf0e10cSrcweir sal_Int32 nFetchDirection = m_nFetchDirection; \
1261cdf0e10cSrcweir if( !m_aCache##XXX.hasRow( nRow ) ) \
1262cdf0e10cSrcweir { \
1263cdf0e10cSrcweir if( !m_aCache##XXX.hasCausedException( nRow ) ) \
1264cdf0e10cSrcweir { \
1265cdf0e10cSrcweir if( !m_xFetchProviderForContentAccess.is() ) \
1266cdf0e10cSrcweir { \
1267cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );\
1268cdf0e10cSrcweir throw RuntimeException(); \
1269cdf0e10cSrcweir } \
1270cdf0e10cSrcweir aGuard.clear(); \
1271cdf0e10cSrcweir if( impl_isForwardOnly() ) \
1272cdf0e10cSrcweir applyPositionToOrigin( nRow ); \
1273cdf0e10cSrcweir \
1274cdf0e10cSrcweir FETCH_XXX( m_aCache##XXX, m_xFetchProviderForContentAccess, fetch##XXX##s ); \
1275cdf0e10cSrcweir } \
1276cdf0e10cSrcweir aGuard.reacquire(); \
1277cdf0e10cSrcweir if( !m_aCache##XXX.hasRow( nRow ) ) \
1278cdf0e10cSrcweir { \
1279cdf0e10cSrcweir aGuard.clear(); \
1280cdf0e10cSrcweir applyPositionToOrigin( nRow ); \
1281cdf0e10cSrcweir TYPE aRet = ContentResultSetWrapper::queryXXX(); \
1282cdf0e10cSrcweir if( m_xContentIdentifierMapping.is() ) \
1283cdf0e10cSrcweir return m_xContentIdentifierMapping->map##XXX( aRet );\
1284cdf0e10cSrcweir return aRet; \
1285cdf0e10cSrcweir } \
1286cdf0e10cSrcweir } \
1287cdf0e10cSrcweir return m_aCache##XXX.get##XXX( nRow );
1288cdf0e10cSrcweir
1289cdf0e10cSrcweir //--------------------------------------------------------------------------
1290cdf0e10cSrcweir // virtual
1291cdf0e10cSrcweir OUString SAL_CALL CachedContentResultSet
queryContentIdentifierString()1292cdf0e10cSrcweir ::queryContentIdentifierString()
1293cdf0e10cSrcweir throw( RuntimeException )
1294cdf0e10cSrcweir {
1295cdf0e10cSrcweir XCONTENTACCESS_queryXXX( queryContentIdentifierString, ContentIdentifierString, OUString )
1296cdf0e10cSrcweir }
1297cdf0e10cSrcweir
1298cdf0e10cSrcweir //--------------------------------------------------------------------------
1299cdf0e10cSrcweir // virtual
1300cdf0e10cSrcweir Reference< XContentIdentifier > SAL_CALL CachedContentResultSet
queryContentIdentifier()1301cdf0e10cSrcweir ::queryContentIdentifier()
1302cdf0e10cSrcweir throw( RuntimeException )
1303cdf0e10cSrcweir {
1304cdf0e10cSrcweir XCONTENTACCESS_queryXXX( queryContentIdentifier, ContentIdentifier, Reference< XContentIdentifier > )
1305cdf0e10cSrcweir }
1306cdf0e10cSrcweir
1307cdf0e10cSrcweir //--------------------------------------------------------------------------
1308cdf0e10cSrcweir // virtual
1309cdf0e10cSrcweir Reference< XContent > SAL_CALL CachedContentResultSet
queryContent()1310cdf0e10cSrcweir ::queryContent()
1311cdf0e10cSrcweir throw( RuntimeException )
1312cdf0e10cSrcweir {
1313cdf0e10cSrcweir XCONTENTACCESS_queryXXX( queryContent, Content, Reference< XContent > )
1314cdf0e10cSrcweir }
1315cdf0e10cSrcweir
1316cdf0e10cSrcweir //-----------------------------------------------------------------
1317cdf0e10cSrcweir // XResultSet methods. ( inherited )
1318cdf0e10cSrcweir //-----------------------------------------------------------------
1319cdf0e10cSrcweir //virtual
1320cdf0e10cSrcweir
1321cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
next()1322cdf0e10cSrcweir ::next()
1323cdf0e10cSrcweir throw( SQLException,
1324cdf0e10cSrcweir RuntimeException )
1325cdf0e10cSrcweir {
1326cdf0e10cSrcweir impl_EnsureNotDisposed();
1327cdf0e10cSrcweir
1328cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1329cdf0e10cSrcweir //after last
1330cdf0e10cSrcweir if( m_bAfterLast )
1331cdf0e10cSrcweir return sal_False;
1332cdf0e10cSrcweir //last
1333cdf0e10cSrcweir aGuard.clear();
1334cdf0e10cSrcweir if( isLast() )
1335cdf0e10cSrcweir {
1336cdf0e10cSrcweir aGuard.reacquire();
1337cdf0e10cSrcweir m_nRow++;
1338cdf0e10cSrcweir m_bAfterLast = sal_True;
1339cdf0e10cSrcweir return sal_False;
1340cdf0e10cSrcweir }
1341cdf0e10cSrcweir aGuard.reacquire();
1342cdf0e10cSrcweir //known valid position
1343cdf0e10cSrcweir if( impl_isKnownValidPosition( m_nRow + 1 ) )
1344cdf0e10cSrcweir {
1345cdf0e10cSrcweir m_nRow++;
1346cdf0e10cSrcweir return sal_True;
1347cdf0e10cSrcweir }
1348cdf0e10cSrcweir
1349cdf0e10cSrcweir //unknown position
1350cdf0e10cSrcweir sal_Int32 nRow = m_nRow;
1351cdf0e10cSrcweir aGuard.clear();
1352cdf0e10cSrcweir
1353cdf0e10cSrcweir sal_Bool bValid = applyPositionToOrigin( nRow + 1 );
1354cdf0e10cSrcweir
1355cdf0e10cSrcweir aGuard.reacquire();
1356cdf0e10cSrcweir m_nRow = nRow + 1;
1357cdf0e10cSrcweir m_bAfterLast = !bValid;
1358cdf0e10cSrcweir return bValid;
1359cdf0e10cSrcweir }
1360cdf0e10cSrcweir
1361cdf0e10cSrcweir //virtual
1362cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
previous()1363cdf0e10cSrcweir ::previous()
1364cdf0e10cSrcweir throw( SQLException,
1365cdf0e10cSrcweir RuntimeException )
1366cdf0e10cSrcweir {
1367cdf0e10cSrcweir impl_EnsureNotDisposed();
1368cdf0e10cSrcweir
1369cdf0e10cSrcweir if( impl_isForwardOnly() )
1370cdf0e10cSrcweir throw SQLException();
1371cdf0e10cSrcweir
1372cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1373cdf0e10cSrcweir //before first ?:
1374cdf0e10cSrcweir if( !m_bAfterLast && !m_nRow )
1375cdf0e10cSrcweir return sal_False;
1376cdf0e10cSrcweir //first ?:
1377cdf0e10cSrcweir if( !m_bAfterLast && m_nKnownCount && m_nRow == 1 )
1378cdf0e10cSrcweir {
1379cdf0e10cSrcweir m_nRow--;
1380cdf0e10cSrcweir m_bAfterLast = sal_False;
1381cdf0e10cSrcweir return sal_False;
1382cdf0e10cSrcweir }
1383cdf0e10cSrcweir //known valid position ?:
1384cdf0e10cSrcweir if( impl_isKnownValidPosition( m_nRow - 1 ) )
1385cdf0e10cSrcweir {
1386cdf0e10cSrcweir m_nRow--;
1387cdf0e10cSrcweir m_bAfterLast = sal_False;
1388cdf0e10cSrcweir return sal_True;
1389cdf0e10cSrcweir }
1390cdf0e10cSrcweir //unknown position:
1391cdf0e10cSrcweir sal_Int32 nRow = m_nRow;
1392cdf0e10cSrcweir aGuard.clear();
1393cdf0e10cSrcweir
1394cdf0e10cSrcweir sal_Bool bValid = applyPositionToOrigin( nRow - 1 );
1395cdf0e10cSrcweir
1396cdf0e10cSrcweir aGuard.reacquire();
1397cdf0e10cSrcweir m_nRow = nRow - 1;
1398cdf0e10cSrcweir m_bAfterLast = sal_False;
1399cdf0e10cSrcweir return bValid;
1400cdf0e10cSrcweir }
1401cdf0e10cSrcweir
1402cdf0e10cSrcweir //virtual
1403cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
absolute(sal_Int32 row)1404cdf0e10cSrcweir ::absolute( sal_Int32 row )
1405cdf0e10cSrcweir throw( SQLException,
1406cdf0e10cSrcweir RuntimeException )
1407cdf0e10cSrcweir {
1408cdf0e10cSrcweir impl_EnsureNotDisposed();
1409cdf0e10cSrcweir
1410cdf0e10cSrcweir if( !row )
1411cdf0e10cSrcweir throw SQLException();
1412cdf0e10cSrcweir
1413cdf0e10cSrcweir if( impl_isForwardOnly() )
1414cdf0e10cSrcweir throw SQLException();
1415cdf0e10cSrcweir
1416cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1417cdf0e10cSrcweir
1418cdf0e10cSrcweir if( !m_xResultSetOrigin.is() )
1419cdf0e10cSrcweir {
1420cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1421cdf0e10cSrcweir return sal_False;
1422cdf0e10cSrcweir }
1423cdf0e10cSrcweir if( row < 0 )
1424cdf0e10cSrcweir {
1425cdf0e10cSrcweir if( m_bFinalCount )
1426cdf0e10cSrcweir {
1427cdf0e10cSrcweir sal_Int32 nNewRow = m_nKnownCount + 1 + row;
1428cdf0e10cSrcweir sal_Bool bValid = sal_True;
1429cdf0e10cSrcweir if( nNewRow <= 0 )
1430cdf0e10cSrcweir {
1431cdf0e10cSrcweir nNewRow = 0;
1432cdf0e10cSrcweir bValid = sal_False;
1433cdf0e10cSrcweir }
1434cdf0e10cSrcweir m_nRow = nNewRow;
1435cdf0e10cSrcweir m_bAfterLast = sal_False;
1436cdf0e10cSrcweir return bValid;
1437cdf0e10cSrcweir }
1438cdf0e10cSrcweir //unknown final count:
1439cdf0e10cSrcweir aGuard.clear();
1440cdf0e10cSrcweir
1441cdf0e10cSrcweir // Solaris has problems catching or propagating derived exceptions
1442cdf0e10cSrcweir // when only the base class is known, so make ResultSetException
1443cdf0e10cSrcweir // (derived from SQLException) known here:
1444cdf0e10cSrcweir sal_Bool bValid;
1445cdf0e10cSrcweir try
1446cdf0e10cSrcweir {
1447cdf0e10cSrcweir bValid = m_xResultSetOrigin->absolute( row );
1448cdf0e10cSrcweir }
1449cdf0e10cSrcweir catch (ResultSetException &)
1450cdf0e10cSrcweir {
1451cdf0e10cSrcweir throw;
1452cdf0e10cSrcweir }
1453cdf0e10cSrcweir
1454cdf0e10cSrcweir aGuard.reacquire();
1455cdf0e10cSrcweir if( m_bFinalCount )
1456cdf0e10cSrcweir {
1457cdf0e10cSrcweir sal_Int32 nNewRow = m_nKnownCount + 1 + row;
1458cdf0e10cSrcweir if( nNewRow < 0 )
1459cdf0e10cSrcweir nNewRow = 0;
1460cdf0e10cSrcweir m_nLastAppliedPos = nNewRow;
1461cdf0e10cSrcweir m_nRow = nNewRow;
1462cdf0e10cSrcweir m_bAfterLastApplied = m_bAfterLast = sal_False;
1463cdf0e10cSrcweir return bValid;
1464cdf0e10cSrcweir }
1465cdf0e10cSrcweir aGuard.clear();
1466cdf0e10cSrcweir
1467cdf0e10cSrcweir sal_Int32 nCurRow = m_xResultSetOrigin->getRow();
1468cdf0e10cSrcweir
1469cdf0e10cSrcweir aGuard.reacquire();
1470cdf0e10cSrcweir m_nLastAppliedPos = nCurRow;
1471cdf0e10cSrcweir m_nRow = nCurRow;
1472cdf0e10cSrcweir m_bAfterLast = sal_False;
1473cdf0e10cSrcweir return nCurRow != 0;
1474cdf0e10cSrcweir }
1475cdf0e10cSrcweir //row > 0:
1476cdf0e10cSrcweir if( m_bFinalCount )
1477cdf0e10cSrcweir {
1478cdf0e10cSrcweir if( row > m_nKnownCount )
1479cdf0e10cSrcweir {
1480cdf0e10cSrcweir m_nRow = m_nKnownCount + 1;
1481cdf0e10cSrcweir m_bAfterLast = sal_True;
1482cdf0e10cSrcweir return sal_False;
1483cdf0e10cSrcweir }
1484cdf0e10cSrcweir m_nRow = row;
1485cdf0e10cSrcweir m_bAfterLast = sal_False;
1486cdf0e10cSrcweir return sal_True;
1487cdf0e10cSrcweir }
1488cdf0e10cSrcweir //unknown new position:
1489cdf0e10cSrcweir aGuard.clear();
1490cdf0e10cSrcweir
1491cdf0e10cSrcweir sal_Bool bValid = m_xResultSetOrigin->absolute( row );
1492cdf0e10cSrcweir
1493cdf0e10cSrcweir aGuard.reacquire();
1494cdf0e10cSrcweir if( m_bFinalCount )
1495cdf0e10cSrcweir {
1496cdf0e10cSrcweir sal_Int32 nNewRow = row;
1497cdf0e10cSrcweir if( nNewRow > m_nKnownCount )
1498cdf0e10cSrcweir {
1499cdf0e10cSrcweir nNewRow = m_nKnownCount + 1;
1500cdf0e10cSrcweir m_bAfterLastApplied = m_bAfterLast = sal_True;
1501cdf0e10cSrcweir }
1502cdf0e10cSrcweir else
1503cdf0e10cSrcweir m_bAfterLastApplied = m_bAfterLast = sal_False;
1504cdf0e10cSrcweir
1505cdf0e10cSrcweir m_nLastAppliedPos = nNewRow;
1506cdf0e10cSrcweir m_nRow = nNewRow;
1507cdf0e10cSrcweir return bValid;
1508cdf0e10cSrcweir }
1509cdf0e10cSrcweir aGuard.clear();
1510cdf0e10cSrcweir
1511cdf0e10cSrcweir sal_Int32 nCurRow = m_xResultSetOrigin->getRow();
1512cdf0e10cSrcweir sal_Bool bIsAfterLast = m_xResultSetOrigin->isAfterLast();
1513cdf0e10cSrcweir
1514cdf0e10cSrcweir aGuard.reacquire();
1515cdf0e10cSrcweir m_nLastAppliedPos = nCurRow;
1516cdf0e10cSrcweir m_nRow = nCurRow;
1517cdf0e10cSrcweir m_bAfterLastApplied = m_bAfterLast = bIsAfterLast;
1518cdf0e10cSrcweir return nCurRow && !bIsAfterLast;
1519cdf0e10cSrcweir }
1520cdf0e10cSrcweir
1521cdf0e10cSrcweir //virtual
1522cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
relative(sal_Int32 rows)1523cdf0e10cSrcweir ::relative( sal_Int32 rows )
1524cdf0e10cSrcweir throw( SQLException,
1525cdf0e10cSrcweir RuntimeException )
1526cdf0e10cSrcweir {
1527cdf0e10cSrcweir impl_EnsureNotDisposed();
1528cdf0e10cSrcweir
1529cdf0e10cSrcweir if( impl_isForwardOnly() )
1530cdf0e10cSrcweir throw SQLException();
1531cdf0e10cSrcweir
1532cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1533cdf0e10cSrcweir if( m_bAfterLast || impl_isKnownInvalidPosition( m_nRow ) )
1534cdf0e10cSrcweir throw SQLException();
1535cdf0e10cSrcweir
1536cdf0e10cSrcweir if( !rows )
1537cdf0e10cSrcweir return sal_True;
1538cdf0e10cSrcweir
1539cdf0e10cSrcweir sal_Int32 nNewRow = m_nRow + rows;
1540cdf0e10cSrcweir if( nNewRow < 0 )
1541cdf0e10cSrcweir nNewRow = 0;
1542cdf0e10cSrcweir
1543cdf0e10cSrcweir if( impl_isKnownValidPosition( nNewRow ) )
1544cdf0e10cSrcweir {
1545cdf0e10cSrcweir m_nRow = nNewRow;
1546cdf0e10cSrcweir m_bAfterLast = sal_False;
1547cdf0e10cSrcweir return sal_True;
1548cdf0e10cSrcweir }
1549cdf0e10cSrcweir else
1550cdf0e10cSrcweir {
1551cdf0e10cSrcweir //known invalid new position:
1552cdf0e10cSrcweir if( nNewRow == 0 )
1553cdf0e10cSrcweir {
1554cdf0e10cSrcweir m_bAfterLast = sal_False;
1555cdf0e10cSrcweir m_nRow = 0;
1556cdf0e10cSrcweir return sal_False;
1557cdf0e10cSrcweir }
1558cdf0e10cSrcweir if( m_bFinalCount && nNewRow > m_nKnownCount )
1559cdf0e10cSrcweir {
1560cdf0e10cSrcweir m_bAfterLast = sal_True;
1561cdf0e10cSrcweir m_nRow = m_nKnownCount + 1;
1562cdf0e10cSrcweir return sal_False;
1563cdf0e10cSrcweir }
1564cdf0e10cSrcweir //unknown new position:
1565cdf0e10cSrcweir aGuard.clear();
1566cdf0e10cSrcweir sal_Bool bValid = applyPositionToOrigin( nNewRow );
1567cdf0e10cSrcweir
1568cdf0e10cSrcweir aGuard.reacquire();
1569cdf0e10cSrcweir m_nRow = nNewRow;
1570cdf0e10cSrcweir m_bAfterLast = !bValid && nNewRow > 0;
1571cdf0e10cSrcweir return bValid;
1572cdf0e10cSrcweir }
1573cdf0e10cSrcweir }
1574cdf0e10cSrcweir
1575cdf0e10cSrcweir
1576cdf0e10cSrcweir //virtual
1577cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
first()1578cdf0e10cSrcweir ::first()
1579cdf0e10cSrcweir throw( SQLException,
1580cdf0e10cSrcweir RuntimeException )
1581cdf0e10cSrcweir {
1582cdf0e10cSrcweir impl_EnsureNotDisposed();
1583cdf0e10cSrcweir
1584cdf0e10cSrcweir if( impl_isForwardOnly() )
1585cdf0e10cSrcweir throw SQLException();
1586cdf0e10cSrcweir
1587cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1588cdf0e10cSrcweir if( impl_isKnownValidPosition( 1 ) )
1589cdf0e10cSrcweir {
1590cdf0e10cSrcweir m_nRow = 1;
1591cdf0e10cSrcweir m_bAfterLast = sal_False;
1592cdf0e10cSrcweir return sal_True;
1593cdf0e10cSrcweir }
1594cdf0e10cSrcweir if( impl_isKnownInvalidPosition( 1 ) )
1595cdf0e10cSrcweir {
1596cdf0e10cSrcweir m_nRow = 1;
1597cdf0e10cSrcweir m_bAfterLast = sal_False;
1598cdf0e10cSrcweir return sal_False;
1599cdf0e10cSrcweir }
1600cdf0e10cSrcweir //unknown position
1601cdf0e10cSrcweir aGuard.clear();
1602cdf0e10cSrcweir
1603cdf0e10cSrcweir sal_Bool bValid = applyPositionToOrigin( 1 );
1604cdf0e10cSrcweir
1605cdf0e10cSrcweir aGuard.reacquire();
1606cdf0e10cSrcweir m_nRow = 1;
1607cdf0e10cSrcweir m_bAfterLast = sal_False;
1608cdf0e10cSrcweir return bValid;
1609cdf0e10cSrcweir }
1610cdf0e10cSrcweir
1611cdf0e10cSrcweir //virtual
1612cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
last()1613cdf0e10cSrcweir ::last()
1614cdf0e10cSrcweir throw( SQLException,
1615cdf0e10cSrcweir RuntimeException )
1616cdf0e10cSrcweir {
1617cdf0e10cSrcweir impl_EnsureNotDisposed();
1618cdf0e10cSrcweir
1619cdf0e10cSrcweir if( impl_isForwardOnly() )
1620cdf0e10cSrcweir throw SQLException();
1621cdf0e10cSrcweir
1622cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1623cdf0e10cSrcweir if( m_bFinalCount )
1624cdf0e10cSrcweir {
1625cdf0e10cSrcweir m_nRow = m_nKnownCount;
1626cdf0e10cSrcweir m_bAfterLast = sal_False;
1627cdf0e10cSrcweir return m_nKnownCount != 0;
1628cdf0e10cSrcweir }
1629cdf0e10cSrcweir //unknown position
1630cdf0e10cSrcweir if( !m_xResultSetOrigin.is() )
1631cdf0e10cSrcweir {
1632cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1633cdf0e10cSrcweir return sal_False;
1634cdf0e10cSrcweir }
1635cdf0e10cSrcweir aGuard.clear();
1636cdf0e10cSrcweir
1637cdf0e10cSrcweir sal_Bool bValid = m_xResultSetOrigin->last();
1638cdf0e10cSrcweir
1639cdf0e10cSrcweir aGuard.reacquire();
1640cdf0e10cSrcweir m_bAfterLastApplied = m_bAfterLast = sal_False;
1641cdf0e10cSrcweir if( m_bFinalCount )
1642cdf0e10cSrcweir {
1643cdf0e10cSrcweir m_nLastAppliedPos = m_nKnownCount;
1644cdf0e10cSrcweir m_nRow = m_nKnownCount;
1645cdf0e10cSrcweir return bValid;
1646cdf0e10cSrcweir }
1647cdf0e10cSrcweir aGuard.clear();
1648cdf0e10cSrcweir
1649cdf0e10cSrcweir sal_Int32 nCurRow = m_xResultSetOrigin->getRow();
1650cdf0e10cSrcweir
1651cdf0e10cSrcweir aGuard.reacquire();
1652cdf0e10cSrcweir m_nLastAppliedPos = nCurRow;
1653cdf0e10cSrcweir m_nRow = nCurRow;
1654cdf0e10cSrcweir OSL_ENSURE( nCurRow >= m_nKnownCount, "position of last row < known Count, that could not be" );
1655cdf0e10cSrcweir m_nKnownCount = nCurRow;
1656cdf0e10cSrcweir m_bFinalCount = sal_True;
1657cdf0e10cSrcweir return nCurRow != 0;
1658cdf0e10cSrcweir }
1659cdf0e10cSrcweir
1660cdf0e10cSrcweir //virtual
1661cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
beforeFirst()1662cdf0e10cSrcweir ::beforeFirst()
1663cdf0e10cSrcweir throw( SQLException,
1664cdf0e10cSrcweir RuntimeException )
1665cdf0e10cSrcweir {
1666cdf0e10cSrcweir impl_EnsureNotDisposed();
1667cdf0e10cSrcweir
1668cdf0e10cSrcweir if( impl_isForwardOnly() )
1669cdf0e10cSrcweir throw SQLException();
1670cdf0e10cSrcweir
1671cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1672cdf0e10cSrcweir m_nRow = 0;
1673cdf0e10cSrcweir m_bAfterLast = sal_False;
1674cdf0e10cSrcweir }
1675cdf0e10cSrcweir
1676cdf0e10cSrcweir //virtual
1677cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
afterLast()1678cdf0e10cSrcweir ::afterLast()
1679cdf0e10cSrcweir throw( SQLException,
1680cdf0e10cSrcweir RuntimeException )
1681cdf0e10cSrcweir {
1682cdf0e10cSrcweir impl_EnsureNotDisposed();
1683cdf0e10cSrcweir
1684cdf0e10cSrcweir if( impl_isForwardOnly() )
1685cdf0e10cSrcweir throw SQLException();
1686cdf0e10cSrcweir
1687cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1688cdf0e10cSrcweir m_nRow = 1;
1689cdf0e10cSrcweir m_bAfterLast = sal_True;
1690cdf0e10cSrcweir }
1691cdf0e10cSrcweir
1692cdf0e10cSrcweir //virtual
1693cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
isAfterLast()1694cdf0e10cSrcweir ::isAfterLast()
1695cdf0e10cSrcweir throw( SQLException,
1696cdf0e10cSrcweir RuntimeException )
1697cdf0e10cSrcweir {
1698cdf0e10cSrcweir impl_EnsureNotDisposed();
1699cdf0e10cSrcweir
1700cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1701cdf0e10cSrcweir if( !m_bAfterLast )
1702cdf0e10cSrcweir return sal_False;
1703cdf0e10cSrcweir if( m_nKnownCount )
1704cdf0e10cSrcweir return m_bAfterLast;
1705cdf0e10cSrcweir if( m_bFinalCount )
1706cdf0e10cSrcweir return sal_False;
1707cdf0e10cSrcweir
1708cdf0e10cSrcweir if( !m_xResultSetOrigin.is() )
1709cdf0e10cSrcweir {
1710cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1711cdf0e10cSrcweir return sal_False;
1712cdf0e10cSrcweir }
1713cdf0e10cSrcweir aGuard.clear();
1714cdf0e10cSrcweir
1715cdf0e10cSrcweir //find out whethter the original resultset contains rows or not
1716cdf0e10cSrcweir m_xResultSetOrigin->afterLast();
1717cdf0e10cSrcweir
1718cdf0e10cSrcweir aGuard.reacquire();
1719cdf0e10cSrcweir m_bAfterLastApplied = sal_True;
1720cdf0e10cSrcweir aGuard.clear();
1721cdf0e10cSrcweir
1722cdf0e10cSrcweir return m_xResultSetOrigin->isAfterLast();
1723cdf0e10cSrcweir }
1724cdf0e10cSrcweir
1725cdf0e10cSrcweir //virtual
1726cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
isBeforeFirst()1727cdf0e10cSrcweir ::isBeforeFirst()
1728cdf0e10cSrcweir throw( SQLException,
1729cdf0e10cSrcweir RuntimeException )
1730cdf0e10cSrcweir {
1731cdf0e10cSrcweir impl_EnsureNotDisposed();
1732cdf0e10cSrcweir
1733cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
1734cdf0e10cSrcweir if( m_bAfterLast )
1735cdf0e10cSrcweir return sal_False;
1736cdf0e10cSrcweir if( m_nRow )
1737cdf0e10cSrcweir return sal_False;
1738cdf0e10cSrcweir if( m_nKnownCount )
1739cdf0e10cSrcweir return !m_nRow;
1740cdf0e10cSrcweir if( m_bFinalCount )
1741cdf0e10cSrcweir return sal_False;
1742cdf0e10cSrcweir
1743cdf0e10cSrcweir if( !m_xResultSetOrigin.is() )
1744cdf0e10cSrcweir {
1745cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1746cdf0e10cSrcweir return sal_False;
1747cdf0e10cSrcweir }
1748cdf0e10cSrcweir aGuard.clear();
1749cdf0e10cSrcweir
1750cdf0e10cSrcweir //find out whethter the original resultset contains rows or not
1751cdf0e10cSrcweir m_xResultSetOrigin->beforeFirst();
1752cdf0e10cSrcweir
1753cdf0e10cSrcweir aGuard.reacquire();
1754cdf0e10cSrcweir m_bAfterLastApplied = sal_False;
1755cdf0e10cSrcweir m_nLastAppliedPos = 0;
1756cdf0e10cSrcweir aGuard.clear();
1757cdf0e10cSrcweir
1758cdf0e10cSrcweir return m_xResultSetOrigin->isBeforeFirst();
1759cdf0e10cSrcweir }
1760cdf0e10cSrcweir
1761cdf0e10cSrcweir //virtual
1762cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
isFirst()1763cdf0e10cSrcweir ::isFirst()
1764cdf0e10cSrcweir throw( SQLException,
1765cdf0e10cSrcweir RuntimeException )
1766cdf0e10cSrcweir {
1767cdf0e10cSrcweir impl_EnsureNotDisposed();
1768cdf0e10cSrcweir
1769cdf0e10cSrcweir sal_Int32 nRow = 0;
1770cdf0e10cSrcweir Reference< XResultSet > xResultSetOrigin;
1771cdf0e10cSrcweir
1772cdf0e10cSrcweir {
1773cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1774cdf0e10cSrcweir if( m_bAfterLast )
1775cdf0e10cSrcweir return sal_False;
1776cdf0e10cSrcweir if( m_nRow != 1 )
1777cdf0e10cSrcweir return sal_False;
1778cdf0e10cSrcweir if( m_nKnownCount )
1779cdf0e10cSrcweir return m_nRow == 1;
1780cdf0e10cSrcweir if( m_bFinalCount )
1781cdf0e10cSrcweir return sal_False;
1782cdf0e10cSrcweir
1783cdf0e10cSrcweir nRow = m_nRow;
1784cdf0e10cSrcweir xResultSetOrigin = m_xResultSetOrigin;
1785cdf0e10cSrcweir }
1786cdf0e10cSrcweir
1787cdf0e10cSrcweir //need to ask origin
1788cdf0e10cSrcweir {
1789cdf0e10cSrcweir if( applyPositionToOrigin( nRow ) )
1790cdf0e10cSrcweir return xResultSetOrigin->isFirst();
1791cdf0e10cSrcweir else
1792cdf0e10cSrcweir return sal_False;
1793cdf0e10cSrcweir }
1794cdf0e10cSrcweir }
1795cdf0e10cSrcweir
1796cdf0e10cSrcweir //virtual
1797cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
isLast()1798cdf0e10cSrcweir ::isLast()
1799cdf0e10cSrcweir throw( SQLException,
1800cdf0e10cSrcweir RuntimeException )
1801cdf0e10cSrcweir {
1802cdf0e10cSrcweir impl_EnsureNotDisposed();
1803cdf0e10cSrcweir
1804cdf0e10cSrcweir sal_Int32 nRow = 0;
1805cdf0e10cSrcweir Reference< XResultSet > xResultSetOrigin;
1806cdf0e10cSrcweir {
1807cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1808cdf0e10cSrcweir if( m_bAfterLast )
1809cdf0e10cSrcweir return sal_False;
1810cdf0e10cSrcweir if( m_nRow < m_nKnownCount )
1811cdf0e10cSrcweir return sal_False;
1812cdf0e10cSrcweir if( m_bFinalCount )
1813cdf0e10cSrcweir return m_nKnownCount && m_nRow == m_nKnownCount;
1814cdf0e10cSrcweir
1815cdf0e10cSrcweir nRow = m_nRow;
1816cdf0e10cSrcweir xResultSetOrigin = m_xResultSetOrigin;
1817cdf0e10cSrcweir }
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir //need to ask origin
1820cdf0e10cSrcweir {
1821cdf0e10cSrcweir if( applyPositionToOrigin( nRow ) )
1822cdf0e10cSrcweir return xResultSetOrigin->isLast();
1823cdf0e10cSrcweir else
1824cdf0e10cSrcweir return sal_False;
1825cdf0e10cSrcweir }
1826cdf0e10cSrcweir }
1827cdf0e10cSrcweir
1828cdf0e10cSrcweir
1829cdf0e10cSrcweir //virtual
1830cdf0e10cSrcweir sal_Int32 SAL_CALL CachedContentResultSet
getRow()1831cdf0e10cSrcweir ::getRow()
1832cdf0e10cSrcweir throw( SQLException,
1833cdf0e10cSrcweir RuntimeException )
1834cdf0e10cSrcweir {
1835cdf0e10cSrcweir impl_EnsureNotDisposed();
1836cdf0e10cSrcweir
1837cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1838cdf0e10cSrcweir if( m_bAfterLast )
1839cdf0e10cSrcweir return 0;
1840cdf0e10cSrcweir return m_nRow;
1841cdf0e10cSrcweir }
1842cdf0e10cSrcweir
1843cdf0e10cSrcweir //virtual
1844cdf0e10cSrcweir void SAL_CALL CachedContentResultSet
refreshRow()1845cdf0e10cSrcweir ::refreshRow()
1846cdf0e10cSrcweir throw( SQLException,
1847cdf0e10cSrcweir RuntimeException )
1848cdf0e10cSrcweir {
1849cdf0e10cSrcweir impl_EnsureNotDisposed();
1850cdf0e10cSrcweir
1851cdf0e10cSrcweir //the ContentResultSet is static and will not change
1852cdf0e10cSrcweir //therefore we don't need to reload anything
1853cdf0e10cSrcweir }
1854cdf0e10cSrcweir
1855cdf0e10cSrcweir //virtual
1856cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
rowUpdated()1857cdf0e10cSrcweir ::rowUpdated()
1858cdf0e10cSrcweir throw( SQLException,
1859cdf0e10cSrcweir RuntimeException )
1860cdf0e10cSrcweir {
1861cdf0e10cSrcweir impl_EnsureNotDisposed();
1862cdf0e10cSrcweir
1863cdf0e10cSrcweir //the ContentResultSet is static and will not change
1864cdf0e10cSrcweir return sal_False;
1865cdf0e10cSrcweir }
1866cdf0e10cSrcweir //virtual
1867cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
rowInserted()1868cdf0e10cSrcweir ::rowInserted()
1869cdf0e10cSrcweir throw( SQLException,
1870cdf0e10cSrcweir RuntimeException )
1871cdf0e10cSrcweir {
1872cdf0e10cSrcweir impl_EnsureNotDisposed();
1873cdf0e10cSrcweir
1874cdf0e10cSrcweir //the ContentResultSet is static and will not change
1875cdf0e10cSrcweir return sal_False;
1876cdf0e10cSrcweir }
1877cdf0e10cSrcweir
1878cdf0e10cSrcweir //virtual
1879cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
rowDeleted()1880cdf0e10cSrcweir ::rowDeleted()
1881cdf0e10cSrcweir throw( SQLException,
1882cdf0e10cSrcweir RuntimeException )
1883cdf0e10cSrcweir {
1884cdf0e10cSrcweir impl_EnsureNotDisposed();
1885cdf0e10cSrcweir
1886cdf0e10cSrcweir //the ContentResultSet is static and will not change
1887cdf0e10cSrcweir return sal_False;
1888cdf0e10cSrcweir }
1889cdf0e10cSrcweir
1890cdf0e10cSrcweir //virtual
1891cdf0e10cSrcweir Reference< XInterface > SAL_CALL CachedContentResultSet
getStatement()1892cdf0e10cSrcweir ::getStatement()
1893cdf0e10cSrcweir throw( SQLException,
1894cdf0e10cSrcweir RuntimeException )
1895cdf0e10cSrcweir {
1896cdf0e10cSrcweir impl_EnsureNotDisposed();
1897cdf0e10cSrcweir //@todo ?return anything
1898cdf0e10cSrcweir return Reference< XInterface >();
1899cdf0e10cSrcweir }
1900cdf0e10cSrcweir
1901cdf0e10cSrcweir //-----------------------------------------------------------------
1902cdf0e10cSrcweir // XRow methods. ( inherited )
1903cdf0e10cSrcweir //-----------------------------------------------------------------
1904cdf0e10cSrcweir
1905cdf0e10cSrcweir //virtual
1906cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
wasNull()1907cdf0e10cSrcweir ::wasNull()
1908cdf0e10cSrcweir throw( SQLException,
1909cdf0e10cSrcweir RuntimeException )
1910cdf0e10cSrcweir {
1911cdf0e10cSrcweir impl_EnsureNotDisposed();
1912cdf0e10cSrcweir impl_init_xRowOrigin();
1913cdf0e10cSrcweir {
1914cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
1915cdf0e10cSrcweir if( m_bLastReadWasFromCache )
1916cdf0e10cSrcweir return m_bLastCachedReadWasNull;
1917cdf0e10cSrcweir if( !m_xRowOrigin.is() )
1918cdf0e10cSrcweir {
1919cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
1920cdf0e10cSrcweir return sal_False;
1921cdf0e10cSrcweir }
1922cdf0e10cSrcweir }
1923cdf0e10cSrcweir return m_xRowOrigin->wasNull();
1924cdf0e10cSrcweir }
1925cdf0e10cSrcweir
1926cdf0e10cSrcweir //virtual
1927cdf0e10cSrcweir rtl::OUString SAL_CALL CachedContentResultSet
getString(sal_Int32 columnIndex)1928cdf0e10cSrcweir ::getString( sal_Int32 columnIndex )
1929cdf0e10cSrcweir throw( SQLException,
1930cdf0e10cSrcweir RuntimeException )
1931cdf0e10cSrcweir {
1932cdf0e10cSrcweir XROW_GETXXX( getString, OUString );
1933cdf0e10cSrcweir }
1934cdf0e10cSrcweir
1935cdf0e10cSrcweir //virtual
1936cdf0e10cSrcweir sal_Bool SAL_CALL CachedContentResultSet
getBoolean(sal_Int32 columnIndex)1937cdf0e10cSrcweir ::getBoolean( sal_Int32 columnIndex )
1938cdf0e10cSrcweir throw( SQLException,
1939cdf0e10cSrcweir RuntimeException )
1940cdf0e10cSrcweir {
1941cdf0e10cSrcweir XROW_GETXXX( getBoolean, sal_Bool );
1942cdf0e10cSrcweir }
1943cdf0e10cSrcweir
1944cdf0e10cSrcweir //virtual
1945cdf0e10cSrcweir sal_Int8 SAL_CALL CachedContentResultSet
getByte(sal_Int32 columnIndex)1946cdf0e10cSrcweir ::getByte( sal_Int32 columnIndex )
1947cdf0e10cSrcweir throw( SQLException,
1948cdf0e10cSrcweir RuntimeException )
1949cdf0e10cSrcweir {
1950cdf0e10cSrcweir XROW_GETXXX( getByte, sal_Int8 );
1951cdf0e10cSrcweir }
1952cdf0e10cSrcweir
1953cdf0e10cSrcweir //virtual
1954cdf0e10cSrcweir sal_Int16 SAL_CALL CachedContentResultSet
getShort(sal_Int32 columnIndex)1955cdf0e10cSrcweir ::getShort( sal_Int32 columnIndex )
1956cdf0e10cSrcweir throw( SQLException,
1957cdf0e10cSrcweir RuntimeException )
1958cdf0e10cSrcweir {
1959cdf0e10cSrcweir XROW_GETXXX( getShort, sal_Int16 );
1960cdf0e10cSrcweir }
1961cdf0e10cSrcweir
1962cdf0e10cSrcweir //virtual
1963cdf0e10cSrcweir sal_Int32 SAL_CALL CachedContentResultSet
getInt(sal_Int32 columnIndex)1964cdf0e10cSrcweir ::getInt( sal_Int32 columnIndex )
1965cdf0e10cSrcweir throw( SQLException,
1966cdf0e10cSrcweir RuntimeException )
1967cdf0e10cSrcweir {
1968cdf0e10cSrcweir XROW_GETXXX( getInt, sal_Int32 );
1969cdf0e10cSrcweir }
1970cdf0e10cSrcweir
1971cdf0e10cSrcweir //virtual
1972cdf0e10cSrcweir sal_Int64 SAL_CALL CachedContentResultSet
getLong(sal_Int32 columnIndex)1973cdf0e10cSrcweir ::getLong( sal_Int32 columnIndex )
1974cdf0e10cSrcweir throw( SQLException,
1975cdf0e10cSrcweir RuntimeException )
1976cdf0e10cSrcweir {
1977cdf0e10cSrcweir XROW_GETXXX( getLong, sal_Int64 );
1978cdf0e10cSrcweir }
1979cdf0e10cSrcweir
1980cdf0e10cSrcweir //virtual
1981cdf0e10cSrcweir float SAL_CALL CachedContentResultSet
getFloat(sal_Int32 columnIndex)1982cdf0e10cSrcweir ::getFloat( sal_Int32 columnIndex )
1983cdf0e10cSrcweir throw( SQLException,
1984cdf0e10cSrcweir RuntimeException )
1985cdf0e10cSrcweir {
1986cdf0e10cSrcweir XROW_GETXXX( getFloat, float );
1987cdf0e10cSrcweir }
1988cdf0e10cSrcweir
1989cdf0e10cSrcweir //virtual
1990cdf0e10cSrcweir double SAL_CALL CachedContentResultSet
getDouble(sal_Int32 columnIndex)1991cdf0e10cSrcweir ::getDouble( sal_Int32 columnIndex )
1992cdf0e10cSrcweir throw( SQLException,
1993cdf0e10cSrcweir RuntimeException )
1994cdf0e10cSrcweir {
1995cdf0e10cSrcweir XROW_GETXXX( getDouble, double );
1996cdf0e10cSrcweir }
1997cdf0e10cSrcweir
1998cdf0e10cSrcweir //virtual
1999cdf0e10cSrcweir Sequence< sal_Int8 > SAL_CALL CachedContentResultSet
getBytes(sal_Int32 columnIndex)2000cdf0e10cSrcweir ::getBytes( sal_Int32 columnIndex )
2001cdf0e10cSrcweir throw( SQLException,
2002cdf0e10cSrcweir RuntimeException )
2003cdf0e10cSrcweir {
2004cdf0e10cSrcweir XROW_GETXXX( getBytes, Sequence< sal_Int8 > );
2005cdf0e10cSrcweir }
2006cdf0e10cSrcweir
2007cdf0e10cSrcweir //virtual
2008cdf0e10cSrcweir Date SAL_CALL CachedContentResultSet
getDate(sal_Int32 columnIndex)2009cdf0e10cSrcweir ::getDate( sal_Int32 columnIndex )
2010cdf0e10cSrcweir throw( SQLException,
2011cdf0e10cSrcweir RuntimeException )
2012cdf0e10cSrcweir {
2013cdf0e10cSrcweir XROW_GETXXX( getDate, Date );
2014cdf0e10cSrcweir }
2015cdf0e10cSrcweir
2016cdf0e10cSrcweir //virtual
2017cdf0e10cSrcweir Time SAL_CALL CachedContentResultSet
getTime(sal_Int32 columnIndex)2018cdf0e10cSrcweir ::getTime( sal_Int32 columnIndex )
2019cdf0e10cSrcweir throw( SQLException,
2020cdf0e10cSrcweir RuntimeException )
2021cdf0e10cSrcweir {
2022cdf0e10cSrcweir XROW_GETXXX( getTime, Time );
2023cdf0e10cSrcweir }
2024cdf0e10cSrcweir
2025cdf0e10cSrcweir //virtual
2026cdf0e10cSrcweir DateTime SAL_CALL CachedContentResultSet
getTimestamp(sal_Int32 columnIndex)2027cdf0e10cSrcweir ::getTimestamp( sal_Int32 columnIndex )
2028cdf0e10cSrcweir throw( SQLException,
2029cdf0e10cSrcweir RuntimeException )
2030cdf0e10cSrcweir {
2031cdf0e10cSrcweir XROW_GETXXX( getTimestamp, DateTime );
2032cdf0e10cSrcweir }
2033cdf0e10cSrcweir
2034cdf0e10cSrcweir //virtual
2035cdf0e10cSrcweir Reference< com::sun::star::io::XInputStream >
2036cdf0e10cSrcweir SAL_CALL CachedContentResultSet
getBinaryStream(sal_Int32 columnIndex)2037cdf0e10cSrcweir ::getBinaryStream( sal_Int32 columnIndex )
2038cdf0e10cSrcweir throw( SQLException,
2039cdf0e10cSrcweir RuntimeException )
2040cdf0e10cSrcweir {
2041cdf0e10cSrcweir XROW_GETXXX( getBinaryStream, Reference< com::sun::star::io::XInputStream > );
2042cdf0e10cSrcweir }
2043cdf0e10cSrcweir
2044cdf0e10cSrcweir //virtual
2045cdf0e10cSrcweir Reference< com::sun::star::io::XInputStream >
2046cdf0e10cSrcweir SAL_CALL CachedContentResultSet
getCharacterStream(sal_Int32 columnIndex)2047cdf0e10cSrcweir ::getCharacterStream( sal_Int32 columnIndex )
2048cdf0e10cSrcweir throw( SQLException,
2049cdf0e10cSrcweir RuntimeException )
2050cdf0e10cSrcweir {
2051cdf0e10cSrcweir XROW_GETXXX( getCharacterStream, Reference< com::sun::star::io::XInputStream > );
2052cdf0e10cSrcweir }
2053cdf0e10cSrcweir
2054cdf0e10cSrcweir //virtual
2055cdf0e10cSrcweir Any SAL_CALL CachedContentResultSet
getObject(sal_Int32 columnIndex,const Reference<com::sun::star::container::XNameAccess> & typeMap)2056cdf0e10cSrcweir ::getObject( sal_Int32 columnIndex,
2057cdf0e10cSrcweir const Reference<
2058cdf0e10cSrcweir com::sun::star::container::XNameAccess >& typeMap )
2059cdf0e10cSrcweir throw( SQLException,
2060cdf0e10cSrcweir RuntimeException )
2061cdf0e10cSrcweir {
2062cdf0e10cSrcweir //if you change this macro please pay attention to
2063cdf0e10cSrcweir //define XROW_GETXXX, where this is similar implemented
2064cdf0e10cSrcweir
2065cdf0e10cSrcweir ReacquireableGuard aGuard( m_aMutex );
2066cdf0e10cSrcweir sal_Int32 nRow = m_nRow;
2067cdf0e10cSrcweir sal_Int32 nFetchSize = m_nFetchSize;
2068cdf0e10cSrcweir sal_Int32 nFetchDirection = m_nFetchDirection;
2069cdf0e10cSrcweir if( !m_aCache.hasRow( nRow ) )
2070cdf0e10cSrcweir {
2071cdf0e10cSrcweir if( !m_aCache.hasCausedException( nRow ) )
2072cdf0e10cSrcweir {
2073cdf0e10cSrcweir if( !m_xFetchProvider.is() )
2074cdf0e10cSrcweir {
2075cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" );
2076cdf0e10cSrcweir return Any();
2077cdf0e10cSrcweir }
2078cdf0e10cSrcweir aGuard.clear();
2079cdf0e10cSrcweir
2080cdf0e10cSrcweir impl_fetchData( nRow, nFetchSize, nFetchDirection );
2081cdf0e10cSrcweir }
2082cdf0e10cSrcweir aGuard.reacquire();
2083cdf0e10cSrcweir if( !m_aCache.hasRow( nRow ) )
2084cdf0e10cSrcweir {
2085cdf0e10cSrcweir m_bLastReadWasFromCache = sal_False;
2086cdf0e10cSrcweir aGuard.clear();
2087cdf0e10cSrcweir applyPositionToOrigin( nRow );
2088cdf0e10cSrcweir impl_init_xRowOrigin();
2089cdf0e10cSrcweir return m_xRowOrigin->getObject( columnIndex, typeMap );
2090cdf0e10cSrcweir }
2091cdf0e10cSrcweir }
2092cdf0e10cSrcweir //@todo: pay attention to typeMap
2093cdf0e10cSrcweir const Any& rValue = m_aCache.getAny( nRow, columnIndex );
2094cdf0e10cSrcweir Any aRet;
2095cdf0e10cSrcweir m_bLastReadWasFromCache = sal_True;
2096cdf0e10cSrcweir m_bLastCachedReadWasNull = !( rValue >>= aRet );
2097cdf0e10cSrcweir return aRet;
2098cdf0e10cSrcweir }
2099cdf0e10cSrcweir
2100cdf0e10cSrcweir //virtual
2101cdf0e10cSrcweir Reference< XRef > SAL_CALL CachedContentResultSet
getRef(sal_Int32 columnIndex)2102cdf0e10cSrcweir ::getRef( sal_Int32 columnIndex )
2103cdf0e10cSrcweir throw( SQLException,
2104cdf0e10cSrcweir RuntimeException )
2105cdf0e10cSrcweir {
2106cdf0e10cSrcweir XROW_GETXXX( getRef, Reference< XRef > );
2107cdf0e10cSrcweir }
2108cdf0e10cSrcweir
2109cdf0e10cSrcweir //virtual
2110cdf0e10cSrcweir Reference< XBlob > SAL_CALL CachedContentResultSet
getBlob(sal_Int32 columnIndex)2111cdf0e10cSrcweir ::getBlob( sal_Int32 columnIndex )
2112cdf0e10cSrcweir throw( SQLException,
2113cdf0e10cSrcweir RuntimeException )
2114cdf0e10cSrcweir {
2115cdf0e10cSrcweir XROW_GETXXX( getBlob, Reference< XBlob > );
2116cdf0e10cSrcweir }
2117cdf0e10cSrcweir
2118cdf0e10cSrcweir //virtual
2119cdf0e10cSrcweir Reference< XClob > SAL_CALL CachedContentResultSet
getClob(sal_Int32 columnIndex)2120cdf0e10cSrcweir ::getClob( sal_Int32 columnIndex )
2121cdf0e10cSrcweir throw( SQLException,
2122cdf0e10cSrcweir RuntimeException )
2123cdf0e10cSrcweir {
2124cdf0e10cSrcweir XROW_GETXXX( getClob, Reference< XClob > );
2125cdf0e10cSrcweir }
2126cdf0e10cSrcweir
2127cdf0e10cSrcweir //virtual
2128cdf0e10cSrcweir Reference< XArray > SAL_CALL CachedContentResultSet
getArray(sal_Int32 columnIndex)2129cdf0e10cSrcweir ::getArray( sal_Int32 columnIndex )
2130cdf0e10cSrcweir throw( SQLException,
2131cdf0e10cSrcweir RuntimeException )
2132cdf0e10cSrcweir {
2133cdf0e10cSrcweir XROW_GETXXX( getArray, Reference< XArray > );
2134cdf0e10cSrcweir }
2135cdf0e10cSrcweir
2136cdf0e10cSrcweir //-----------------------------------------------------------------
2137cdf0e10cSrcweir // Type Converter Support
2138cdf0e10cSrcweir //-----------------------------------------------------------------
2139cdf0e10cSrcweir
getTypeConverter()2140cdf0e10cSrcweir const Reference< XTypeConverter >& CachedContentResultSet::getTypeConverter()
2141cdf0e10cSrcweir {
2142cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
2143cdf0e10cSrcweir
2144cdf0e10cSrcweir if ( !m_bTriedToGetTypeConverter && !m_xTypeConverter.is() )
2145cdf0e10cSrcweir {
2146cdf0e10cSrcweir m_bTriedToGetTypeConverter = sal_True;
2147cdf0e10cSrcweir m_xTypeConverter = Reference< XTypeConverter >(
2148cdf0e10cSrcweir m_xSMgr->createInstance(
2149cdf0e10cSrcweir OUString::createFromAscii(
2150cdf0e10cSrcweir "com.sun.star.script.Converter" ) ),
2151cdf0e10cSrcweir UNO_QUERY );
2152cdf0e10cSrcweir
2153cdf0e10cSrcweir OSL_ENSURE( m_xTypeConverter.is(),
2154cdf0e10cSrcweir "PropertyValueSet::getTypeConverter() - "
2155cdf0e10cSrcweir "Service 'com.sun.star.script.Converter' n/a!" );
2156cdf0e10cSrcweir }
2157cdf0e10cSrcweir return m_xTypeConverter;
2158cdf0e10cSrcweir }
2159cdf0e10cSrcweir
2160cdf0e10cSrcweir //--------------------------------------------------------------------------
2161cdf0e10cSrcweir //--------------------------------------------------------------------------
2162cdf0e10cSrcweir // class CachedContentResultSetFactory
2163cdf0e10cSrcweir //--------------------------------------------------------------------------
2164cdf0e10cSrcweir //--------------------------------------------------------------------------
2165cdf0e10cSrcweir
CachedContentResultSetFactory(const Reference<XMultiServiceFactory> & rSMgr)2166cdf0e10cSrcweir CachedContentResultSetFactory::CachedContentResultSetFactory(
2167cdf0e10cSrcweir const Reference< XMultiServiceFactory > & rSMgr )
2168cdf0e10cSrcweir {
2169cdf0e10cSrcweir m_xSMgr = rSMgr;
2170cdf0e10cSrcweir }
2171cdf0e10cSrcweir
~CachedContentResultSetFactory()2172cdf0e10cSrcweir CachedContentResultSetFactory::~CachedContentResultSetFactory()
2173cdf0e10cSrcweir {
2174cdf0e10cSrcweir }
2175cdf0e10cSrcweir
2176cdf0e10cSrcweir //--------------------------------------------------------------------------
2177cdf0e10cSrcweir // CachedContentResultSetFactory XInterface methods.
2178cdf0e10cSrcweir //--------------------------------------------------------------------------
2179cdf0e10cSrcweir
2180cdf0e10cSrcweir XINTERFACE_IMPL_3( CachedContentResultSetFactory,
2181cdf0e10cSrcweir XTypeProvider,
2182cdf0e10cSrcweir XServiceInfo,
2183cdf0e10cSrcweir XCachedContentResultSetFactory );
2184cdf0e10cSrcweir
2185cdf0e10cSrcweir //--------------------------------------------------------------------------
2186cdf0e10cSrcweir // CachedContentResultSetFactory XTypeProvider methods.
2187cdf0e10cSrcweir //--------------------------------------------------------------------------
2188cdf0e10cSrcweir
2189cdf0e10cSrcweir XTYPEPROVIDER_IMPL_3( CachedContentResultSetFactory,
2190cdf0e10cSrcweir XTypeProvider,
2191cdf0e10cSrcweir XServiceInfo,
2192cdf0e10cSrcweir XCachedContentResultSetFactory );
2193cdf0e10cSrcweir
2194cdf0e10cSrcweir //--------------------------------------------------------------------------
2195cdf0e10cSrcweir // CachedContentResultSetFactory XServiceInfo methods.
2196cdf0e10cSrcweir //--------------------------------------------------------------------------
2197cdf0e10cSrcweir
2198cdf0e10cSrcweir XSERVICEINFO_IMPL_1( CachedContentResultSetFactory,
2199cdf0e10cSrcweir OUString::createFromAscii(
2200cdf0e10cSrcweir "com.sun.star.comp.ucb.CachedContentResultSetFactory" ),
2201cdf0e10cSrcweir OUString::createFromAscii(
2202cdf0e10cSrcweir CACHED_CONTENT_RESULTSET_FACTORY_NAME ) );
2203cdf0e10cSrcweir
2204cdf0e10cSrcweir //--------------------------------------------------------------------------
2205cdf0e10cSrcweir // Service factory implementation.
2206cdf0e10cSrcweir //--------------------------------------------------------------------------
2207cdf0e10cSrcweir
2208cdf0e10cSrcweir ONE_INSTANCE_SERVICE_FACTORY_IMPL( CachedContentResultSetFactory );
2209cdf0e10cSrcweir
2210cdf0e10cSrcweir //--------------------------------------------------------------------------
2211cdf0e10cSrcweir // CachedContentResultSetFactory XCachedContentResultSetFactory methods.
2212cdf0e10cSrcweir //--------------------------------------------------------------------------
2213cdf0e10cSrcweir
2214cdf0e10cSrcweir //virtual
2215cdf0e10cSrcweir Reference< XResultSet > SAL_CALL CachedContentResultSetFactory
createCachedContentResultSet(const Reference<XResultSet> & xSource,const Reference<XContentIdentifierMapping> & xMapping)2216cdf0e10cSrcweir ::createCachedContentResultSet(
2217cdf0e10cSrcweir const Reference< XResultSet > & xSource,
2218cdf0e10cSrcweir const Reference< XContentIdentifierMapping > & xMapping )
2219cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
2220cdf0e10cSrcweir {
2221cdf0e10cSrcweir Reference< XResultSet > xRet;
2222cdf0e10cSrcweir xRet = new CachedContentResultSet( m_xSMgr, xSource, xMapping );
2223cdf0e10cSrcweir return xRet;
2224cdf0e10cSrcweir }
2225cdf0e10cSrcweir
2226