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