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_dbaccess.hxx"
30 #ifndef _DBACORE_DATACOLUMN_HXX_
31 #include "datacolumn.hxx"
32 #endif
33 #ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
34 #include <com/sun/star/lang/DisposedException.hpp>
35 #endif
36 #ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
37 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
38 #endif
39 #ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
40 #include <com/sun/star/sdbc/DataType.hpp>
41 #endif
42 #ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
43 #include <com/sun/star/sdbc/ColumnValue.hpp>
44 #endif
45 #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
46 #include <cppuhelper/typeprovider.hxx>
47 #endif
48 #ifndef _TOOLS_DEBUG_HXX
49 #include <tools/debug.hxx>
50 #endif
51 #ifndef DBACCESS_SHARED_DBASTRINGS_HRC
52 #include "dbastrings.hrc"
53 #endif
54 #ifndef _DBASHARED_APITOOLS_HXX_
55 #include "apitools.hxx"
56 #endif
57 
58 using namespace dbaccess;
59 using namespace ::com::sun::star::sdbc;
60 using namespace ::com::sun::star::sdb;
61 using namespace ::com::sun::star::beans;
62 using namespace ::com::sun::star::uno;
63 using namespace ::com::sun::star::lang;
64 using namespace ::com::sun::star::container;
65 using namespace ::osl;
66 using namespace ::comphelper;
67 using namespace ::cppu;
68 
69 DBG_NAME(ODataColumn)
70 //--------------------------------------------------------------------------
71 ODataColumn::ODataColumn(
72 						 const Reference < XResultSetMetaData >& _xMetaData,
73 						 const Reference < XRow >& _xRow,
74 						 const Reference < XRowUpdate >& _xRowUpdate,
75 						 sal_Int32 _nPos,
76                          const Reference< XDatabaseMetaData >& _rxDBMeta)
77 					 :OResultColumn(_xMetaData, _nPos, _rxDBMeta)
78 					 ,m_xRow(_xRow)
79 					 ,m_xRowUpdate(_xRowUpdate)
80 {
81 	DBG_CTOR(ODataColumn,NULL);
82 }
83 // -----------------------------------------------------------------------------
84 ODataColumn::~ODataColumn()
85 {
86 	DBG_DTOR(ODataColumn,NULL);
87 }
88 
89 // com::sun::star::lang::XTypeProvider
90 //--------------------------------------------------------------------------
91 Sequence< Type > ODataColumn::getTypes() throw (RuntimeException)
92 {
93 	OTypeCollection aTypes(::getCppuType( (const Reference< XColumn > *)0 ),
94 						   ::getCppuType( (const Reference< XColumnUpdate > *)0 ),
95 						   OColumn::getTypes());
96 	return aTypes.getTypes();
97 }
98 
99 //--------------------------------------------------------------------------
100 Sequence< sal_Int8 > ODataColumn::getImplementationId() throw (RuntimeException)
101 {
102 	static OImplementationId * pId = 0;
103 	if (! pId)
104 	{
105 		MutexGuard aGuard( Mutex::getGlobalMutex() );
106 		if (! pId)
107 		{
108 			static OImplementationId aId;
109 			pId = &aId;
110 		}
111 	}
112 	return pId->getImplementationId();
113 }
114 
115 //------------------------------------------------------------------------------
116 Any SAL_CALL ODataColumn::queryInterface( const Type & _rType ) throw (RuntimeException)
117 {
118 	Any aReturn = OResultColumn::queryInterface(_rType);
119 	if (!aReturn.hasValue())
120 		aReturn = ::cppu::queryInterface(_rType,
121 			static_cast< XColumn* >(this),
122 			static_cast< XColumnUpdate* >(this)
123 		);
124 	return aReturn;
125 }
126 
127 // XServiceInfo
128 //------------------------------------------------------------------------------
129 rtl::OUString ODataColumn::getImplementationName(  ) throw(RuntimeException)
130 {
131 	return rtl::OUString::createFromAscii("com.sun.star.sdb.ODataColumn");
132 }
133 
134 //------------------------------------------------------------------------------
135 Sequence< ::rtl::OUString > ODataColumn::getSupportedServiceNames(  ) throw (RuntimeException)
136 {
137 	Sequence< ::rtl::OUString > aSNS( 3 );
138 	aSNS[0] = SERVICE_SDBCX_COLUMN;
139 	aSNS[1] = SERVICE_SDB_RESULTCOLUMN;
140 	aSNS[2] = SERVICE_SDB_DATACOLUMN;
141 	return aSNS;
142 }
143 
144 // OComponentHelper
145 //------------------------------------------------------------------------------
146 void ODataColumn::disposing()
147 {
148 	OResultColumn::disposing();
149 
150 	m_xRow = NULL;
151 	m_xRowUpdate = NULL;
152 }
153 
154 // ::com::sun::star::sdb::XColumn
155 //------------------------------------------------------------------------------
156 sal_Bool ODataColumn::wasNull(void) throw( SQLException, RuntimeException )
157 {
158 	MutexGuard aGuard(m_aMutex);
159 	::connectivity::checkDisposed(!m_xRow.is());
160 
161 	return m_xRow->wasNull();
162 }
163 
164 //------------------------------------------------------------------------------
165 rtl::OUString ODataColumn::getString(void) throw( SQLException, RuntimeException )
166 {
167 	MutexGuard aGuard(m_aMutex);
168 	::connectivity::checkDisposed(!m_xRow.is());
169 
170 	return m_xRow->getString(m_nPos);
171 }
172 
173 //------------------------------------------------------------------------------
174 sal_Bool ODataColumn::getBoolean(void) throw( SQLException, RuntimeException )
175 {
176 	MutexGuard aGuard(m_aMutex);
177 	::connectivity::checkDisposed(!m_xRow.is());
178 
179 	return m_xRow->getBoolean(m_nPos);
180 }
181 
182 //------------------------------------------------------------------------------
183 sal_Int8 ODataColumn::getByte(void) throw( SQLException, RuntimeException )
184 {
185 	MutexGuard aGuard(m_aMutex);
186 	::connectivity::checkDisposed(!m_xRow.is());
187 
188 	return m_xRow->getByte(m_nPos);
189 }
190 
191 //------------------------------------------------------------------------------
192 sal_Int16 ODataColumn::getShort(void) throw( SQLException, RuntimeException )
193 {
194 	MutexGuard aGuard(m_aMutex);
195 	::connectivity::checkDisposed(!m_xRow.is());
196 
197 	return m_xRow->getShort(m_nPos);
198 }
199 
200 //------------------------------------------------------------------------------
201 sal_Int32 ODataColumn::getInt(void) throw( SQLException, RuntimeException )
202 {
203 	MutexGuard aGuard(m_aMutex);
204 	::connectivity::checkDisposed(!m_xRow.is());
205 
206 	return m_xRow->getInt(m_nPos);
207 }
208 
209 //------------------------------------------------------------------------------
210 sal_Int64 ODataColumn::getLong(void) throw( SQLException, RuntimeException )
211 {
212 	MutexGuard aGuard(m_aMutex);
213 	::connectivity::checkDisposed(!m_xRow.is());
214 
215 	return m_xRow->getLong(m_nPos);
216 }
217 
218 //------------------------------------------------------------------------------
219 float ODataColumn::getFloat(void) throw( SQLException, RuntimeException )
220 {
221 	MutexGuard aGuard(m_aMutex);
222 	::connectivity::checkDisposed(!m_xRow.is());
223 
224 	return m_xRow->getFloat(m_nPos);
225 }
226 //------------------------------------------------------------------------------
227 double ODataColumn::getDouble(void) throw( SQLException, RuntimeException )
228 {
229 	MutexGuard aGuard(m_aMutex);
230 	::connectivity::checkDisposed(!m_xRow.is());
231 
232 	return m_xRow->getDouble(m_nPos);
233 }
234 
235 //------------------------------------------------------------------------------
236 Sequence< sal_Int8 > ODataColumn::getBytes(void) throw( SQLException, RuntimeException )
237 {
238 	MutexGuard aGuard(m_aMutex);
239 	::connectivity::checkDisposed(!m_xRow.is());
240 
241 	return m_xRow->getBytes(m_nPos);
242 }
243 //------------------------------------------------------------------------------
244 com::sun::star::util::Date ODataColumn::getDate(void) throw( SQLException, RuntimeException )
245 {
246 	MutexGuard aGuard(m_aMutex);
247 	::connectivity::checkDisposed(!m_xRow.is());
248 
249 	return m_xRow->getDate(m_nPos);
250 }
251 
252 //------------------------------------------------------------------------------
253 com::sun::star::util::Time ODataColumn::getTime(void) throw( SQLException, RuntimeException )
254 {
255 	MutexGuard aGuard(m_aMutex);
256 	::connectivity::checkDisposed(!m_xRow.is());
257 
258 	return m_xRow->getTime(m_nPos);
259 }
260 //------------------------------------------------------------------------------
261 com::sun::star::util::DateTime ODataColumn::getTimestamp(void) throw( SQLException, RuntimeException )
262 {
263 	MutexGuard aGuard(m_aMutex);
264 	::connectivity::checkDisposed(!m_xRow.is());
265 
266 	return m_xRow->getTimestamp(m_nPos);
267 }
268 
269 //------------------------------------------------------------------------------
270 Reference< ::com::sun::star::io::XInputStream >  ODataColumn::getBinaryStream(void) throw( SQLException, RuntimeException )
271 {
272 	MutexGuard aGuard(m_aMutex);
273 	::connectivity::checkDisposed(!m_xRow.is());
274 
275 	return m_xRow->getBinaryStream(m_nPos);
276 }
277 
278 //------------------------------------------------------------------------------
279 Reference< ::com::sun::star::io::XInputStream >  ODataColumn::getCharacterStream(void) throw( SQLException, RuntimeException )
280 {
281 	MutexGuard aGuard(m_aMutex);
282 	::connectivity::checkDisposed(!m_xRow.is());
283 
284 	return m_xRow->getCharacterStream(m_nPos);
285 }
286 
287 //------------------------------------------------------------------------------
288 Any ODataColumn::getObject(const Reference< ::com::sun::star::container::XNameAccess > & typeMap) throw( SQLException, RuntimeException )
289 {
290 	MutexGuard aGuard(m_aMutex);
291 	::connectivity::checkDisposed(!m_xRow.is());
292 
293 	return m_xRow->getObject(m_nPos, typeMap);
294 }
295 
296 //------------------------------------------------------------------------------
297 Reference< XRef >  ODataColumn::getRef(void) throw( SQLException, RuntimeException )
298 {
299 	MutexGuard aGuard(m_aMutex);
300 	::connectivity::checkDisposed(!m_xRow.is());
301 
302 	return m_xRow->getRef(m_nPos);
303 }
304 
305 //------------------------------------------------------------------------------
306 Reference< XBlob >  ODataColumn::getBlob(void) throw( SQLException, RuntimeException )
307 {
308 	MutexGuard aGuard(m_aMutex);
309 	::connectivity::checkDisposed(!m_xRow.is());
310 
311 	return m_xRow->getBlob(m_nPos);
312 }
313 
314 //------------------------------------------------------------------------------
315 Reference< XClob >  ODataColumn::getClob(void) throw( SQLException, RuntimeException )
316 {
317 	MutexGuard aGuard(m_aMutex);
318 	::connectivity::checkDisposed(!m_xRow.is());
319 
320 	return m_xRow->getClob(m_nPos);
321 }
322 
323 //------------------------------------------------------------------------------
324 Reference< XArray >  ODataColumn::getArray(void) throw( SQLException, RuntimeException )
325 {
326 	MutexGuard aGuard(m_aMutex);
327 	::connectivity::checkDisposed(!m_xRow.is());
328 
329 	return m_xRow->getArray(m_nPos);
330 }
331 
332 // ::com::sun::star::sdb::XColumnUpdate
333 //------------------------------------------------------------------------------
334 void ODataColumn::updateNull(void) throw( SQLException, RuntimeException )
335 {
336 	MutexGuard aGuard( m_aMutex );
337 	::connectivity::checkDisposed(!m_xRowUpdate.is());
338 
339 	m_xRowUpdate->updateNull(m_nPos);
340 }
341 
342 //------------------------------------------------------------------------------
343 void ODataColumn::updateBoolean(sal_Bool x) throw( SQLException, RuntimeException )
344 {
345 	MutexGuard aGuard( m_aMutex );
346 	::connectivity::checkDisposed(!m_xRowUpdate.is());
347 
348 	m_xRowUpdate->updateBoolean(m_nPos, x);
349 }
350 
351 //------------------------------------------------------------------------------
352 void ODataColumn::updateByte(sal_Int8 x) throw( SQLException, RuntimeException )
353 {
354 	MutexGuard aGuard( m_aMutex );
355 	::connectivity::checkDisposed(!m_xRowUpdate.is());
356 
357 	m_xRowUpdate->updateByte(m_nPos, x);
358 }
359 
360 //------------------------------------------------------------------------------
361 void ODataColumn::updateShort(sal_Int16 x) throw( SQLException, RuntimeException )
362 {
363 	MutexGuard aGuard( m_aMutex );
364 	::connectivity::checkDisposed(!m_xRowUpdate.is());
365 
366 	m_xRowUpdate->updateShort(m_nPos, x);
367 }
368 
369 //------------------------------------------------------------------------------
370 void ODataColumn::updateInt(sal_Int32 x) throw( SQLException, RuntimeException )
371 {
372 	MutexGuard aGuard( m_aMutex );
373 	::connectivity::checkDisposed(!m_xRowUpdate.is());
374 
375 	m_xRowUpdate->updateInt(m_nPos, x);
376 }
377 
378 //------------------------------------------------------------------------------
379 void ODataColumn::updateLong(sal_Int64 x) throw( SQLException, RuntimeException )
380 {
381 	MutexGuard aGuard( m_aMutex );
382 	::connectivity::checkDisposed(!m_xRowUpdate.is());
383 
384 	m_xRowUpdate->updateLong(m_nPos, x);
385 }
386 
387 //------------------------------------------------------------------------------
388 void ODataColumn::updateFloat(float x) throw( SQLException, RuntimeException )
389 {
390 	MutexGuard aGuard( m_aMutex );
391 	::connectivity::checkDisposed(!m_xRowUpdate.is());
392 
393 	m_xRowUpdate->updateFloat(m_nPos, x);
394 }
395 
396 //------------------------------------------------------------------------------
397 void ODataColumn::updateDouble(double x) throw( SQLException, RuntimeException )
398 {
399 	MutexGuard aGuard( m_aMutex );
400 	::connectivity::checkDisposed(!m_xRowUpdate.is());
401 
402 	m_xRowUpdate->updateDouble(m_nPos, x);
403 }
404 
405 //------------------------------------------------------------------------------
406 void ODataColumn::updateString(const rtl::OUString& x) throw( SQLException, RuntimeException )
407 {
408 	MutexGuard aGuard( m_aMutex );
409 	::connectivity::checkDisposed(!m_xRowUpdate.is());
410 
411 	m_xRowUpdate->updateString(m_nPos, x);
412 }
413 
414 //------------------------------------------------------------------------------
415 void ODataColumn::updateBytes(const Sequence< sal_Int8 >& x) throw( SQLException, RuntimeException )
416 {
417 	MutexGuard aGuard( m_aMutex );
418 	::connectivity::checkDisposed(!m_xRowUpdate.is());
419 
420 	m_xRowUpdate->updateBytes(m_nPos, x);
421 }
422 
423 //------------------------------------------------------------------------------
424 void ODataColumn::updateDate(const com::sun::star::util::Date& x) throw( SQLException, RuntimeException )
425 {
426 	MutexGuard aGuard( m_aMutex );
427 	::connectivity::checkDisposed(!m_xRowUpdate.is());
428 
429 	m_xRowUpdate->updateDate(m_nPos, x);
430 }
431 
432 //------------------------------------------------------------------------------
433 void ODataColumn::updateTime(const ::com::sun::star::util::Time& x) throw( SQLException, RuntimeException )
434 {
435 	MutexGuard aGuard( m_aMutex );
436 	::connectivity::checkDisposed(!m_xRowUpdate.is());
437 
438 	m_xRowUpdate->updateTime(m_nPos, x);
439 }
440 
441 //------------------------------------------------------------------------------
442 void ODataColumn::updateTimestamp(const ::com::sun::star::util::DateTime& x) throw( SQLException, RuntimeException )
443 {
444 	MutexGuard aGuard( m_aMutex );
445 	::connectivity::checkDisposed(!m_xRowUpdate.is());
446 
447 	m_xRowUpdate->updateTimestamp(m_nPos, x);
448 }
449 
450 //------------------------------------------------------------------------------
451 void ODataColumn::updateCharacterStream(const Reference< ::com::sun::star::io::XInputStream > & x, sal_Int32 length) throw( SQLException, RuntimeException )
452 {
453 	MutexGuard aGuard( m_aMutex );
454 	::connectivity::checkDisposed(!m_xRowUpdate.is());
455 
456 	m_xRowUpdate->updateCharacterStream(m_nPos, x, length);
457 }
458 
459 //------------------------------------------------------------------------------
460 void ODataColumn::updateBinaryStream(const Reference< ::com::sun::star::io::XInputStream > & x, sal_Int32 length) throw( SQLException, RuntimeException )
461 {
462 	MutexGuard aGuard( m_aMutex );
463 	::connectivity::checkDisposed(!m_xRowUpdate.is());
464 
465 	m_xRowUpdate->updateBinaryStream(m_nPos, x, length);
466 }
467 
468 //------------------------------------------------------------------------------
469 void ODataColumn::updateNumericObject(const Any& x, sal_Int32 scale) throw( SQLException, RuntimeException )
470 {
471 	MutexGuard aGuard( m_aMutex );
472 	::connectivity::checkDisposed(!m_xRowUpdate.is());
473 
474 	m_xRowUpdate->updateNumericObject(m_nPos, x, scale);
475 }
476 
477 //------------------------------------------------------------------------------
478 void ODataColumn::updateObject(const Any& x) throw( SQLException, RuntimeException )
479 {
480 	MutexGuard aGuard( m_aMutex );
481 	::connectivity::checkDisposed(!m_xRowUpdate.is());
482 
483 	m_xRowUpdate->updateObject(m_nPos, x);
484 }
485 
486