xref: /trunk/main/odk/examples/DevelopersGuide/Database/DriverSkeleton/SPreparedStatement.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  *  The Contents of this file are made available subject to the terms of
4  *  the BSD license.
5  *
6  *  Copyright 2000, 2010 Oracle and/or its affiliates.
7  *  All rights reserved.
8  *
9  *  Redistribution and use in source and binary forms, with or without
10  *  modification, are permitted provided that the following conditions
11  *  are met:
12  *  1. Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *  2. Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  *  3. Neither the name of Sun Microsystems, Inc. nor the names of its
18  *     contributors may be used to endorse or promote products derived
19  *     from this software without specific prior written permission.
20  *
21  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
30  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
31  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  *************************************************************************/
34 
35 #include <stdio.h>
36 #include <osl/diagnose.h>
37 #include "SPreparedStatement.hxx"
38 #include <com/sun/star/sdbc/DataType.hpp>
39 #include "SResultSetMetaData.hxx"
40 #include <cppuhelper/typeprovider.hxx>
41 #include <com/sun/star/lang/DisposedException.hpp>
42 #include "propertyids.hxx"
43 
44 using namespace connectivity::skeleton;
45 using namespace com::sun::star::uno;
46 using namespace com::sun::star::lang;
47 using namespace com::sun::star::beans;
48 using namespace com::sun::star::sdbc;
49 using namespace com::sun::star::container;
50 using namespace com::sun::star::io;
51 using namespace com::sun::star::util;
52 
53 IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.skeleton.PreparedStatement","com.sun.star.sdbc.PreparedStatement");
54 
55 
56 OPreparedStatement::OPreparedStatement( OConnection* _pConnection,const TTypeInfoVector& _TypeInfo,const ::rtl::OUString& sql)
57     :OStatement_BASE2(_pConnection)
58     ,m_aTypeInfo(_TypeInfo)
59     ,m_bPrepared(sal_False)
60     ,m_sSqlStatement(sql)
61     ,m_nNumParams(0)
62 {
63 }
64 // -----------------------------------------------------------------------------
65 OPreparedStatement::~OPreparedStatement()
66 {
67 }
68 // -----------------------------------------------------------------------------
69 void SAL_CALL OPreparedStatement::acquire() throw()
70 {
71     OStatement_BASE2::acquire();
72 }
73 // -----------------------------------------------------------------------------
74 void SAL_CALL OPreparedStatement::release() throw()
75 {
76     OStatement_BASE2::release();
77 }
78 // -----------------------------------------------------------------------------
79 Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException)
80 {
81     Any aRet = OStatement_BASE2::queryInterface(rType);
82     if(!aRet.hasValue())
83         aRet = OPreparedStatement_BASE::queryInterface(rType);
84     return aRet;
85 }
86 // -------------------------------------------------------------------------
87 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OPreparedStatement::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
88 {
89     return concatSequences(OPreparedStatement_BASE::getTypes(),OStatement_BASE2::getTypes());
90 }
91 // -------------------------------------------------------------------------
92 
93 Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData(  ) throw(SQLException, RuntimeException)
94 {
95     ::osl::MutexGuard aGuard( m_aMutex );
96     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
97 
98     if(!m_xMetaData.is())
99         m_xMetaData = new OResultSetMetaData(getOwnConnection());
100     return m_xMetaData;
101 }
102 // -------------------------------------------------------------------------
103 
104 void SAL_CALL OPreparedStatement::close(  ) throw(SQLException, RuntimeException)
105 {
106     ::osl::MutexGuard aGuard( m_aMutex );
107     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
108 
109 
110     // Reset last warning message
111 
112     try {
113         clearWarnings ();
114         OStatement_BASE2::close();
115     }
116     catch (SQLException &) {
117         // If we get an error, ignore
118     }
119 
120     // Remove this Statement object from the Connection object's
121     // list
122 }
123 // -------------------------------------------------------------------------
124 
125 sal_Bool SAL_CALL OPreparedStatement::execute(  ) throw(SQLException, RuntimeException)
126 {
127     ::osl::MutexGuard aGuard( m_aMutex );
128     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
129 
130 
131     // same as in statement with the difference that this statement also can contain parameter
132     return sal_False;
133 }
134 // -------------------------------------------------------------------------
135 
136 sal_Int32 SAL_CALL OPreparedStatement::executeUpdate(  ) throw(SQLException, RuntimeException)
137 {
138     ::osl::MutexGuard aGuard( m_aMutex );
139     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
140 
141     // same as in statement with the difference that this statement also can contain parameter
142     return 0;
143 }
144 // -------------------------------------------------------------------------
145 
146 void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException)
147 {
148     ::osl::MutexGuard aGuard( m_aMutex );
149     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
150 }
151 // -------------------------------------------------------------------------
152 
153 Reference< XConnection > SAL_CALL OPreparedStatement::getConnection(  ) throw(SQLException, RuntimeException)
154 {
155     ::osl::MutexGuard aGuard( m_aMutex );
156     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
157 
158     return (Reference< XConnection >)m_pConnection;
159 }
160 // -------------------------------------------------------------------------
161 
162 Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery(  ) throw(SQLException, RuntimeException)
163 {
164     ::osl::MutexGuard aGuard( m_aMutex );
165     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
166 
167     Reference< XResultSet > rs = NULL;
168 
169 
170     return rs;
171 }
172 // -------------------------------------------------------------------------
173 
174 void SAL_CALL OPreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(SQLException, RuntimeException)
175 {
176     ::osl::MutexGuard aGuard( m_aMutex );
177     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
178 
179 }
180 // -------------------------------------------------------------------------
181 void SAL_CALL OPreparedStatement::setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(SQLException, RuntimeException)
182 {
183     ::osl::MutexGuard aGuard( m_aMutex );
184     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
185 
186 
187 }
188 // -------------------------------------------------------------------------
189 
190 void SAL_CALL OPreparedStatement::setDate( sal_Int32 parameterIndex, const Date& aData ) throw(SQLException, RuntimeException)
191 {
192     ::osl::MutexGuard aGuard( m_aMutex );
193     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
194 
195 }
196 // -------------------------------------------------------------------------
197 
198 
199 void SAL_CALL OPreparedStatement::setTime( sal_Int32 parameterIndex, const Time& aVal ) throw(SQLException, RuntimeException)
200 {
201     ::osl::MutexGuard aGuard( m_aMutex );
202     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
203 
204 }
205 // -------------------------------------------------------------------------
206 
207 void SAL_CALL OPreparedStatement::setTimestamp( sal_Int32 parameterIndex, const DateTime& aVal ) throw(SQLException, RuntimeException)
208 {
209     ::osl::MutexGuard aGuard( m_aMutex );
210     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
211 
212 }
213 // -------------------------------------------------------------------------
214 
215 void SAL_CALL OPreparedStatement::setDouble( sal_Int32 parameterIndex, double x ) throw(SQLException, RuntimeException)
216 {
217     ::osl::MutexGuard aGuard( m_aMutex );
218     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
219 
220 }
221 
222 // -------------------------------------------------------------------------
223 
224 void SAL_CALL OPreparedStatement::setFloat( sal_Int32 parameterIndex, float x ) throw(SQLException, RuntimeException)
225 {
226     ::osl::MutexGuard aGuard( m_aMutex );
227     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
228 
229 }
230 // -------------------------------------------------------------------------
231 
232 void SAL_CALL OPreparedStatement::setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(SQLException, RuntimeException)
233 {
234     ::osl::MutexGuard aGuard( m_aMutex );
235     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
236 
237 }
238 // -------------------------------------------------------------------------
239 
240 void SAL_CALL OPreparedStatement::setLong( sal_Int32 parameterIndex, sal_Int64 aVal ) throw(SQLException, RuntimeException)
241 {
242     ::osl::MutexGuard aGuard( m_aMutex );
243     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
244 
245 }
246 // -------------------------------------------------------------------------
247 
248 void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) throw(SQLException, RuntimeException)
249 {
250     ::osl::MutexGuard aGuard( m_aMutex );
251     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
252 
253 }
254 // -------------------------------------------------------------------------
255 
256 void SAL_CALL OPreparedStatement::setClob( sal_Int32 parameterIndex, const Reference< XClob >& x ) throw(SQLException, RuntimeException)
257 {
258     ::osl::MutexGuard aGuard( m_aMutex );
259     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
260 
261 }
262 // -------------------------------------------------------------------------
263 
264 void SAL_CALL OPreparedStatement::setBlob( sal_Int32 parameterIndex, const Reference< XBlob >& x ) throw(SQLException, RuntimeException)
265 {
266     ::osl::MutexGuard aGuard( m_aMutex );
267     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
268 
269 }
270 // -------------------------------------------------------------------------
271 
272 void SAL_CALL OPreparedStatement::setArray( sal_Int32 parameterIndex, const Reference< XArray >& x ) throw(SQLException, RuntimeException)
273 {
274     ::osl::MutexGuard aGuard( m_aMutex );
275     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
276 
277 }
278 // -------------------------------------------------------------------------
279 
280 void SAL_CALL OPreparedStatement::setRef( sal_Int32 parameterIndex, const Reference< XRef >& x ) throw(SQLException, RuntimeException)
281 {
282     ::osl::MutexGuard aGuard( m_aMutex );
283     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
284 
285 }
286 // -------------------------------------------------------------------------
287 
288 void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, const Any& x, sal_Int32 sqlType, sal_Int32 scale ) throw(SQLException, RuntimeException)
289 {
290     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
291     ::osl::MutexGuard aGuard( m_aMutex );
292 
293 }
294 // -------------------------------------------------------------------------
295 
296 void SAL_CALL OPreparedStatement::setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName ) throw(SQLException, RuntimeException)
297 {
298     ::osl::MutexGuard aGuard( m_aMutex );
299     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
300 
301 }
302 // -------------------------------------------------------------------------
303 
304 void SAL_CALL OPreparedStatement::setObject( sal_Int32 parameterIndex, const Any& x ) throw(SQLException, RuntimeException)
305 {
306     ::osl::MutexGuard aGuard( m_aMutex );
307     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
308 
309 }
310 // -------------------------------------------------------------------------
311 
312 void SAL_CALL OPreparedStatement::setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(SQLException, RuntimeException)
313 {
314     ::osl::MutexGuard aGuard( m_aMutex );
315     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
316 
317 }
318 // -------------------------------------------------------------------------
319 
320 void SAL_CALL OPreparedStatement::setBytes( sal_Int32 parameterIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException)
321 {
322     ::osl::MutexGuard aGuard( m_aMutex );
323     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
324 
325 }
326 // -------------------------------------------------------------------------
327 
328 
329 void SAL_CALL OPreparedStatement::setCharacterStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
330 {
331     ::osl::MutexGuard aGuard( m_aMutex );
332     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
333 
334 }
335 // -------------------------------------------------------------------------
336 
337 void SAL_CALL OPreparedStatement::setBinaryStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
338 {
339     ::osl::MutexGuard aGuard( m_aMutex );
340     checkDisposed(OStatement_BASE::rBHelper.bDisposed);
341 
342 }
343 // -------------------------------------------------------------------------
344 
345 void SAL_CALL OPreparedStatement::clearParameters(  ) throw(SQLException, RuntimeException)
346 {
347 }
348 // -------------------------------------------------------------------------
349 void SAL_CALL OPreparedStatement::clearBatch(  ) throw(SQLException, RuntimeException)
350 {
351 }
352 // -------------------------------------------------------------------------
353 
354 void SAL_CALL OPreparedStatement::addBatch( ) throw(SQLException, RuntimeException)
355 {
356 }
357 // -------------------------------------------------------------------------
358 
359 Sequence< sal_Int32 > SAL_CALL OPreparedStatement::executeBatch(  ) throw(SQLException, RuntimeException)
360 {
361     return Sequence< sal_Int32 > ();
362 }
363 // -------------------------------------------------------------------------
364 void OPreparedStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception)
365 {
366     switch(nHandle)
367     {
368         case PROPERTY_ID_RESULTSETCONCURRENCY:
369             break;
370         case PROPERTY_ID_RESULTSETTYPE:
371             break;
372         case PROPERTY_ID_FETCHDIRECTION:
373             break;
374         case PROPERTY_ID_USEBOOKMARKS:
375             break;
376         default:
377             OStatement_Base::setFastPropertyValue_NoBroadcast(nHandle,rValue);
378     }
379 }
380 // -----------------------------------------------------------------------------
381 void OPreparedStatement::checkParameterIndex(sal_Int32 _parameterIndex)
382 {
383     if( !_parameterIndex || _parameterIndex > m_nNumParams)
384         throw SQLException();
385 }
386 // -----------------------------------------------------------------------------
387 
388 
389