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_ > 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 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 93 XRow_impl::~XRow_impl() 94 { 95 } 96 97 98 void SAL_CALL 99 XRow_impl::acquire( 100 void ) 101 throw() 102 { 103 OWeakObject::acquire(); 104 } 105 106 void SAL_CALL 107 XRow_impl::release( 108 void ) 109 throw() 110 { 111 OWeakObject::release(); 112 } 113 114 115 uno::Any SAL_CALL 116 XRow_impl::queryInterface( 117 const uno::Type& rType ) 118 { 119 uno::Any aRet = cppu::queryInterface( rType, 120 SAL_STATIC_CAST( lang::XTypeProvider*,this), 121 SAL_STATIC_CAST( sdbc::XRow*,this) ); 122 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); 123 } 124 125 126 XTYPEPROVIDER_IMPL_2( XRow_impl, 127 lang::XTypeProvider, 128 sdbc::XRow ) 129 130 131 sal_Bool SAL_CALL 132 XRow_impl::wasNull( 133 void ) 134 { 135 return m_nWasNull; 136 } 137 138 139 rtl::OUString SAL_CALL 140 XRow_impl::getString( 141 sal_Int32 columnIndex ) 142 { 143 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 144 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 145 rtl::OUString Value; 146 osl::MutexGuard aGuard( m_aMutex ); 147 m_nWasNull = ::convert<rtl::OUString>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 148 return Value; 149 } 150 151 sal_Bool SAL_CALL 152 XRow_impl::getBoolean( 153 sal_Int32 columnIndex ) 154 { 155 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 156 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 157 sal_Bool Value( false ); 158 osl::MutexGuard aGuard( m_aMutex ); 159 m_nWasNull = ::convert<sal_Bool>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 160 return Value; 161 } 162 163 164 sal_Int8 SAL_CALL 165 XRow_impl::getByte( 166 sal_Int32 columnIndex ) 167 { 168 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 169 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 170 sal_Int8 Value( 0 ); 171 osl::MutexGuard aGuard( m_aMutex ); 172 m_nWasNull = ::convert<sal_Int8>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 173 return Value; 174 } 175 176 sal_Int16 SAL_CALL 177 XRow_impl::getShort( 178 sal_Int32 columnIndex ) 179 { 180 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 181 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 182 sal_Int16 Value( 0 ); 183 osl::MutexGuard aGuard( m_aMutex ); 184 m_nWasNull = ::convert<sal_Int16>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 185 return Value; 186 } 187 188 189 sal_Int32 SAL_CALL 190 XRow_impl::getInt( 191 sal_Int32 columnIndex ) 192 { 193 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 194 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 195 sal_Int32 Value( 0 ); 196 osl::MutexGuard aGuard( m_aMutex ); 197 m_nWasNull = ::convert<sal_Int32>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 198 return Value; 199 } 200 201 sal_Int64 SAL_CALL 202 XRow_impl::getLong( 203 sal_Int32 columnIndex ) 204 { 205 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 206 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 207 sal_Int64 Value( 0 ); 208 osl::MutexGuard aGuard( m_aMutex ); 209 m_nWasNull = ::convert<sal_Int64>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 210 return Value; 211 } 212 213 float SAL_CALL 214 XRow_impl::getFloat( 215 sal_Int32 columnIndex ) 216 { 217 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 218 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 219 float Value( 0 ); 220 osl::MutexGuard aGuard( m_aMutex ); 221 m_nWasNull = ::convert<float>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 222 return Value; 223 } 224 225 double SAL_CALL 226 XRow_impl::getDouble( 227 sal_Int32 columnIndex ) 228 { 229 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 230 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 231 double Value( 0 ); 232 osl::MutexGuard aGuard( m_aMutex ); 233 m_nWasNull = ::convert<double>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 234 return Value; 235 } 236 237 uno::Sequence< sal_Int8 > SAL_CALL 238 XRow_impl::getBytes( 239 sal_Int32 columnIndex ) 240 { 241 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 242 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 243 uno::Sequence< sal_Int8 > Value(0); 244 osl::MutexGuard aGuard( m_aMutex ); 245 m_nWasNull = ::convert<uno::Sequence< sal_Int8 > >( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 246 return Value; 247 } 248 249 util::Date SAL_CALL 250 XRow_impl::getDate( 251 sal_Int32 columnIndex ) 252 { 253 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 254 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 255 util::Date Value; 256 osl::MutexGuard aGuard( m_aMutex ); 257 m_nWasNull = ::convert<util::Date>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 258 return Value; 259 } 260 261 util::Time SAL_CALL 262 XRow_impl::getTime( 263 sal_Int32 columnIndex ) 264 { 265 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 266 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 267 util::Time Value; 268 osl::MutexGuard aGuard( m_aMutex ); 269 m_nWasNull = ::convert<util::Time>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 270 return Value; 271 } 272 273 util::DateTime SAL_CALL 274 XRow_impl::getTimestamp( 275 sal_Int32 columnIndex ) 276 { 277 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 278 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 279 util::DateTime Value; 280 osl::MutexGuard aGuard( m_aMutex ); 281 m_nWasNull = ::convert<util::DateTime>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 282 return Value; 283 } 284 285 286 uno::Reference< io::XInputStream > SAL_CALL 287 XRow_impl::getBinaryStream( 288 sal_Int32 columnIndex ) 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 uno::Reference< io::XInputStream > Value; 293 osl::MutexGuard aGuard( m_aMutex ); 294 m_nWasNull = ::convert<uno::Reference< io::XInputStream > >( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 295 return Value; 296 } 297 298 299 uno::Reference< io::XInputStream > SAL_CALL 300 XRow_impl::getCharacterStream( 301 sal_Int32 columnIndex ) 302 { 303 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 304 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 305 uno::Reference< io::XInputStream > Value; 306 osl::MutexGuard aGuard( m_aMutex ); 307 m_nWasNull = ::convert< uno::Reference< io::XInputStream> >( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 308 return Value; 309 } 310 311 312 uno::Any SAL_CALL 313 XRow_impl::getObject( 314 sal_Int32 columnIndex, 315 const uno::Reference< container::XNameAccess >& ) 316 { 317 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 318 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 319 uno::Any Value; 320 osl::MutexGuard aGuard( m_aMutex ); 321 m_nWasNull = ::convert<uno::Any>( m_pMyShell,m_xTypeConverter,m_aValueMap[ --columnIndex ],Value ); 322 return Value; 323 } 324 325 uno::Reference< sdbc::XRef > SAL_CALL 326 XRow_impl::getRef( 327 sal_Int32 columnIndex ) 328 { 329 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 330 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 331 uno::Reference< sdbc::XRef > Value; 332 osl::MutexGuard aGuard( m_aMutex ); 333 m_nWasNull = ::convert<uno::Reference< sdbc::XRef> >( m_pMyShell, 334 m_xTypeConverter, 335 m_aValueMap[ --columnIndex ], 336 Value ); 337 return Value; 338 } 339 340 uno::Reference< sdbc::XBlob > SAL_CALL 341 XRow_impl::getBlob( 342 sal_Int32 columnIndex ) 343 { 344 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 345 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 346 uno::Reference< sdbc::XBlob > Value; 347 osl::MutexGuard aGuard( m_aMutex ); 348 m_nWasNull = ::convert<uno::Reference< sdbc::XBlob> >( m_pMyShell, 349 m_xTypeConverter, 350 m_aValueMap[ --columnIndex ], 351 Value ); 352 return Value; 353 } 354 355 uno::Reference< sdbc::XClob > SAL_CALL 356 XRow_impl::getClob( 357 sal_Int32 columnIndex ) 358 { 359 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 360 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 361 uno::Reference< sdbc::XClob > Value; 362 osl::MutexGuard aGuard( m_aMutex ); 363 m_nWasNull = ::convert<uno::Reference< sdbc::XClob> >( m_pMyShell, 364 m_xTypeConverter, 365 m_aValueMap[ --columnIndex ], 366 Value ); 367 return Value; 368 } 369 370 371 uno::Reference< sdbc::XArray > SAL_CALL 372 XRow_impl::getArray( 373 sal_Int32 columnIndex ) 374 { 375 if( columnIndex < 1 || columnIndex > m_aValueMap.getLength() ) 376 throw sdbc::SQLException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), ::rtl::OUString(), 0, uno::Any() ); 377 uno::Reference< sdbc::XArray > Value; 378 osl::MutexGuard aGuard( m_aMutex ); 379 m_nWasNull = ::convert<uno::Reference< sdbc::XArray> >( m_pMyShell, 380 m_xTypeConverter, 381 m_aValueMap[ --columnIndex ], 382 Value ); 383 return Value; 384 } 385