001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.db;
017    
018    import java.io.IOException;
019    import java.io.Reader;
020    import java.sql.Clob;
021    import java.sql.ResultSet;
022    import java.sql.ResultSetMetaData;
023    import java.sql.SQLException;
024    import java.sql.Types;
025    import java.sql.Date;
026    import java.sql.Timestamp;
027    import java.util.Locale;
028    
029    import org.opengion.fukurou.util.Closer;
030    import org.opengion.fukurou.util.HybsDateUtil;
031    import static org.opengion.fukurou.util.HybsConst.CR;                           // 6.1.0.0 (2014/12/26) refactoring
032    
033    /**
034     * ResultSet ã®ãƒ??タ処ç?‚’ã¾ã¨ã‚ãŸã‚¯ãƒ©ã‚¹ã§ã™ã?
035     * ã“ã“ã§ã¯ã€ResultSetMetaData ã‹ã‚‰ã€ã‚«ãƒ©ãƒ?•°ã€ã‚«ãƒ©ãƒ?(NAMEåˆ?ã€?
036     * Type属æ?ã‚’å–å¾—ã—ã€ResultSet ã§ã€å?を求ã‚る時ã«ã€Objectåž‹ã?
037     * 処ç?‚’行ã„ã¾ã™ã?
038     * Objectåž‹ã¨ã—ã¦ã¯ã€CLOBã€ROWIDã€TIMESTAMP åž‹ã?ã¿å–り扱ã£ã¦ã?¾ã™ã?
039     *
040     * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
041     * @og.group ?¤?¢åˆ¶å¾¡
042     *
043     * @version  6.0
044     * @author   Kazuhiko Hasegawa
045     * @since    JDK6.0,
046     */
047    public class ResultSetValue {
048    
049    //      /** シスãƒ?ƒ ä¾å­˜ã?改行記å·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?4.0.0.0(2007/10/17) */
050    //      private static final String CR = System.getProperty( "line.separator" );
051    
052            private final ResultSet resultSet ;                     // å†?ƒ¨ã§ç®¡ç?™ã‚?ResultSet オブジェクãƒ?
053            private final int               clmSize ;                       // カラãƒ?‚µã‚¤ã‚º
054            private final String[]  names ;                         // カラ�(ResultSetMetaData#getColumnLabel(int) 㮠toUpperCase)
055            private final int[]             type ;                          // java.sql.Types ã®å®šæ•°å®šç¾©
056            private final boolean   useObj ;                        // オブジェクト型㮠Type ãŒå­˜åœ¨ã™ã‚‹ã‹ã©ã?‹ã€?
057    
058            private final int[]             size ;                          // カラãƒ?‚µã‚¤ã‚º(ResultSetMetaData#getColumnDisplaySize(int))
059            private final boolean[] isWrit ;                        // 書ãè¾¼ã¿è¨±å¯(ResultSetMetaData#isWritable(int))
060    
061            /**
062             * ResultSet を引数ã«ã¨ã‚‹ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿
063             *
064             * ã“ã“ã§ã€ã‚«ãƒ©ãƒ?‚µã‚¤ã‚ºã€ã‚«ãƒ©ãƒ?ã€java.sql.Types ã®å®šæ•°å®šç¾© ã‚’å–å¾—ã—ã¾ã™ã?
065             *
066             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
067             *
068             * @param       res å†?ƒ¨ã§ç®¡ç?™ã‚‹ResultSetオブジェクãƒ?
069             * @throws      java.sql.SQLException ãƒ??タベã?ス・アクセス・エラーãŒç™ºç”Ÿã—ãŸå?å?
070             */
071            public ResultSetValue( final ResultSet res ) throws SQLException {
072                    resultSet = res;
073    
074                    final ResultSetMetaData metaData  = resultSet.getMetaData();
075                    clmSize = metaData.getColumnCount();
076                    names   = new String[clmSize];
077                    type    = new int[clmSize];
078                    size    = new int[clmSize];
079                    isWrit  = new boolean[clmSize];
080    
081                    boolean tempUseObj = false;                                             // ãã‚‚ãã‚‚ã€ã‚ªãƒ–ジェクト系ã®ã‚«ãƒ©ãƒ?Œã‚ã‚‹ã‹ã©ã?‹
082                    for( int i=0; i<clmSize; i++ ) {
083                            final int tp = metaData.getColumnType( i+1 );
084                            type[i] = tp ;
085                            if( tp == Types.CLOB || tp == Types.ROWID || tp == Types.TIMESTAMP ) { tempUseObj = true; }
086                            names[i]  = metaData.getColumnLabel(i+1).toUpperCase(Locale.JAPAN) ;
087                            size[i]   = metaData.getColumnDisplaySize(i+1) ;
088                            isWrit[i] = metaData.isWritable(i+1) ;
089                    }
090                    useObj = tempUseObj ;
091            }
092    
093            /**
094             * ResultSetMetaData ã§æ±‚ã‚ãŸã?カラãƒ?•°ã‚’è¿”ã—ã¾ã™ã?
095             *
096             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
097             *
098             * @return  カラãƒ?•°(ãƒ??ã‚¿ã®åˆ—æ•°)
099             */
100            public int getColumnCount() { return clmSize ; }
101    
102            /**
103             * カラãƒ?é…å?ã‚’è¿”ã—ã¾ã™ã?
104             *
105             * é…å?ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1 ã¾ã§ã®æ–?­—åž‹é…å?ã«è¨­å®šã•れã¾ã™ã?
106             * カラãƒ?ã¯ã€ResultSetMetaData#getColumnLabel(int) ã‚?toUpperCase ã—ãŸ
107             * 大æ–?­—ãŒè¿”ã•れã¾ã™ã?
108             *
109             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
110             *
111             * @return      カラãƒ?é…å?
112             * @og.rtnNotNull
113             */
114            public String[] getNames() {
115                    return names.clone();
116            }
117    
118            /**
119             * æŒ?®šã?カラãƒ?•ªå·ã®ã‚«ãƒ©ãƒ?ã‚’è¿”ã—ã¾ã™ã?
120             *
121             * カラãƒ?ã‚’å–å¾—ã™ã‚‹ã?カラãƒ?•ªå·ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1 ã¾ã§ã®æ•°å­—ã§æŒ?®šã—ã¾ã™ã?
122             * ãƒ??タベã?ス上ã?ã€?ã‹ã‚‰å§‹ã¾ã‚‹ç•ªå·ã¨ã¯ã€ç•°ãªã‚Šã¾ã™ã?
123             * カラãƒ?ã¯ã€ResultSetMetaData#getColumnLabel(int) ã‚?toUpperCase ã—ãŸ
124             * 大æ–?­—ãŒè¿”ã•れã¾ã™ã?
125             *
126             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
127             *
128             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
129             * @return  æŒ?®šã?カラãƒ?•ªå·ã®ã‚«ãƒ©ãƒ?
130             */
131            public String getColumnName( final int clmNo ) {
132                    return names[clmNo];
133            }
134    
135    //      /**
136    //       * java.sql.Types ã®å®šæ•°å®šç¾©é…å?ã‚’è¿”ã—ã¾ã™ã?
137    //       *
138    //       * é…å?ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1 ã¾ã§ã®intåž‹é?列ã«è¨­å®šã•れã¾ã™ã?
139    //       * Types ã®å®šæ•°å®šç¾©ã¯ã€ResultSetMetaData#getColumnType(int) ã®å€¤ã§ã™ã?
140    //       *
141    //       * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
142    //       *
143    //       * @return      カラãƒ?0?žã‚«ãƒ©ãƒ?•°-1)ã«å¯¾å¿œã—ãŸã?Types定数定義é…å?
144    //       */
145    //      public int[] getSqlTypes() {
146    //              return type.clone();
147    //      }
148    
149            /**
150             * æŒ?®šã?カラãƒ?•ªå·ã®java.sql.Types ã®å®šæ•°å®šç¾©ã‚’è¿”ã—ã¾ã™ã?
151             *
152             * é…å?ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1 ã¾ã§ã®intåž‹é?列ã«è¨­å®šã•れã¾ã™ã?
153             * Types ã®å®šæ•°å®šç¾©ã¯ã€ResultSetMetaData#getColumnType(int) ã®å€¤ã§ã™ã?
154             *
155             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
156             *
157             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
158             * @return      æŒ?®šã?カラãƒ?•ªå·ã®Types定数
159             */
160            public int getSqlType( final int clmNo ) {
161                    return type[clmNo];
162            }
163    
164    //      /**
165    //       * オブジェクト型㮠Type ãŒå­˜åœ¨ã™ã‚‹ã‹ã©ã?‹[true:存在ã™ã‚‹/false:存在ã—ãªã„]ã‚’è¿”ã—ã¾ã™ã?
166    //       *
167    //       * 基本çš?«ã¯ã€å?を求ã‚ã‚‹å?ç??å†?ƒ¨ãƒ­ã‚¸ãƒ?‚¯ã§ã®ã¿ä½¿ç”¨ã—ã¾ã™ã?
168    //       * Types.CLOB ã€Types.ROWIDã€Types.TIMESTAMP ãŒã?Types定義ã«å«ã¾ã‚Œã¦ã?‚‹å ´åˆã?
169    //       * true ã‚’è¿”ã—ã¾ã™ã?
170    //       * å«ã¾ã‚Œãªã??åˆã?ã€false ã§ã™ã?
171    //       * オブジェクト型 ãŒå­˜åœ¨ã™ã‚‹å ´åˆã?値を求ã‚ã‚‹å?ç?«ã€å°‚用ã®ãƒ¡ã‚½ãƒ?ƒ‰ãŒå¿?¦ã«ãªã‚Šã¾ã™ã?
172    //       * å«ã¾ã‚Œãªã??åˆã?ã€String.valueOf( Object ) ã§æ±‚ã‚ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã?
173    //       * ã“ã?値をå‚è€?«ã€å‘¼ã³å‡ºã™ãƒ¡ã‚½ãƒ?ƒ‰ã‚’変ãˆã‚‹ã“ã¨ã§ã€å?ç??高é?化を図ã‚ã†ã¨
174    //       * è€?ˆã¦ã?¾ã™ã?(効果ãŒã‚ã‚‹ã‹ã©ã?‹ã¯ã€åˆ¤ã‚Šã¾ã›ã‚“ã€?
175    //       *
176    //       * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
177    //       *
178    //       * @return  オブジェクト型㮠Type ãŒå­˜åœ¨ã™ã‚‹ã‹ã©ã?‹[true:存在ã™ã‚‹/false:存在ã—ãªã„]
179    //       */
180    //      public boolean useObjectType() {
181    //              return useObj;
182    //      }
183    
184            /**
185             * カラãƒ??サイズã®inté…å?ã‚’è¿”ã—ã¾ã™ã?
186             *
187             * é…å?ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1 ã¾ã§ã®intåž‹é?列ã«è¨­å®šã•れã¾ã™ã?
188             * カラãƒ??サイズã¯ã€ResultSetMetaData#getColumnDisplaySize(int) ã®å€¤ã§ã™ã?
189             *
190             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
191             *
192             * @return      カラãƒ??サイズã®inté…å?
193             * @og.rtnNotNull
194             */
195            public int[] getColumnDisplaySizes() {
196                    return size.clone();
197            }
198    
199            /**
200             * æŒ?®šã?カラãƒ?•ªå·ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã?
201             *
202             * カラãƒ??サイズã¯ã€ResultSetMetaData#getColumnDisplaySize(int) ã®å€¤ã§ã™ã?
203             *
204             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
205             *
206             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
207             * @return      æŒ?®šã?カラãƒ?•ªå·ã®ã‚µã‚¤ã‚º
208             */
209            public int getColumnDisplaySize( final int clmNo ) {
210                    return size[clmNo];
211            }
212    
213            /**
214             * カラãƒ??書ãè¾¼ã¿å¯èƒ½ã‹ã©ã?‹ã®booleané…å?ã‚’è¿”ã—ã¾ã™ã?
215             *
216             * é…å?ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1 ã¾ã§ã®intåž‹é?列ã«è¨­å®šã•れã¾ã™ã?
217             * カラãƒ??書ãè¾¼ã¿å¯èƒ½ã‹ã©ã?‹ã¯ã€ResultSetMetaData#isWritable(int) ã®å€¤ã§ã™ã?
218             *
219             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
220             *
221             * @return      書ãè¾¼ã¿å¯èƒ½ã‹ã©ã?‹ã®booleané…å?
222             * @og.rtnNotNull
223             */
224            public boolean[] isWritable() {
225                    return isWrit.clone();
226            }
227    
228            /**
229             * æŒ?®šã?書ãè¾¼ã¿å¯èƒ½ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã?
230             *
231             * カラãƒ??書ãè¾¼ã¿å¯èƒ½ã‹ã©ã?‹ã¯ã€ResultSetMetaData#isWritable(int) ã®å€¤ã§ã™ã?
232             *
233             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
234             *
235             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
236             * @return      書ãè¾¼ã¿å¯èƒ½ã‹ã©ã?‹
237             */
238            public boolean isWritable( final int clmNo ) {
239                    return isWrit[clmNo];
240            }
241    
242            /**
243             * カーソルをç¾åœ¨ã®ä½ç½®ã‹ã‚‰é ?–¹å‘ã«1行移動ã—ã¾ã™ã?
244             *
245             * ResultSet#next() を呼ã³å‡ºã—ã¦ã?¾ã™ã?
246             * çµæžœã¯,ã™ã¹ã¦æ–?­—å?ã«å¤‰æ›ã•ã‚Œã¦æ ¼ç´ã•れã¾ã™ã?
247             *
248             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
249             *
250             * @return  æ–°ã—ã„ç¾åœ¨ã®è¡ŒãŒæœ‰åйã§ã‚ã‚‹å ´åˆã?trueã€è¡ŒãŒãれ以上存在ã—ãªã??åˆã?false
251             * @see         java.sql.ResultSet#next()
252             * @throws      java.sql.SQLException ãƒ??タベã?ス・アクセス・エラーãŒç™ºç”Ÿã—ãŸå?åˆã?ã¾ãŸã?ã“ã?メソãƒ?ƒ‰ãŒã‚¯ãƒ­ãƒ¼ã‚ºã•れãŸçµæžœã‚»ãƒ?ƒˆã§å‘¼ã³å‡ºã•れãŸå?å?
253             */
254            public boolean next() throws SQLException {
255                    return resultSet.next() ;
256            }
257    
258            /**
259             * ç¾åœ¨ã®ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã«ã‚るレコードã?カラãƒ?•ªå·ã®ãƒ??ã‚¿ã‚’å–å¾—ã—ã¾ã™ã?
260             *
261             * ResultSet#getObject( clmNo+1 ) を呼ã³å‡ºã—ã¦ã?¾ã™ã?
262             * 引数ã®ã‚«ãƒ©ãƒ?•ªå·ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ãŒã€ResultSet ã®ã‚«ãƒ©ãƒ??ã¯ã€?ã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ã?
263             * æŒ?®šã?ã€?ã‹ã‚‰å§‹ã¾ã‚‹ã‚«ãƒ©ãƒ?•ªå·ã§ã™ã?
264             * çµæžœã¯,ã™ã¹ã¦æ–?­—å?ã«å¤‰æ›ã•れã¦è¿”ã•れã¾ã™ã?
265             * ã¾ãŸã?null オブジェクトã?å ´åˆã‚‚ã€ã‚¼ãƒ­æ–?­—å?ã«å¤‰æ›ã•れã¦è¿”ã•れã¾ã™ã?
266             *
267             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?: org.opengion.hayabusa.db.DBUtil#getValue( ResultSet , int , int ) ã‹ã‚‰ç§»å‹?
268             *
269             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
270             * @return  ç¾åœ¨è¡Œã?カラãƒ?•ªå·ã®ãƒ??ã‚¿(æ–?­—å?)
271             * @throws      java.sql.SQLException ãƒ??タベã?ス・アクセス・エラーãŒç™ºç”Ÿã—ãŸå?å?
272             */
273            public String getValue( final int clmNo ) throws SQLException {
274                    final String val ;
275                    final Object obj = resultSet.getObject( clmNo+1 );
276                    if( obj == null ) {
277                            val = "";
278                    }
279                    else if( useObj ) {
280                            switch( type[clmNo] ) {
281                                    case Types.CLOB :               val = getClobData( (Clob)obj ) ;
282                                                                                    break;
283                                    case Types.ROWID:               val = resultSet.getString(clmNo+1);
284                                                                                    break;
285                                    case Types.TIMESTAMP :  val = HybsDateUtil.getDate( ((Timestamp)obj).getTime() , "yyyyMMddHHmmss" );
286                                                                                    break;
287                                    default :                               val = String.valueOf( obj );
288                                                                                    break;
289                            }
290                    }
291                    else {
292                            val = String.valueOf( obj );
293                    }
294    
295                    return val ;
296            }
297    
298            /**
299             * ç¾åœ¨ã®ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ã«ã‚るレコードã?全カラãƒ?ƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã—ã¾ã™ã?
300             *
301             * #getValue( clmNo ) ã‚’ã?0ã‹ã‚‰ã€ã‚«ãƒ©ãƒ?•°-1 ã¾ã§å‘¼ã³å‡ºã—ã¦æ±‚ã‚ãŸæ–‡å­—å?é…å?ã‚’è¿”ã—ã¾ã™ã?
302             *
303             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?
304             *
305             * @return  ç¾åœ¨è¡Œã?全カラãƒ?ƒ‡ãƒ¼ã‚¿ã®æ–?­—å?é…å?
306             * @throws      java.sql.SQLException ãƒ??タベã?ス・アクセス・エラーãŒç™ºç”Ÿã—ãŸå?å?
307             */
308            public String[] getValues() throws SQLException {
309                    final String[] vals = new String[clmSize];
310    
311                    for( int i=0; i<clmSize; i++ ) {
312                            vals[i] = getValue( i );
313                    }
314    
315                    return vals ;
316            }
317    
318            /**
319             * タイプã«å¿œã˜ã¦å¤‰æ›ã•れãŸã?Numberオブジェクトを返ã—ã¾ã™ã?
320             *
321             * æ¡ä»¶ã«å½“ã¦ã¯ã¾ã‚‰ãªã??åˆã?ã€null ã‚’è¿”ã—ã¾ã™ã?
322             * org.opengion.hayabusa.io.HybsJDBCCategoryDataset2 ã‹ã‚‰ç§»å‹•ã—ã¦ãã¾ã—ãŸã€?
323             * ã“れã¯ã€æ¤œç´¢çµæžœã‚’グラフ化ã™ã‚‹ç‚ºã® 値をå–å¾—ã™ã‚‹ç‚ºã®ãƒ¡ã‚½ãƒ?ƒ‰ã§ã™ã?ã§ã€?
324             * 数値ã«å¤‰æ›ã§ããªã??åˆã?ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã?
325             *
326             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?: org.opengion.hayabusa.db.DBUtil#getNumber( int , Object ) ã‹ã‚‰ç§»å‹?
327             *
328             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
329             * @return      Numberオブジェクãƒ?æ¡ä»¶ã«å½“ã¦ã¯ã¾ã‚‰ãªã??åˆã?ã€null)
330             * @see         java.sql.Types
331             * @throws      java.sql.SQLException ãƒ??タベã?ス・アクセス・エラーãŒç™ºç”Ÿã—ãŸå?å?
332             * @throws      RuntimeException 数字変æ›ã§ããªã‹ã£ãŸå?åˆã?
333             */
334            public Number getNumber( final int clmNo ) throws SQLException {
335                    final Object obj = resultSet.getObject( clmNo+1 );
336                    Number value = null;
337    
338                    switch( type[clmNo] ) {
339                            case Types.TINYINT:
340                            case Types.SMALLINT:
341                            case Types.INTEGER:
342                            case Types.BIGINT:
343                            case Types.FLOAT:
344                            case Types.DOUBLE:
345                            case Types.DECIMAL:
346                            case Types.NUMERIC:
347                            case Types.REAL: {
348                                    value = (Number)obj;
349                                    break;
350                            }
351                            case Types.DATE:
352                            case Types.TIME:  {
353                                    value = Long.valueOf( ((Date)obj).getTime() );
354                                    break;
355                            }
356                            // 5.6.2.1 (2013/03/08) Types.DATE 㨠Types.TIMESTAMP ã§å‡¦ç?‚’åˆ?‘ã¾ã™ã?
357                            case Types.TIMESTAMP: {
358                                    value = Long.valueOf( ((Timestamp)obj).getTime() );
359                                    break;
360                            }
361                            case Types.CHAR:
362                            case Types.VARCHAR:
363                            case Types.LONGVARCHAR: {
364                                    final String str = (String)obj;
365                                    try {
366                                            value = Double.valueOf(str);
367                                    }
368                                    catch (NumberFormatException ex) {
369                                            final String errMsg = "数字変æ›ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚in=" + str
370                                                                            + CR + ex.getMessage() ;
371                                            throw new RuntimeException( errMsg,ex );
372                                            // suppress (value defaults to null)
373                                    }
374                                    break;
375                            }
376                            default:
377                                    // not a value, can't use it (defaults to null)
378                                    break;
379                    }
380    
381                    return value;
382            }
383    
384            /**
385             * カラãƒ??タイプを表ç¾ã™ã‚‹æ–?­—å?値を返ã—ã¾ã™ã?
386             *
387             * ã“ã?æ–?­—å?を用ã?¦ã€CCSファイルã§ã‚¿ã‚¤ãƒ—ã”ã¨ã®è¡¨ç¤ºæ–¹æ³•ã‚’
388             * æŒ?®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã?
389             * ç¾æ™‚点ã§ã¯ã€VARCHAR2,LONG,NUMBER,DATE,CLOB,NONE ã®ã©ã‚Œã‹ã«ã‚ã¦ã¯ã‚ã¾ã™ã?
390             *
391             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?: org.opengion.hayabusa.db.DBUtil#type2ClassName( int ) ã‹ã‚‰ç§»å‹?
392             *
393             * @param   clmNo  カラãƒ?•ªå· (0ã‹ã‚‰å§‹ã¾ã‚Šã?カラãƒ?•°-1ã¾ã§ã®æ•°å­?
394             * @return      カラãƒ??タイプを表ç¾ã™ã‚‹æ–?­—å?値
395             * @see         java.sql.Types
396             */
397            public String getClassName( final int clmNo ) {
398                    final String rtn ;
399    
400                    switch( type[clmNo] ) {
401                            case Types.CHAR:
402                            case Types.VARCHAR:
403                            case Types.BIT:
404                                    rtn = "VARCHAR2"; break;
405                            case Types.LONGVARCHAR:
406                                    rtn = "LONG"; break;
407                            case Types.TINYINT:
408                            case Types.SMALLINT:
409                            case Types.INTEGER:
410                            case Types.NUMERIC:
411                            case Types.BIGINT:
412                            case Types.FLOAT:
413                            case Types.DOUBLE:
414                            case Types.REAL:
415                            case Types.DECIMAL:
416                                    rtn = "NUMBER"; break;
417                            case Types.DATE:
418                            case Types.TIME:
419                            case Types.TIMESTAMP:
420                                    rtn = "DATE"; break;
421                            case Types.CLOB:
422                                    rtn = "CLOB"; break;
423                            default:
424                                    rtn = "NONE"; break;
425                    }
426    
427                    return rtn;
428            }
429    
430            /**
431             * Clob オブジェクトã‹ã‚‰æ–‡å­—å?ã‚’å–りå?ã—ã¾ã™ã?
432             *
433             * @og.rev 6.0.4.0 (2014/11/28) æ–°è¦ä½œæ?: org.opengion.hayabusa.db.DBUtil#getClobData( Clob ) ã‹ã‚‰ç§»å‹?
434             *
435             * @param       clobData Clobオブジェク�
436             * @return      Clobオブジェクトã‹ã‚‰å–りå?ã—ãŸæ–?­—å?
437             * @throws      SQLException ãƒ??タベã?スアクセスエラー
438             * @throws      RuntimeException 入出力エラーãŒç™ºç”Ÿã—ãŸå?å?
439             * @og.rtnNotNull
440             */
441            private String getClobData( final Clob clobData ) throws SQLException {
442                    if( clobData == null ) { return ""; }
443    
444                    final StringBuilder buf = new StringBuilder( 10000 );
445    
446                    Reader reader = null;
447                    try {
448                            reader = clobData.getCharacterStream();
449                            final char[] ch = new char[10000];
450                            int  len ;
451                            while( (len = reader.read( ch )) >= 0 ) {
452                                    buf.append( ch,0,len );
453                            }
454                    }
455                    catch( IOException ex ) {
456                            final String errMsg = "CLOBãƒ??ã‚¿ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€?
457                                                                    + ex.getMessage() ;
458                            throw new RuntimeException( errMsg,ex );
459                    }
460                    finally {
461                            Closer.ioClose( reader );
462                    }
463                    return buf.toString();
464            }
465    }