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