OSDN Git Service

import
[luz/luz.git] / luz2 / src / com / lavans / luz2 / sql / cluster / ClusterPreparedStatement.java
1 /* $Id: ClusterPreparedStatement.java 94 2008-12-18 11:07:17Z dobashi $\r
2  * create: 2004/10/25\r
3  * (c)2004 Lavans Networks Inc. All Rights Reserved.\r
4  */\r
5 package com.lavans.luz2.sql.cluster;\r
6 \r
7 import java.io.InputStream;\r
8 import java.io.Reader;\r
9 import java.math.BigDecimal;\r
10 import java.net.URL;\r
11 import java.sql.Array;\r
12 import java.sql.Blob;\r
13 import java.sql.Clob;\r
14 import java.sql.Date;\r
15 import java.sql.NClob;\r
16 import java.sql.ParameterMetaData;\r
17 import java.sql.PreparedStatement;\r
18 import java.sql.Ref;\r
19 import java.sql.ResultSet;\r
20 import java.sql.ResultSetMetaData;\r
21 import java.sql.RowId;\r
22 import java.sql.SQLException;\r
23 import java.sql.SQLXML;\r
24 import java.sql.Statement;\r
25 import java.sql.Time;\r
26 import java.sql.Timestamp;\r
27 import java.util.ArrayList;\r
28 import java.util.Calendar;\r
29 import java.util.List;\r
30 \r
31 import org.apache.commons.logging.Log;\r
32 import org.apache.commons.logging.LogFactory;\r
33 \r
34 /**\r
35  * PrepareStatementをクラスタ対応化するクラス。\r
36  * setXX()でセットされたパラメータを保持し、DB切り替えで再実行する際には\r
37  * 再度setXX()を行う。\r
38  *\r
39  * executeUpdate()等の更新処理が複数回実行された後、\r
40  * Commitする前にDB切替が起きた場合、すべての更新処理が再実行される。\r
41  * 従って、トランザクション内で一つのStatementを持ち回って更新処理を\r
42  * 行う処理はフェイルオーバーできる。\r
43  *\r
44  * sequenceを使って連番管理している場合は2カウントアップされる?(要確認)。\r
45  *\r
46  * @author dobashi\r
47  * @version 1.00\r
48  */\r
49 public class ClusterPreparedStatement\r
50         extends ClusterStatement\r
51         implements PreparedStatement {\r
52 \r
53         /** 処理移譲先。 */\r
54         private PreparedStatement st=null;\r
55 \r
56         /** コネクション。障害時に別のStaementを作るよう依頼する。 */\r
57         private ClusterConnection con = null;\r
58 \r
59         /**\r
60          * 保存しておくメソッドのリスト。\r
61          * 障害が発生した場合、ClusterPreparedStatementに対する操作を操作が行われた\r
62          * 順序どおりに再実行する必要がある。\r
63          */\r
64         private List<CalledMethod> methodList = null;\r
65 \r
66         /** ロガー。debug用 */\r
67         private static Log logger = LogFactory.getLog(ClusterPreparedStatement.class);\r
68 \r
69         /**\r
70          * @param con\r
71          * @param st\r
72          */\r
73         public ClusterPreparedStatement(ClusterConnection con, PreparedStatement st) {\r
74                 super(con, st);\r
75                 this.con = con;\r
76                 this.st = st;\r
77                 methodList = new ArrayList<CalledMethod>();\r
78         }\r
79 \r
80         /* (非 Javadoc)\r
81          * @see java.sql.Statement#close()\r
82          */\r
83         @Override\r
84         public void close() throws SQLException {\r
85                 methodList.clear();\r
86                 super.close();\r
87         }\r
88 \r
89 \r
90         /**\r
91          * DB切替時、新たに取得したStatementに対して\r
92          * 更新処理を再実行する。\r
93          * @param\r
94          */\r
95         @Override\r
96         public void reupdateStatement(Statement st) throws SQLException{\r
97                 try { this.st.close(); } catch (SQLException se) {}\r
98                 this.st = (PreparedStatement)st;\r
99 \r
100                 super.reupdateStatement(st);    // ベースクラスでも再実行\r
101                 logger.debug( "reexecute count:"+ methodList.size());\r
102                 for(int i=0; i<methodList.size(); i++){\r
103                         CalledMethod calledMethod = methodList.get(i);\r
104                         try{\r
105                                 logger.debug(calledMethod.toString());\r
106                                 calledMethod.invoke(st);        // 戻り値は無視して良い\r
107                         }catch (Exception e) {\r
108                                 logger.error(MSG_ERR_REUPDATE, e);\r
109                                 throw new SQLException(MSG_ERR_REUPDATE);\r
110                         }\r
111                 }\r
112         }\r
113 \r
114         /**\r
115          * クラスタリング対応のメソッド実行処理。\r
116          * @param methodName\r
117          * @param args\r
118          * @return\r
119          * @throws SQLException\r
120          */\r
121         private Object clusterCall(String methodName, Object[] args, Class<?>[] parameterTypes) throws SQLException{\r
122                 Object result = null;\r
123 \r
124                 CalledMethod calledMethod = new CalledMethod(methodName, args, parameterTypes);\r
125                 logger.debug(calledMethod.toString());\r
126 \r
127                 try{\r
128                         result = calledMethod.invoke(st);\r
129                 }catch (Exception e) {\r
130                         logger.warn(MSG_WARN_SWITCH_DB, e);\r
131                         con.notifyError(this);\r
132                         try{\r
133                                 result = calledMethod.invoke(st);\r
134                         }catch (Exception e2) {\r
135                                 // 再度実行。ここでもさらにエラーがでるならSQLExceptionにラップする。\r
136                                 throw new SQLException(e2.getMessage());\r
137                         }\r
138                 }\r
139                 methodList.add(calledMethod);\r
140 \r
141                 return result;\r
142         }\r
143 \r
144         /**\r
145          * ResultSet再生成処理。\r
146          * ResultSetで障害が起きたときに、ResultSetから呼ばれる。\r
147          * @see com.lavans.util.jdbc.cluster.ClusterStatementInterface#getAnotherResultSet()\r
148          */\r
149         @Override\r
150         public ResultSet getAnotherResultSet() throws SQLException {\r
151                 // resultSet内で障害を検知したので、再度コネクションを張り直す。\r
152                 try { st.close(); } catch (SQLException se) {}\r
153                 con.notifyError(this);\r
154                 ResultSet rs = st.executeQuery();               // ResultSetを生成するのはexecuteQuery()だけ。\r
155 \r
156                 return rs;\r
157         }\r
158 \r
159         /* (非 Javadoc)\r
160          * @see java.sql.PreparedStatement#executeQuery()\r
161          */\r
162         public ResultSet executeQuery() throws SQLException {\r
163                 ResultSet result = (ResultSet)clusterCall("executeQuery", null, null);\r
164                 // executeQueryでもinsert文は実行できるので保存する必要があることに注意。\r
165 \r
166                 return new ClusterResultSet(this,result);\r
167         }\r
168 \r
169 \r
170         /* (非 Javadoc)\r
171          * @see java.sql.PreparedStatement#executeUpdate()\r
172          */\r
173         public int executeUpdate() throws SQLException {\r
174                 return ((Integer)clusterCall("executeUpdate", null, null)).intValue();\r
175         }\r
176 \r
177         /* (非 Javadoc)\r
178          * @see java.sql.PreparedStatement#execute()\r
179          */\r
180         public boolean execute() throws SQLException {\r
181                 return ((Boolean)clusterCall("execute", null, null)).booleanValue();\r
182         }\r
183 \r
184         /**\r
185          * @see java.sql.PreparedStatement#addBatch()\r
186          */\r
187         public void addBatch() throws SQLException {\r
188                 clusterCall("addBatch", null, null);\r
189         }\r
190 \r
191         /**\r
192          * @see java.sql.PreparedStatement#clearParameters()\r
193          */\r
194         public void clearParameters() throws SQLException {\r
195                 clusterCall("clearParameters", null, null);\r
196                 // methodListをクリアしてもいいのでは?\r
197         }\r
198 \r
199         /**\r
200          * @see java.sql.PreparedStatement#setByte(int, byte)\r
201          */\r
202         public void setByte(int parameterIndex, byte x) throws SQLException {\r
203                 clusterCall(\r
204                         "setByte",\r
205                         new Object[]{new Integer(parameterIndex), new Byte(x)},\r
206                         new Class[]{Integer.TYPE, Byte.TYPE}\r
207                 );\r
208         }\r
209 \r
210         /* (非 Javadoc)\r
211          * @see java.sql.PreparedStatement#setDouble(int, double)\r
212          */\r
213         public void setDouble(int parameterIndex, double x) throws SQLException {\r
214                 clusterCall(\r
215                         "setDouble",\r
216                         new Object[]{new Integer(parameterIndex), new Double(x)},\r
217                         new Class[]{Integer.TYPE, Double.TYPE}\r
218                 );\r
219         }\r
220 \r
221         /* (非 Javadoc)\r
222          * @see java.sql.PreparedStatement#setFloat(int, float)\r
223          */\r
224         public void setFloat(int parameterIndex, float x) throws SQLException {\r
225                 clusterCall(\r
226                     "setFloat",\r
227                         new Object[]{new Integer(parameterIndex), new Float(x)},\r
228                         new Class[]{Integer.TYPE, Float.TYPE}\r
229                 );\r
230         }\r
231 \r
232         /* (非 Javadoc)\r
233          * @see java.sql.PreparedStatement#setInt(int, int)\r
234          */\r
235         public void setInt(int parameterIndex, int x) throws SQLException {\r
236                 clusterCall(\r
237                     "setInt",\r
238                     new Object[]{new Integer(parameterIndex), new Integer(x)},\r
239                     new Class[]{Integer.TYPE, Integer.TYPE}\r
240                 );\r
241         }\r
242 \r
243         /* (非 Javadoc)\r
244          * @see java.sql.PreparedStatement#setNull(int, int)\r
245          */\r
246         public void setNull(int parameterIndex, int sqlType) throws SQLException {\r
247                 clusterCall(\r
248                     "setNull",\r
249                     new Object[]{new Integer(parameterIndex), new Integer(sqlType)},\r
250                     new Class[]{Integer.TYPE, Integer.TYPE}\r
251                 );\r
252         }\r
253 \r
254         /* (非 Javadoc)\r
255          * @see java.sql.PreparedStatement#setLong(int, long)\r
256          */\r
257         public void setLong(int parameterIndex, long x) throws SQLException {\r
258                 clusterCall(\r
259                     "setLong",\r
260                     new Object[]{new Integer(parameterIndex), new Long(x)},\r
261                         new Class[]{Integer.TYPE, Long.TYPE}\r
262                 );\r
263         }\r
264 \r
265         /* (非 Javadoc)\r
266          * @see java.sql.PreparedStatement#setShort(int, short)\r
267          */\r
268         public void setShort(int parameterIndex, short x) throws SQLException {\r
269                 clusterCall(\r
270                         "setShort", new Object[]{new Integer(parameterIndex), new Short(x)},\r
271                                 new Class[]{Integer.TYPE, Short.TYPE});\r
272         }\r
273 \r
274         /* (非 Javadoc)\r
275          * @see java.sql.PreparedStatement#setBoolean(int, boolean)\r
276          */\r
277         public void setBoolean(int parameterIndex, boolean x) throws SQLException {\r
278                 clusterCall("setBoolean", new Object[]{new Integer(parameterIndex), new Boolean(x)},\r
279                                 new Class[]{Integer.TYPE, Boolean.TYPE});\r
280         }\r
281 \r
282         /* (非 Javadoc)\r
283          * @see java.sql.PreparedStatement#setBytes(int, byte[])\r
284          */\r
285         public void setBytes(int parameterIndex, byte[] x) throws SQLException {\r
286                 clusterCall("setBytes", new Object[]{new Integer(parameterIndex), x},\r
287                                 new Class[]{Integer.TYPE, byte[].class});\r
288         }\r
289 \r
290 \r
291 \r
292         /* (非 Javadoc)\r
293          * @see java.sql.PreparedStatement#setAsciiStream(int, java.io.InputStream, int)\r
294          */\r
295         public void setAsciiStream(int parameterIndex, InputStream x, int length)\r
296                 throws SQLException {\r
297                 clusterCall("setAsciiStream", new Object[]{new Integer(parameterIndex), x, new Integer(length)},\r
298                                 new Class[]{Integer.TYPE, InputStream.class, Integer.TYPE});\r
299         }\r
300 \r
301         /* (非 Javadoc)\r
302          * @see java.sql.PreparedStatement#setBinaryStream(int, java.io.InputStream, int)\r
303          */\r
304         public void setBinaryStream(int parameterIndex, InputStream x, int length)\r
305                 throws SQLException {\r
306                 clusterCall("setBinaryStream", new Object[]{new Integer(parameterIndex), x, new Integer(length)},\r
307                                 new Class[]{Integer.TYPE, InputStream.class, Integer.TYPE});\r
308         }\r
309 \r
310         /**\r
311          * @see java.sql.PreparedStatement#setUnicodeStream(int, java.io.InputStream, int)\r
312          * @deprecated\r
313          */\r
314         public  void setUnicodeStream(int parameterIndex, InputStream x, int length)\r
315                 throws SQLException {\r
316                 clusterCall("setUnicodeStream", new Object[]{new Integer(parameterIndex), x, new Integer(length)},\r
317                                 new Class[]{Integer.TYPE, InputStream.class, Integer.TYPE});\r
318         }\r
319 \r
320         /* (非 Javadoc)\r
321          * @see java.sql.PreparedStatement#setCharacterStream(int, java.io.Reader, int)\r
322          */\r
323         public void setCharacterStream(\r
324                 int parameterIndex,\r
325                 Reader reader,\r
326                 int length)\r
327                 throws SQLException {\r
328                 clusterCall("setCharacterStream", new Object[]{new Integer(parameterIndex), reader, new Integer(length)},\r
329                                 new Class[]{Integer.TYPE, Reader.class, Integer.TYPE});\r
330         }\r
331         /* (非 Javadoc)\r
332          * @see java.sql.PreparedStatement#setObject(int, java.lang.Object)\r
333          */\r
334         public void setObject(int parameterIndex, Object x) throws SQLException {\r
335                 clusterCall(\r
336                         "setObject",\r
337                         new Object[]{new Integer(parameterIndex), x},\r
338                         new Class[]{Integer.TYPE, Object.class}\r
339                 );\r
340         }\r
341 \r
342         /* (非 Javadoc)\r
343          * @see java.sql.PreparedStatement#setObject(int, java.lang.Object, int)\r
344          */\r
345         public void setObject(int parameterIndex, Object x, int targetSqlType)\r
346                 throws SQLException {\r
347                 clusterCall(\r
348                         "setObject",\r
349                         new Object[]{new Integer(parameterIndex), x, new Integer(targetSqlType)},\r
350                         new Class[]{Integer.TYPE, Object.class, Integer.TYPE}\r
351                 );\r
352         }\r
353 \r
354         /* (非 Javadoc)\r
355          * @see java.sql.PreparedStatement#setObject(int, java.lang.Object, int, int)\r
356          */\r
357         public void setObject(\r
358                 int parameterIndex,\r
359                 Object x,\r
360                 int targetSqlType,\r
361                 int scale)\r
362                 throws SQLException {\r
363                 clusterCall(\r
364                         "setObject",\r
365                         new Object[]{new Integer(parameterIndex), x, new Integer(targetSqlType), new Integer(scale)},\r
366                         new Class[]{Integer.TYPE, Object.class, Integer.TYPE, Integer.TYPE}\r
367                 );\r
368         }\r
369 \r
370         /* (非 Javadoc)\r
371          * @see java.sql.PreparedStatement#setNull(int, int, java.lang.String)\r
372          */\r
373         public void setNull(int paramIndex, int sqlType, String typeName)\r
374                 throws SQLException {\r
375                 clusterCall("setNull", new Object[]{new Integer(paramIndex), new Integer(sqlType), typeName},\r
376                                 new Class[]{Integer.TYPE, Integer.TYPE, String.class});\r
377         }\r
378 \r
379         /* (非 Javadoc)\r
380          * @see java.sql.PreparedStatement#setString(int, java.lang.String)\r
381          */\r
382         public void setString(int parameterIndex, String x) throws SQLException {\r
383                 clusterCall(\r
384                         "setString",\r
385                         new Object[]{new Integer(parameterIndex), x},\r
386                         new Class[]{Integer.TYPE, String.class}\r
387                 );\r
388         }\r
389 \r
390         /* (非 Javadoc)\r
391          * @see java.sql.PreparedStatement#setBigDecimal(int, java.math.BigDecimal)\r
392          */\r
393         public void setBigDecimal(int parameterIndex, BigDecimal x)\r
394                 throws SQLException {\r
395                 clusterCall("setBigDecimal", new Object[]{new Integer(parameterIndex), x},\r
396                                 new Class[]{Integer.TYPE, BigDecimal.class});\r
397         }\r
398 \r
399 \r
400         /* (非 Javadoc)\r
401          * @see java.sql.PreparedStatement#setURL(int, java.net.URL)\r
402          */\r
403         public void setURL(int parameterIndex, URL x) throws SQLException {\r
404                 clusterCall("setURL", new Object[]{new Integer(parameterIndex), x},\r
405                                 new Class[]{Integer.TYPE, URL.class});\r
406         }\r
407 \r
408         /* (非 Javadoc)\r
409          * @see java.sql.PreparedStatement#setArray(int, java.sql.Array)\r
410          */\r
411         public void setArray(int i, Array x) throws SQLException {\r
412                 clusterCall("setArray", new Object[]{new Integer(i), x},\r
413                                 new Class[]{Integer.TYPE, Array.class});\r
414         }\r
415 \r
416         /* (非 Javadoc)\r
417          * @see java.sql.PreparedStatement#setBlob(int, java.sql.Blob)\r
418          */\r
419         public void setBlob(int i, Blob x) throws SQLException {\r
420                 clusterCall("setBlob", new Object[]{new Integer(i), x},\r
421                                 new Class[]{Integer.TYPE, Blob.class});\r
422         }\r
423 \r
424         /* (非 Javadoc)\r
425          * @see java.sql.PreparedStatement#setClob(int, java.sql.Clob)\r
426          */\r
427         public void setClob(int i, Clob x) throws SQLException {\r
428                 clusterCall("setClob", new Object[]{new Integer(i), x},\r
429                                 new Class[]{Integer.TYPE, Clob.class});\r
430         }\r
431 \r
432         /* (非 Javadoc)\r
433          * @see java.sql.PreparedStatement#setDate(int, java.sql.Date)\r
434          */\r
435         public void setDate(int parameterIndex, Date x) throws SQLException {\r
436                 clusterCall("setDate", new Object[]{new Integer(parameterIndex), x},\r
437                                 new Class[]{Integer.TYPE, Date.class});\r
438         }\r
439 \r
440 \r
441         /* (非 Javadoc)\r
442          * @see java.sql.PreparedStatement#getParameterMetaData()\r
443          */\r
444         public ParameterMetaData getParameterMetaData() throws SQLException {\r
445                 return (ParameterMetaData)clusterCall("getParameterMetaData", null, null);\r
446         }\r
447 \r
448         /* (非 Javadoc)\r
449          * @see java.sql.PreparedStatement#setRef(int, java.sql.Ref)\r
450          */\r
451         public void setRef(int i, Ref x) throws SQLException {\r
452                 clusterCall("setRef", new Object[]{new Integer(i), x},\r
453                                 new Class[]{Integer.TYPE, Ref.class});\r
454         }\r
455 \r
456 \r
457         /* (非 Javadoc)\r
458          * @see java.sql.PreparedStatement#getMetaData()\r
459          */\r
460         public ResultSetMetaData getMetaData() throws SQLException {\r
461                 return (ResultSetMetaData)clusterCall("getMetaData", null, null);\r
462         }\r
463 \r
464         /* (非 Javadoc)\r
465          * @see java.sql.PreparedStatement#setTime(int, java.sql.Time)\r
466          */\r
467         public void setTime(int parameterIndex, Time x) throws SQLException {\r
468                 clusterCall("setTime", new Object[]{new Integer(parameterIndex), x},\r
469                                 new Class[]{Integer.TYPE, Time.class});\r
470         }\r
471 \r
472         /* (非 Javadoc)\r
473          * @see java.sql.PreparedStatement#setTimestamp(int, java.sql.Timestamp)\r
474          */\r
475         public void setTimestamp(int parameterIndex, Timestamp x)\r
476                 throws SQLException {\r
477                 clusterCall("setTimestamp", new Object[]{new Integer(parameterIndex), x},\r
478                                 new Class[]{Integer.TYPE, Timestamp.class});\r
479         }\r
480 \r
481         /* (非 Javadoc)\r
482          * @see java.sql.PreparedStatement#setDate(int, java.sql.Date, java.util.Calendar)\r
483          */\r
484         public void setDate(int parameterIndex, Date x, Calendar cal)\r
485                 throws SQLException {\r
486                 clusterCall("setDate", new Object[]{new Integer(parameterIndex), x, cal},\r
487                                 new Class[]{Integer.TYPE, Date.class, Calendar.class});\r
488         }\r
489 \r
490         /* (非 Javadoc)\r
491          * @see java.sql.PreparedStatement#setTime(int, java.sql.Time, java.util.Calendar)\r
492          */\r
493         public void setTime(int parameterIndex, Time x, Calendar cal)\r
494                 throws SQLException {\r
495                 clusterCall("setTime", new Object[]{new Integer(parameterIndex), x, cal},\r
496                                 new Class[]{Integer.TYPE, Time.class, Calendar.class});\r
497         }\r
498 \r
499         /* (非 Javadoc)\r
500          * @see java.sql.PreparedStatement#setTimestamp(int, java.sql.Timestamp, java.util.Calendar)\r
501          */\r
502         public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal)\r
503                 throws SQLException {\r
504                 clusterCall("setTimestamp", new Object[]{new Integer(parameterIndex), x, cal},\r
505                                 new Class[]{Integer.TYPE, Timestamp.class, Calendar.class});\r
506         }\r
507 \r
508         // ---\r
509         // 以下未実装\r
510         // ---\r
511         /**\r
512          * @param parameterIndex\r
513          * @param x\r
514          * @param length\r
515          * @throws SQLException\r
516          * @see java.sql.PreparedStatement#setAsciiStream(int, java.io.InputStream, long)\r
517          */\r
518         public void setAsciiStream(int parameterIndex, InputStream x, long length)\r
519                         throws SQLException {\r
520                 st.setAsciiStream(parameterIndex, x, length);\r
521         }\r
522 \r
523         /**\r
524          * @param parameterIndex\r
525          * @param x\r
526          * @throws SQLException\r
527          * @see java.sql.PreparedStatement#setAsciiStream(int, java.io.InputStream)\r
528          */\r
529         public void setAsciiStream(int parameterIndex, InputStream x)\r
530                         throws SQLException {\r
531                 st.setAsciiStream(parameterIndex, x);\r
532         }\r
533 \r
534         /**\r
535          * @param parameterIndex\r
536          * @param x\r
537          * @param length\r
538          * @throws SQLException\r
539          * @see java.sql.PreparedStatement#setBinaryStream(int, java.io.InputStream, long)\r
540          */\r
541         public void setBinaryStream(int parameterIndex, InputStream x, long length)\r
542                         throws SQLException {\r
543                 st.setBinaryStream(parameterIndex, x, length);\r
544         }\r
545 \r
546         /**\r
547          * @param parameterIndex\r
548          * @param x\r
549          * @throws SQLException\r
550          * @see java.sql.PreparedStatement#setBinaryStream(int, java.io.InputStream)\r
551          */\r
552         public void setBinaryStream(int parameterIndex, InputStream x)\r
553                         throws SQLException {\r
554                 st.setBinaryStream(parameterIndex, x);\r
555         }\r
556 \r
557         /**\r
558          * @param parameterIndex\r
559          * @param inputStream\r
560          * @param length\r
561          * @throws SQLException\r
562          * @see java.sql.PreparedStatement#setBlob(int, java.io.InputStream, long)\r
563          */\r
564         public void setBlob(int parameterIndex, InputStream inputStream, long length)\r
565                         throws SQLException {\r
566                 st.setBlob(parameterIndex, inputStream, length);\r
567         }\r
568 \r
569         /**\r
570          * @param parameterIndex\r
571          * @param inputStream\r
572          * @throws SQLException\r
573          * @see java.sql.PreparedStatement#setBlob(int, java.io.InputStream)\r
574          */\r
575         public void setBlob(int parameterIndex, InputStream inputStream)\r
576                         throws SQLException {\r
577                 st.setBlob(parameterIndex, inputStream);\r
578         }\r
579 \r
580         /**\r
581          * @param parameterIndex\r
582          * @param reader\r
583          * @param length\r
584          * @throws SQLException\r
585          * @see java.sql.PreparedStatement#setCharacterStream(int, java.io.Reader, long)\r
586          */\r
587         public void setCharacterStream(int parameterIndex, Reader reader,\r
588                         long length) throws SQLException {\r
589                 st.setCharacterStream(parameterIndex, reader, length);\r
590         }\r
591 \r
592         /**\r
593          * @param parameterIndex\r
594          * @param reader\r
595          * @throws SQLException\r
596          * @see java.sql.PreparedStatement#setCharacterStream(int, java.io.Reader)\r
597          */\r
598         public void setCharacterStream(int parameterIndex, Reader reader)\r
599                         throws SQLException {\r
600                 st.setCharacterStream(parameterIndex, reader);\r
601         }\r
602 \r
603         /**\r
604          * @param parameterIndex\r
605          * @param reader\r
606          * @param length\r
607          * @throws SQLException\r
608          * @see java.sql.PreparedStatement#setClob(int, java.io.Reader, long)\r
609          */\r
610         public void setClob(int parameterIndex, Reader reader, long length)\r
611                         throws SQLException {\r
612                 st.setClob(parameterIndex, reader, length);\r
613         }\r
614 \r
615         /**\r
616          * @param parameterIndex\r
617          * @param reader\r
618          * @throws SQLException\r
619          * @see java.sql.PreparedStatement#setClob(int, java.io.Reader)\r
620          */\r
621         public void setClob(int parameterIndex, Reader reader) throws SQLException {\r
622                 st.setClob(parameterIndex, reader);\r
623         }\r
624 \r
625         /**\r
626          * @param parameterIndex\r
627          * @param value\r
628          * @param length\r
629          * @throws SQLException\r
630          * @see java.sql.PreparedStatement#setNCharacterStream(int, java.io.Reader, long)\r
631          */\r
632         public void setNCharacterStream(int parameterIndex, Reader value,\r
633                         long length) throws SQLException {\r
634                 st.setNCharacterStream(parameterIndex, value, length);\r
635         }\r
636 \r
637         /**\r
638          * @param parameterIndex\r
639          * @param value\r
640          * @throws SQLException\r
641          * @see java.sql.PreparedStatement#setNCharacterStream(int, java.io.Reader)\r
642          */\r
643         public void setNCharacterStream(int parameterIndex, Reader value)\r
644                         throws SQLException {\r
645                 st.setNCharacterStream(parameterIndex, value);\r
646         }\r
647 \r
648         /**\r
649          * @param parameterIndex\r
650          * @param value\r
651          * @throws SQLException\r
652          * @see java.sql.PreparedStatement#setNClob(int, java.sql.NClob)\r
653          */\r
654         public void setNClob(int parameterIndex, NClob value) throws SQLException {\r
655                 st.setNClob(parameterIndex, value);\r
656         }\r
657 \r
658         /**\r
659          * @param parameterIndex\r
660          * @param reader\r
661          * @param length\r
662          * @throws SQLException\r
663          * @see java.sql.PreparedStatement#setNClob(int, java.io.Reader, long)\r
664          */\r
665         public void setNClob(int parameterIndex, Reader reader, long length)\r
666                         throws SQLException {\r
667                 st.setNClob(parameterIndex, reader, length);\r
668         }\r
669 \r
670         /**\r
671          * @param parameterIndex\r
672          * @param reader\r
673          * @throws SQLException\r
674          * @see java.sql.PreparedStatement#setNClob(int, java.io.Reader)\r
675          */\r
676         public void setNClob(int parameterIndex, Reader reader) throws SQLException {\r
677                 st.setNClob(parameterIndex, reader);\r
678         }\r
679 \r
680         /**\r
681          * @param parameterIndex\r
682          * @param value\r
683          * @throws SQLException\r
684          * @see java.sql.PreparedStatement#setNString(int, java.lang.String)\r
685          */\r
686         public void setNString(int parameterIndex, String value)\r
687                         throws SQLException {\r
688                 st.setNString(parameterIndex, value);\r
689         }\r
690 \r
691         /**\r
692          * @param parameterIndex\r
693          * @param x\r
694          * @throws SQLException\r
695          * @see java.sql.PreparedStatement#setRowId(int, java.sql.RowId)\r
696          */\r
697         public void setRowId(int parameterIndex, RowId x) throws SQLException {\r
698                 st.setRowId(parameterIndex, x);\r
699         }\r
700 \r
701         /**\r
702          * @param parameterIndex\r
703          * @param xmlObject\r
704          * @throws SQLException\r
705          * @see java.sql.PreparedStatement#setSQLXML(int, java.sql.SQLXML)\r
706          */\r
707         public void setSQLXML(int parameterIndex, SQLXML xmlObject)\r
708                         throws SQLException {\r
709                 st.setSQLXML(parameterIndex, xmlObject);\r
710         }\r
711 \r
712         /**\r
713          * @param iface\r
714          * @return\r
715          * @throws SQLException\r
716          * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)\r
717          */\r
718         @Override\r
719         public boolean isWrapperFor(Class<?> iface) throws SQLException {\r
720                 return st.isWrapperFor(iface);\r
721         }\r
722 \r
723         /**\r
724          * @param <T>\r
725          * @param iface\r
726          * @return\r
727          * @throws SQLException\r
728          * @see java.sql.Wrapper#unwrap(java.lang.Class)\r
729          */\r
730         @Override\r
731         @SuppressWarnings("unchecked")\r
732         public <T> T unwrap(Class<T> iface) throws SQLException {\r
733                 return (T)this;\r
734         }\r
735 }\r