xref: /trunk/main/ucb/source/cacher/cachedcontentresultset.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _CACHED_CONTENT_RESULTSET_HXX
29 #define _CACHED_CONTENT_RESULTSET_HXX
30 
31 #include <contentresultsetwrapper.hxx>
32 #include <com/sun/star/lang/XTypeProvider.hpp>
33 #include <com/sun/star/lang/XServiceInfo.hpp>
34 #include <com/sun/star/ucb/XFetchProvider.hpp>
35 #include <com/sun/star/ucb/XFetchProviderForContentAccess.hpp>
36 #include <com/sun/star/ucb/FetchResult.hpp>
37 #include <com/sun/star/ucb/XContentIdentifierMapping.hpp>
38 #include <com/sun/star/ucb/XCachedContentResultSetFactory.hpp>
39 
40 #define CACHED_CONTENT_RESULTSET_SERVICE_NAME "com.sun.star.ucb.CachedContentResultSet"
41 #define CACHED_CONTENT_RESULTSET_FACTORY_NAME "com.sun.star.ucb.CachedContentResultSetFactory"
42 
43 //=========================================================================
44 
45 namespace com { namespace sun { namespace star { namespace script {
46     class XTypeConverter;
47 } } } }
48 
49 class CCRS_PropertySetInfo;
50 class CachedContentResultSet
51                 : public ContentResultSetWrapper
52                 , public com::sun::star::lang::XTypeProvider
53                 , public com::sun::star::lang::XServiceInfo
54 {
55     //--------------------------------------------------------------------------
56     // class CCRS_Cache
57 
58     class CCRS_Cache
59     {
60     private:
61         com::sun::star::ucb::FetchResult*           m_pResult;
62         com::sun::star::uno::Reference<
63             com::sun::star::ucb::XContentIdentifierMapping >
64                                                     m_xContentIdentifierMapping;
65         com::sun::star::uno::Sequence< sal_Bool >*  m_pMappedReminder;
66 
67     private:
68         com::sun::star::uno::Any& SAL_CALL
69         getRowAny( sal_Int32 nRow )
70             throw( com::sun::star::sdbc::SQLException,
71             com::sun::star::uno::RuntimeException );
72 
73         void SAL_CALL clear();
74 
75 
76         void SAL_CALL remindMapped( sal_Int32 nRow );
77         sal_Bool SAL_CALL isRowMapped( sal_Int32 nRow );
78         void SAL_CALL clearMappedReminder();
79         com::sun::star::uno::Sequence< sal_Bool >* SAL_CALL getMappedReminder();
80 
81     public:
82         CCRS_Cache( const com::sun::star::uno::Reference<
83                 com::sun::star::ucb::XContentIdentifierMapping > & xMapping );
84         ~CCRS_Cache();
85 
86         void SAL_CALL loadData(
87             const com::sun::star::ucb::FetchResult& rResult );
88 
89         sal_Bool SAL_CALL
90         hasRow( sal_Int32 nRow );
91 
92         sal_Bool SAL_CALL
93         hasCausedException( sal_Int32 nRow );
94 
95         sal_Int32 SAL_CALL
96         getMaxRow();
97 
98         sal_Bool SAL_CALL
99         hasKnownLast();
100 
101         //---
102         const com::sun::star::uno::Any& SAL_CALL
103         getAny( sal_Int32 nRow, sal_Int32 nColumnIndex )
104             throw( com::sun::star::sdbc::SQLException,
105             com::sun::star::uno::RuntimeException );
106 
107         const rtl::OUString& SAL_CALL
108         getContentIdentifierString( sal_Int32 nRow )
109             throw( com::sun::star::uno::RuntimeException );
110 
111         const com::sun::star::uno::Reference<
112                 com::sun::star::ucb::XContentIdentifier >& SAL_CALL
113         getContentIdentifier( sal_Int32 nRow )
114             throw( com::sun::star::uno::RuntimeException );
115 
116         const com::sun::star::uno::Reference<
117                 com::sun::star::ucb::XContent >& SAL_CALL
118         getContent( sal_Int32 nRow )
119             throw( com::sun::star::uno::RuntimeException );
120     };
121     //-----------------------------------------------------------------
122     //members
123 
124     com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >
125                             m_xSMgr;
126 
127     //different Interfaces from Origin:
128     com::sun::star::uno::Reference< com::sun::star::ucb::XFetchProvider >
129                             m_xFetchProvider; //XFetchProvider-interface from m_xOrigin
130 
131     com::sun::star::uno::Reference< com::sun::star::ucb::XFetchProviderForContentAccess >
132                             m_xFetchProviderForContentAccess; //XFetchProviderForContentAccess-interface from m_xOrigin
133 
134     //my PropertySetInfo
135     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo >
136                             m_xMyPropertySetInfo;//holds m_pMyPropSetInfo alive
137     CCRS_PropertySetInfo*   m_pMyPropSetInfo;
138 
139 
140     //
141     com::sun::star::uno::Reference< com::sun::star::ucb::XContentIdentifierMapping >
142                             m_xContentIdentifierMapping;// can be used for remote optimized ContentAccess
143 
144     //some Properties and helping variables
145     sal_Int32               m_nRow;
146     sal_Bool                m_bAfterLast; // TRUE, if m_nRow is after final count; can be TRUE without knowing the exact final count
147 
148     sal_Int32               m_nLastAppliedPos;
149     sal_Bool                m_bAfterLastApplied;
150 
151     sal_Int32               m_nKnownCount; // count we know from the Origin
152     sal_Bool                m_bFinalCount; // TRUE if the Origin has reached final count and we got that count in m_nKnownCount
153 
154     sal_Int32               m_nFetchSize;
155     sal_Int32               m_nFetchDirection;
156 
157     sal_Bool                m_bLastReadWasFromCache;
158     sal_Bool                m_bLastCachedReadWasNull;
159 
160     //cache:
161     CCRS_Cache              m_aCache;
162     CCRS_Cache              m_aCacheContentIdentifierString;
163     CCRS_Cache              m_aCacheContentIdentifier;
164     CCRS_Cache              m_aCacheContent;
165 
166 
167 private:
168     //-----------------------------------------------------------------
169     //helping XPropertySet methods.
170     virtual void SAL_CALL impl_initPropertySetInfo();
171 
172 
173     //-----------------------------------------------------------------
174     sal_Bool SAL_CALL
175     applyPositionToOrigin( sal_Int32 nRow )
176         throw( com::sun::star::sdbc::SQLException,
177         com::sun::star::uno::RuntimeException );
178 
179     void SAL_CALL
180     impl_fetchData( sal_Int32 nRow, sal_Int32 nCount
181                     , sal_Int32 nFetchDirection )
182         throw( com::sun::star::uno::RuntimeException );
183 
184     sal_Bool SAL_CALL
185     impl_isKnownValidPosition( sal_Int32 nRow );
186 
187     sal_Bool SAL_CALL
188     impl_isKnownInvalidPosition( sal_Int32 nRow );
189 
190     void SAL_CALL
191     impl_changeRowCount( sal_Int32 nOld, sal_Int32 nNew );
192 
193     void SAL_CALL
194     impl_changeIsRowCountFinal( sal_Bool bOld, sal_Bool bNew );
195 
196 public:
197     CachedContentResultSet(
198                         const com::sun::star::uno::Reference<
199                             com::sun::star::lang::XMultiServiceFactory > &
200                                 xSMgr,
201                         const com::sun::star::uno::Reference<
202                             com::sun::star::sdbc::XResultSet > & xOrigin,
203                         const com::sun::star::uno::Reference<
204                             com::sun::star::ucb::XContentIdentifierMapping > &
205                                 xContentIdentifierMapping );
206 
207     virtual ~CachedContentResultSet();
208 
209     //-----------------------------------------------------------------
210     // XInterface inherited
211     //-----------------------------------------------------------------
212     XINTERFACE_DECL()
213     //-----------------------------------------------------------------
214     // XTypeProvider
215     //-----------------------------------------------------------------
216     XTYPEPROVIDER_DECL()
217     //-----------------------------------------------------------------
218     // XServiceInfo
219     //-----------------------------------------------------------------
220     XSERVICEINFO_NOFACTORY_DECL()
221 
222     //-----------------------------------------------------------------
223     // XPropertySet inherited
224     //-----------------------------------------------------------------
225 
226     virtual void SAL_CALL
227     setPropertyValue( const rtl::OUString& aPropertyName,
228                       const com::sun::star::uno::Any& aValue )
229         throw( com::sun::star::beans::UnknownPropertyException,
230                com::sun::star::beans::PropertyVetoException,
231                com::sun::star::lang::IllegalArgumentException,
232                com::sun::star::lang::WrappedTargetException,
233                com::sun::star::uno::RuntimeException );
234 
235     virtual com::sun::star::uno::Any SAL_CALL
236     getPropertyValue( const rtl::OUString& PropertyName )
237         throw( com::sun::star::beans::UnknownPropertyException,
238         com::sun::star::lang::WrappedTargetException,
239         com::sun::star::uno::RuntimeException );
240 
241     //-----------------------------------------------------------------
242     // own inherited
243     //-----------------------------------------------------------------
244     virtual void SAL_CALL
245     impl_disposing( const com::sun::star::lang::EventObject& Source )
246         throw( com::sun::star::uno::RuntimeException );
247 
248     virtual void SAL_CALL
249     impl_propertyChange( const com::sun::star::beans::PropertyChangeEvent& evt )
250         throw( com::sun::star::uno::RuntimeException );
251 
252     virtual void SAL_CALL
253     impl_vetoableChange( const com::sun::star::beans::PropertyChangeEvent& aEvent )
254         throw( com::sun::star::beans::PropertyVetoException,
255                com::sun::star::uno::RuntimeException );
256 
257     //-----------------------------------------------------------------
258     // XContentAccess inherited
259     //-----------------------------------------------------------------
260     virtual rtl::OUString SAL_CALL
261     queryContentIdentifierString()
262         throw( com::sun::star::uno::RuntimeException );
263 
264     virtual com::sun::star::uno::Reference<
265                 com::sun::star::ucb::XContentIdentifier > SAL_CALL
266     queryContentIdentifier()
267         throw( com::sun::star::uno::RuntimeException );
268 
269     virtual com::sun::star::uno::Reference<
270                 com::sun::star::ucb::XContent > SAL_CALL
271     queryContent()
272         throw( com::sun::star::uno::RuntimeException );
273 
274     //-----------------------------------------------------------------
275     // XResultSet inherited
276     //-----------------------------------------------------------------
277     virtual sal_Bool SAL_CALL
278     next()
279         throw( com::sun::star::sdbc::SQLException,
280                com::sun::star::uno::RuntimeException );
281     virtual sal_Bool SAL_CALL
282     isBeforeFirst()
283         throw( com::sun::star::sdbc::SQLException,
284                com::sun::star::uno::RuntimeException );
285     virtual sal_Bool SAL_CALL
286     isAfterLast()
287         throw( com::sun::star::sdbc::SQLException,
288                com::sun::star::uno::RuntimeException );
289     virtual sal_Bool SAL_CALL
290     isFirst()
291         throw( com::sun::star::sdbc::SQLException,
292                com::sun::star::uno::RuntimeException );
293     virtual sal_Bool SAL_CALL
294     isLast()
295         throw( com::sun::star::sdbc::SQLException,
296                com::sun::star::uno::RuntimeException );
297     virtual void SAL_CALL
298     beforeFirst()
299         throw( com::sun::star::sdbc::SQLException,
300                com::sun::star::uno::RuntimeException );
301     virtual void SAL_CALL
302     afterLast()
303         throw( com::sun::star::sdbc::SQLException,
304                com::sun::star::uno::RuntimeException );
305     virtual sal_Bool SAL_CALL
306     first()
307         throw( com::sun::star::sdbc::SQLException,
308                com::sun::star::uno::RuntimeException );
309     virtual sal_Bool SAL_CALL
310     last()
311         throw( com::sun::star::sdbc::SQLException,
312                com::sun::star::uno::RuntimeException );
313     virtual sal_Int32 SAL_CALL
314     getRow()
315         throw( com::sun::star::sdbc::SQLException,
316                com::sun::star::uno::RuntimeException );
317     virtual sal_Bool SAL_CALL
318     absolute( sal_Int32 row )
319         throw( com::sun::star::sdbc::SQLException,
320                com::sun::star::uno::RuntimeException );
321     virtual sal_Bool SAL_CALL
322     relative( sal_Int32 rows )
323         throw( com::sun::star::sdbc::SQLException,
324                com::sun::star::uno::RuntimeException );
325     virtual sal_Bool SAL_CALL
326     previous()
327         throw( com::sun::star::sdbc::SQLException,
328                com::sun::star::uno::RuntimeException );
329     virtual void SAL_CALL
330     refreshRow()
331         throw( com::sun::star::sdbc::SQLException,
332                com::sun::star::uno::RuntimeException );
333     virtual sal_Bool SAL_CALL
334     rowUpdated()
335         throw( com::sun::star::sdbc::SQLException,
336                com::sun::star::uno::RuntimeException );
337     virtual sal_Bool SAL_CALL
338     rowInserted()
339         throw( com::sun::star::sdbc::SQLException,
340                com::sun::star::uno::RuntimeException );
341     virtual sal_Bool SAL_CALL
342     rowDeleted()
343         throw( com::sun::star::sdbc::SQLException,
344                com::sun::star::uno::RuntimeException );
345     virtual com::sun::star::uno::Reference<
346                 com::sun::star::uno::XInterface > SAL_CALL
347     getStatement()
348         throw( com::sun::star::sdbc::SQLException,
349                com::sun::star::uno::RuntimeException );
350 
351     //-----------------------------------------------------------------
352     // XRow inherited
353     //-----------------------------------------------------------------
354     virtual sal_Bool SAL_CALL
355     wasNull()
356         throw( com::sun::star::sdbc::SQLException,
357                com::sun::star::uno::RuntimeException );
358 
359     virtual rtl::OUString SAL_CALL
360     getString( sal_Int32 columnIndex )
361         throw( com::sun::star::sdbc::SQLException,
362                com::sun::star::uno::RuntimeException );
363 
364     virtual sal_Bool SAL_CALL
365     getBoolean( sal_Int32 columnIndex )
366         throw( com::sun::star::sdbc::SQLException,
367                com::sun::star::uno::RuntimeException );
368 
369     virtual sal_Int8 SAL_CALL
370     getByte( sal_Int32 columnIndex )
371         throw( com::sun::star::sdbc::SQLException,
372                com::sun::star::uno::RuntimeException );
373 
374     virtual sal_Int16 SAL_CALL
375     getShort( sal_Int32 columnIndex )
376         throw( com::sun::star::sdbc::SQLException,
377                com::sun::star::uno::RuntimeException );
378 
379     virtual sal_Int32 SAL_CALL
380     getInt( sal_Int32 columnIndex )
381         throw( com::sun::star::sdbc::SQLException,
382                com::sun::star::uno::RuntimeException );
383 
384     virtual sal_Int64 SAL_CALL
385     getLong( sal_Int32 columnIndex )
386         throw( com::sun::star::sdbc::SQLException,
387                com::sun::star::uno::RuntimeException );
388 
389     virtual float SAL_CALL
390     getFloat( sal_Int32 columnIndex )
391         throw( com::sun::star::sdbc::SQLException,
392                com::sun::star::uno::RuntimeException );
393 
394     virtual double SAL_CALL
395     getDouble( sal_Int32 columnIndex )
396         throw( com::sun::star::sdbc::SQLException,
397                com::sun::star::uno::RuntimeException );
398 
399     virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL
400     getBytes( sal_Int32 columnIndex )
401         throw( com::sun::star::sdbc::SQLException,
402                com::sun::star::uno::RuntimeException );
403 
404     virtual com::sun::star::util::Date SAL_CALL
405     getDate( sal_Int32 columnIndex )
406         throw( com::sun::star::sdbc::SQLException,
407                com::sun::star::uno::RuntimeException );
408 
409     virtual com::sun::star::util::Time SAL_CALL
410     getTime( sal_Int32 columnIndex )
411         throw( com::sun::star::sdbc::SQLException,
412                com::sun::star::uno::RuntimeException );
413 
414     virtual com::sun::star::util::DateTime SAL_CALL
415     getTimestamp( sal_Int32 columnIndex )
416         throw( com::sun::star::sdbc::SQLException,
417                com::sun::star::uno::RuntimeException );
418 
419     virtual com::sun::star::uno::Reference<
420                 com::sun::star::io::XInputStream > SAL_CALL
421     getBinaryStream( sal_Int32 columnIndex )
422         throw( com::sun::star::sdbc::SQLException,
423                com::sun::star::uno::RuntimeException );
424 
425     virtual com::sun::star::uno::Reference<
426                 com::sun::star::io::XInputStream > SAL_CALL
427     getCharacterStream( sal_Int32 columnIndex )
428         throw( com::sun::star::sdbc::SQLException,
429                com::sun::star::uno::RuntimeException );
430 
431     virtual com::sun::star::uno::Any SAL_CALL
432     getObject( sal_Int32 columnIndex,
433                const com::sun::star::uno::Reference<
434                 com::sun::star::container::XNameAccess >& typeMap )
435         throw( com::sun::star::sdbc::SQLException,
436                com::sun::star::uno::RuntimeException );
437 
438     virtual com::sun::star::uno::Reference<
439                 com::sun::star::sdbc::XRef > SAL_CALL
440     getRef( sal_Int32 columnIndex )
441         throw( com::sun::star::sdbc::SQLException,
442                com::sun::star::uno::RuntimeException );
443 
444     virtual com::sun::star::uno::Reference<
445                 com::sun::star::sdbc::XBlob > SAL_CALL
446     getBlob( sal_Int32 columnIndex )
447         throw( com::sun::star::sdbc::SQLException,
448                com::sun::star::uno::RuntimeException );
449 
450     virtual com::sun::star::uno::Reference<
451                 com::sun::star::sdbc::XClob > SAL_CALL
452     getClob( sal_Int32 columnIndex )
453         throw( com::sun::star::sdbc::SQLException,
454                com::sun::star::uno::RuntimeException );
455 
456     virtual com::sun::star::uno::Reference<
457                 com::sun::star::sdbc::XArray > SAL_CALL
458     getArray( sal_Int32 columnIndex )
459         throw( com::sun::star::sdbc::SQLException,
460                com::sun::star::uno::RuntimeException );
461 
462     //-----------------------------------------------------------------
463     // Type Converter support
464     //-----------------------------------------------------------------
465 
466 private:
467     sal_Bool m_bTriedToGetTypeConverter;
468     com::sun::star::uno::Reference<
469         com::sun::star::script::XTypeConverter > m_xTypeConverter;
470 
471     const com::sun::star::uno::Reference<
472         com::sun::star::script::XTypeConverter >& getTypeConverter();
473 };
474 
475 //=========================================================================
476 
477 class CachedContentResultSetFactory
478                 : public cppu::OWeakObject
479                 , public com::sun::star::lang::XTypeProvider
480                 , public com::sun::star::lang::XServiceInfo
481                 , public com::sun::star::ucb::XCachedContentResultSetFactory
482 {
483 protected:
484     com::sun::star::uno::Reference<
485         com::sun::star::lang::XMultiServiceFactory >    m_xSMgr;
486 
487 public:
488 
489     CachedContentResultSetFactory(
490         const com::sun::star::uno::Reference<
491         com::sun::star::lang::XMultiServiceFactory > & rSMgr);
492 
493     virtual ~CachedContentResultSetFactory();
494 
495     //-----------------------------------------------------------------
496     // XInterface
497     XINTERFACE_DECL()
498 
499     //-----------------------------------------------------------------
500     // XTypeProvider
501     XTYPEPROVIDER_DECL()
502 
503     //-----------------------------------------------------------------
504     // XServiceInfo
505     XSERVICEINFO_DECL()
506 
507     //-----------------------------------------------------------------
508     // XCachedContentResultSetFactory
509 
510     virtual com::sun::star::uno::Reference<
511                 com::sun::star::sdbc::XResultSet > SAL_CALL
512     createCachedContentResultSet(
513             const com::sun::star::uno::Reference<
514                 com::sun::star::sdbc::XResultSet > & xSource,
515             const com::sun::star::uno::Reference<
516                 com::sun::star::ucb::XContentIdentifierMapping > & xMapping )
517         throw( com::sun::star::uno::RuntimeException );
518 };
519 
520 #endif
521 
522