xref: /trunk/main/ucb/source/ucp/file/filrow.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_ucb.hxx"
30 #include "filrow.hxx"
31 #include "shell.hxx"
32 #include "prov.hxx"
33 
34 using namespace fileaccess;
35 using namespace com::sun::star;
36 using namespace com::sun::star::uno;
37 //using namespace com::sun::star::ucb;
38 
39 
40 // Funktion for TypeConverting
41 
42 
43 template< class _type_ >
44 sal_Bool convert( shell* pShell,
45                   uno::Reference< script::XTypeConverter >& xConverter,
46                   uno::Any& rValue,
47                   _type_& aReturn  )
48 {
49     // Try first without converting
50     sal_Bool no_success = ! ( rValue >>= aReturn );
51 
52     if ( no_success )
53     {
54         if( ! xConverter.is() )
55         {
56             xConverter = uno::Reference< script::XTypeConverter >(
57                 pShell->m_xMultiServiceFactory->createInstance(
58                     rtl::OUString::createFromAscii( "com.sun.star.script.Converter" ) ),uno::UNO_QUERY );
59 
60 /*          DBG_ASSERT( m_xTypeConverter.is(),
61                         "PropertyValueSet::getTypeConverter() - "
62                         "Service 'com.sun.star.script.Converter' n/a!" );*/
63         }
64 
65         try
66         {
67             if( rValue.hasValue() )
68             {
69                 uno::Any aConvertedValue
70                     = xConverter->convertTo( rValue,getCppuType( static_cast< const _type_* >(0) ) );
71                 no_success = ! ( aConvertedValue >>= aReturn );
72             }
73             else
74                 no_success = sal_True;
75         }
76         catch ( lang::IllegalArgumentException )
77         {
78             no_success = sal_True;
79         }
80         catch ( script::CannotConvertException )
81         {
82             no_success = sal_True;
83         }
84     }
85     return no_success;
86 }
87 
88 
89 XRow_impl::XRow_impl( shell* pMyShell,const uno::Sequence< uno::Any >& seq )
90     : m_aValueMap( seq ),
91       m_pMyShell( pMyShell ),
92       m_xProvider( pMyShell->m_pProvider ),
93       m_xTypeConverter( 0 )
94 {
95 }
96 
97 XRow_impl::~XRow_impl()
98 {
99 }
100 
101 
102 void SAL_CALL
103 XRow_impl::acquire(
104            void )
105   throw()
106 {
107   OWeakObject::acquire();
108 }
109 
110 void SAL_CALL
111 XRow_impl::release(
112            void )
113   throw()
114 {
115   OWeakObject::release();
116 }
117 
118 
119 uno::Any SAL_CALL
120 XRow_impl::queryInterface(
121               const uno::Type& rType )
122   throw( uno::RuntimeException )
123 {
124   uno::Any aRet = cppu::queryInterface( rType,
125                     SAL_STATIC_CAST( lang::XTypeProvider*,this),
126                     SAL_STATIC_CAST( sdbc::XRow*,this) );
127   return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
128 }
129 
130 
131 XTYPEPROVIDER_IMPL_2( XRow_impl,
132                       lang::XTypeProvider,
133                       sdbc::XRow )
134 
135 
136 sal_Bool SAL_CALL
137 XRow_impl::wasNull(
138            void )
139   throw( sdbc::SQLException,
140      uno::RuntimeException)
141 {
142   return m_nWasNull;
143 }
144 
145 
146 rtl::OUString SAL_CALL
147 XRow_impl::getString(
148              sal_Int32 columnIndex )
149   throw( sdbc::SQLException,
150      uno::RuntimeException)
151 {
152   if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
153     throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
154   rtl::OUString  Value;
155   osl::MutexGuard aGuard( m_aMutex );
156   m_nWasNull = ::convert<rtl::OUString>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
157   return Value;
158 }
159 
160 sal_Bool SAL_CALL
161 XRow_impl::getBoolean(
162     sal_Int32 columnIndex )
163     throw( sdbc::SQLException,
164            uno::RuntimeException)
165 {
166     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
167         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
168     sal_Bool  Value( false );
169     osl::MutexGuard aGuard( m_aMutex );
170     m_nWasNull = ::convert<sal_Bool>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
171     return Value;
172 }
173 
174 
175 sal_Int8 SAL_CALL
176 XRow_impl::getByte(
177     sal_Int32 columnIndex )
178     throw( sdbc::SQLException,
179            uno::RuntimeException)
180 {
181     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
182         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
183     sal_Int8  Value( 0 );
184     osl::MutexGuard aGuard( m_aMutex );
185     m_nWasNull = ::convert<sal_Int8>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
186     return Value;
187 }
188 
189 sal_Int16 SAL_CALL
190 XRow_impl::getShort(
191     sal_Int32 columnIndex )
192     throw( sdbc::SQLException,
193            uno::RuntimeException)
194 {
195     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
196         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
197     sal_Int16  Value( 0 );
198     osl::MutexGuard aGuard( m_aMutex );
199     m_nWasNull = ::convert<sal_Int16>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
200     return Value;
201 }
202 
203 
204 sal_Int32 SAL_CALL
205 XRow_impl::getInt(
206           sal_Int32 columnIndex )
207     throw( sdbc::SQLException,
208            uno::RuntimeException)
209 {
210     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
211         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
212     sal_Int32  Value( 0 );
213     osl::MutexGuard aGuard( m_aMutex );
214     m_nWasNull = ::convert<sal_Int32>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
215     return Value;
216 }
217 
218 sal_Int64 SAL_CALL
219 XRow_impl::getLong(
220            sal_Int32 columnIndex )
221   throw( sdbc::SQLException,
222      uno::RuntimeException)
223 {
224     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
225         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
226     sal_Int64  Value( 0 );
227     osl::MutexGuard aGuard( m_aMutex );
228     m_nWasNull = ::convert<sal_Int64>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
229     return Value;
230 }
231 
232 float SAL_CALL
233 XRow_impl::getFloat(
234     sal_Int32 columnIndex )
235     throw( sdbc::SQLException,
236            uno::RuntimeException)
237 {
238     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
239         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
240     float  Value( 0 );
241     osl::MutexGuard aGuard( m_aMutex );
242     m_nWasNull = ::convert<float>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
243     return Value;
244 }
245 
246 double SAL_CALL
247 XRow_impl::getDouble(
248     sal_Int32 columnIndex )
249     throw( sdbc::SQLException,
250            uno::RuntimeException)
251 {
252     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
253         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
254     double  Value( 0 );
255     osl::MutexGuard aGuard( m_aMutex );
256     m_nWasNull = ::convert<double>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
257     return Value;
258 }
259 
260 uno::Sequence< sal_Int8 > SAL_CALL
261 XRow_impl::getBytes(
262     sal_Int32 columnIndex )
263     throw( sdbc::SQLException,
264            uno::RuntimeException)
265 {
266     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
267         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
268     uno::Sequence< sal_Int8 >  Value(0);
269     osl::MutexGuard aGuard( m_aMutex );
270     m_nWasNull = ::convert<uno::Sequence< sal_Int8 > >( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
271     return Value;
272 }
273 
274 util::Date SAL_CALL
275 XRow_impl::getDate(
276     sal_Int32 columnIndex )
277     throw( sdbc::SQLException,
278            uno::RuntimeException)
279 {
280     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
281         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
282     util::Date  Value;
283     osl::MutexGuard aGuard( m_aMutex );
284     m_nWasNull = ::convert<util::Date>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
285     return Value;
286 }
287 
288 util::Time SAL_CALL
289 XRow_impl::getTime(
290     sal_Int32 columnIndex )
291   throw( sdbc::SQLException,
292          uno::RuntimeException)
293 {
294     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
295         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
296     util::Time  Value;
297     osl::MutexGuard aGuard( m_aMutex );
298     m_nWasNull = ::convert<util::Time>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
299     return Value;
300 }
301 
302 util::DateTime SAL_CALL
303 XRow_impl::getTimestamp(
304             sal_Int32 columnIndex )
305   throw( sdbc::SQLException,
306      uno::RuntimeException)
307 {
308   if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
309     throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
310   util::DateTime  Value;
311   osl::MutexGuard aGuard( m_aMutex );
312   m_nWasNull = ::convert<util::DateTime>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
313   return Value;
314 }
315 
316 
317 uno::Reference< io::XInputStream > SAL_CALL
318 XRow_impl::getBinaryStream(
319                sal_Int32 columnIndex )
320   throw( sdbc::SQLException,
321      uno::RuntimeException)
322 {
323   if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
324     throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
325   uno::Reference< io::XInputStream >  Value;
326   osl::MutexGuard aGuard( m_aMutex );
327   m_nWasNull = ::convert<uno::Reference< io::XInputStream > >( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
328   return Value;
329 }
330 
331 
332 uno::Reference< io::XInputStream > SAL_CALL
333 XRow_impl::getCharacterStream(
334                   sal_Int32 columnIndex )
335     throw( sdbc::SQLException,
336            uno::RuntimeException)
337 {
338   if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
339       throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
340   uno::Reference< io::XInputStream > Value;
341   osl::MutexGuard aGuard( m_aMutex );
342   m_nWasNull = ::convert< uno::Reference< io::XInputStream> >( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
343   return Value;
344 }
345 
346 
347 uno::Any SAL_CALL
348 XRow_impl::getObject(
349     sal_Int32 columnIndex,
350     const uno::Reference< container::XNameAccess >& )
351     throw( sdbc::SQLException,
352            uno::RuntimeException)
353 {
354     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
355         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
356     uno::Any  Value;
357     osl::MutexGuard aGuard( m_aMutex );
358     m_nWasNull = ::convert<uno::Any>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value );
359     return Value;
360 }
361 
362 uno::Reference< sdbc::XRef > SAL_CALL
363 XRow_impl::getRef(
364     sal_Int32 columnIndex )
365     throw( sdbc::SQLException,
366            uno::RuntimeException)
367 {
368     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
369         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
370     uno::Reference< sdbc::XRef > Value;
371     osl::MutexGuard aGuard( m_aMutex );
372     m_nWasNull = ::convert<uno::Reference< sdbc::XRef> >( m_pMyShell,
373                                                           m_xTypeConverter,
374                                                           m_aValueMap[ --columnIndex ],
375                                                           Value );
376     return Value;
377 }
378 
379 uno::Reference< sdbc::XBlob > SAL_CALL
380 XRow_impl::getBlob(
381            sal_Int32 columnIndex )
382   throw( sdbc::SQLException,
383      uno::RuntimeException)
384 {
385     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
386         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
387     uno::Reference< sdbc::XBlob > Value;
388     osl::MutexGuard aGuard( m_aMutex );
389     m_nWasNull = ::convert<uno::Reference< sdbc::XBlob> >( m_pMyShell,
390                                                            m_xTypeConverter,
391                                                            m_aValueMap[ --columnIndex ],
392                                                            Value );
393     return Value;
394 }
395 
396 uno::Reference< sdbc::XClob > SAL_CALL
397 XRow_impl::getClob(
398            sal_Int32 columnIndex )
399   throw( sdbc::SQLException,
400      uno::RuntimeException)
401 {
402     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
403         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
404     uno::Reference< sdbc::XClob > Value;
405     osl::MutexGuard aGuard( m_aMutex );
406     m_nWasNull = ::convert<uno::Reference< sdbc::XClob> >( m_pMyShell,
407                                                            m_xTypeConverter,
408                                                            m_aValueMap[ --columnIndex ],
409                                                            Value );
410     return Value;
411 }
412 
413 
414 uno::Reference< sdbc::XArray > SAL_CALL
415 XRow_impl::getArray(
416     sal_Int32 columnIndex )
417     throw( sdbc::SQLException,
418            uno::RuntimeException)
419 {
420     if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() )
421         throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() );
422     uno::Reference< sdbc::XArray > Value;
423     osl::MutexGuard aGuard( m_aMutex );
424     m_nWasNull = ::convert<uno::Reference< sdbc::XArray> >( m_pMyShell,
425                                                             m_xTypeConverter,
426                                                             m_aValueMap[ --columnIndex ],
427                                                             Value );
428     return Value;
429 }
430