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.xml;
017    
018    import org.opengion.fukurou.util.Closer;
019    import org.opengion.fukurou.util.LogWriter;
020    import org.opengion.fukurou.db.DBUtil;
021    
022    import java.io.Reader;
023    import java.io.BufferedReader;
024    import java.io.InputStreamReader;
025    import java.io.FileInputStream;
026    import java.util.Map;
027    import java.util.List;
028    import java.util.ArrayList;
029    import java.util.regex.Pattern;
030    import java.util.regex.Matcher;
031    import java.util.Arrays;
032    import java.util.Locale;
033    
034    import java.sql.DriverManager;
035    import java.sql.Connection;
036    import java.sql.Statement;
037    import java.sql.PreparedStatement;
038    import java.sql.ParameterMetaData;
039    import java.sql.DatabaseMetaData;
040    import java.sql.SQLException;
041    
042    /**
043     * ã“ã?クラスã¯ã€ã‚ªãƒ©ã‚¯ãƒ« XDKã® oracle.xml.sql.dml.OracleXMLSave クラスã¨
044     * ã»ã¼åŒæ§˜ã?ç›®çš?§ä½¿ç”¨ã§ãるクラスã§ã™ã?
045     * æ‹¡å¼µXDKå½¢å¼ã?XMLファイルを読ã¿è¾¼ã¿ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ã?ス㫠INSERT ã—ã¾ã™ã?
046     *
047     * æ‹¡å¼µXDKå½¢å¼ã?å…?¨ãªã‚?オラクル XDK(Oracle XML Developer's Kit)ã«ã¤ã?¦ã¯ã€ä»¥ä¸‹ã?
048     * リンクをå‚照願ã„ã¾ã™ã?
049     * <a href="http://otn.oracle.co.jp/software/tech/xml/xdk/index.html" target="_blank" >
050     * XDK(Oracle XML Developer's Kit)</a>
051     *
052     * ã“ã?クラスã§ã¯ã€MAP を登録ã™ã‚‹[ setDefaultMap( Map ) ]ã“ã¨ã«ã‚ˆã‚Šã€?
053     * XMLファイルã«å­˜åœ¨ã—ãªã?‚«ãƒ©ãƒ?‚’åˆæœŸå€¤ã¨ã—ã¦è¨­å®šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã?
054     * 例ãˆã°ã€ç™»éŒ²æ—¥ã‚??登録è€??ã¾ãŸã?ã€ãƒ†ãƒ³ãƒ—レートよりå„シスãƒ?ƒ ID毎ã«
055     * 登録ã™ã‚‹ãªã©ã§ã™ã?
056     * åŒæ§˜ã«ã€èª­ã¿å–ã£ã?XMLãƒ•ã‚¡ã‚¤ãƒ«ã®æƒ??ã‚’æ›¸ãæ›ãˆã‚‹æ©Ÿè?[ setAfterMap( Map ) ]メソãƒ?ƒ‰
057     * ã«ã‚ˆã‚Šã€ã‚«ãƒ©ãƒ??値ã®ç½®ãæ›ãˆã‚‚å¯èƒ½ã§ã™ã?
058     *
059     * æ‹¡å¼µXDKå½¢å¼ã?å…?¨ãªã‚?オラクル XDK(Oracle XML Developer's Kit)ã«ã¤ã?¦ã¯ã€ä»¥ä¸‹ã?
060     * リンクをå‚照願ã„ã¾ã™ã?
061     * <a href="http://otn.oracle.co.jp/software/tech/xml/xdk/index.html" target="_blank" >
062     * XDK(Oracle XML Developer's Kit)</a>
063     *
064     * æ‹¡å¼µXDKå½¢å¼ã¨ã¯ã€ROW 以外ã«ã€SQL処ç?”¨ã‚¿ã‚°(EXEC_SQL)ã‚’æŒã¤ XML ファイルã§ã™ã?
065     * ã¾ãŸã?登録ã™ã‚‹ãƒ??ブル(table)ã‚?ROWSETã‚¿ã‚°ã®å±žæ?æƒ??ã¨ã—ã¦ä»˜ä¸Žã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã?
066     * (大æ–?­—å°æ–‡å­—ã«æ³¨æ„?
067     * ã“れã¯ã€ã‚ªãƒ©ã‚¯ãƒ«XDKã§å‡¦ç?™ã‚‹å?åˆã?無視ã•れã¾ã™ã?ã§ã€åŒæ§˜ã«æ‰±ã?“ã¨ãŒå?æ¥ã¾ã™ã?
068     * ã“ã?ã€EXEC_SQL ã¯ã€ãれãれã? XMLãƒ??タをデータベã?スã«ç™»éŒ²ã™ã‚‹éš›ã«ã€?
069     * SQL処ç?‚’è‡ªå‹•çš„ã«æµã™ç‚ºã®ã€SQLæ–?‚’記載ã—ã¾ã™ã?
070     * ã“ã?処ç??ã€ã‚¤ãƒ™ãƒ³ãƒˆæ¯Žã«å®Ÿè¡Œã•れる為ã€ãã®é…ç½®é ??é‡è¦ã§ã™ã?
071     * ã“ã?ã‚¿ã‚°ã¯ã€è¤?•°è¨˜è¿°ã™ã‚‹ã“ã¨ã‚‚å?æ¥ã¾ã™ãŒã€BODY部ã«ã¯ã€?¼‘ã¤ã®SQLæ–??ã¿è¨˜è¿°ã—ã¾ã™ã?
072     *
073     *   &lt;ROWSET tableName="XX" &gt;
074     *       &lt;EXEC_SQL&gt;                    æœ??ã«è¨˜è¼‰ã—ã¦ã€å?期å?ç?ãƒ??タクリアç­?を実行ã•ã›ã‚‹ã€?
075     *           delete from GEXX where YYYYY
076     *       &lt;/EXEC_SQL&gt;
077     *       &lt;MERGE_SQL&gt;                   ã“ã?SQLæ–?§ UPDATEã—ã¦ã€çµæžœãŒï¼ä»¶ãªã‚‰INSERTを行ã„ã¾ã™ã?
078     *           update GEXX set AA=[AA] , BB=[BB] where CC=[CC]
079     *       &lt;/MERGE_SQL&gt;
080     *       &lt;ROW num="1"&gt;
081     *           &lt;カラ�&gt;値1&lt;/カラ�&gt;
082     *             ?¥?¥?¥
083     *           &lt;カラ�&gt;値n&lt;/カラ�&gt;
084     *       &lt;/ROW&gt;
085     *        ?¥?¥?¥
086     *       &lt;ROW num="n"&gt;
087     *          ?¥?¥?¥
088     *       &lt;/ROW&gt;
089     *       &lt;EXEC_SQL&gt;                    æœ?¾Œã«è¨˜è¼‰ã—ã¦ã€??ç›®ã®è¨­å®?æ•´åˆæ?登録)を行ã†ã€?
090     *           update GEXX set AA='XX' , BB='XX' where YYYYY
091     *       &lt;/EXEC_SQL&gt;
092     *   &lt;ROWSET&gt;
093     *
094     * @version  4.0
095     * @author   Kazuhiko Hasegawa
096     * @since    JDK5.0,
097     */
098    public class HybsXMLSave implements TagElementListener {
099            /** シスãƒ?ƒ ä¾å­˜ã?改行記å·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?     */
100            private static final String CR = System.getProperty("line.separator");
101    
102            private String tableName                = null;
103            private String[] keyColumns             = null;
104            private Connection connection   = null;
105            private PreparedStatement insPstmt      = null;         // INSERT用㮠PreparedStatement
106            private PreparedStatement updPstmt      = null;         // UPDATE用㮠PreparedStatement
107            private ParameterMetaData insMeta       = null;
108            private ParameterMetaData updMeta       = null;
109            private int insCnt              = 0;
110            private int updCnt              = 0;
111            private int delCnt              = 0;
112            private int ddlCnt              = 0;                                    // 5.6.7.0 (2013/07/27) DDL�?カウンター
113            private Map<String,String>        defaultMap      = null;
114            private Map<String,String>        afterMap        = null;
115            private List<String>              updClms         = null;
116            private String[]                        insClms         = null;
117            private String                          lastSQL         = null;         // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨ã€‚最後ã«ä½¿ç”¨ã—ãŸSQLæ–?
118    
119            private final boolean useParamMetaData ;        // 4.0.0.0 (2007/09/25)
120    
121            // UPDATE時ã? [XXX] ã‚’å–りå?ã—ã¾ã™ã?\w ã¯ã€å˜èªžæ§‹æ?æ–?­? [a-zA-Z_0-9]ã¨åŒã˜
122            private static final Pattern pattern = Pattern.compile( "\\[\\w*\\]" );
123    
124            // 5.6.9.2 (2013/10/18) EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼ã‚’無視ã™ã‚‹ã‹ã©ã?‹ã‚’指定ã§ãã¾ã™ã?
125            private boolean isExecErrException = true;                      // true ã¯ã€ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã—ã¾ã™ã?
126    
127            /**
128             * コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’指定ã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã?
129             * ãƒ??ブルåã?ã€æ‹¡å¼µXDKå½¢å¼ã?ROWSETã‚¿ã‚°ã®tableName属æ?ã«
130             * 記述ã—ã¦ãŠãå¿?¦ãŒã‚りã¾ã™ã?
131             *
132             * @param       conn    ãƒ??タベã?ス接ç¶?
133             */
134            public HybsXMLSave( final Connection conn ) {
135                    this( conn,null );
136            }
137    
138            /**
139             * コãƒã‚¯ã‚·ãƒ§ãƒ³ã¨ãƒ??ブルåã‚’æŒ?®šã—ã¦ã€ã‚ªãƒ–ジェクトを構築ã—ã¾ã™ã?
140             * ã“ã“ã§æŒ?®šã™ã‚‹ãƒ†ãƒ¼ãƒ–ルåã?ã€ãƒ‡ãƒ•ォルトテーブルã¨ã?†æ‰±ã?§ã™ã?
141             * æ‹¡å¼µXDKå½¢å¼ã?ROWSETã‚¿ã‚°ã®tableName属æ?ã«ãƒ??ブルåãŒè¨˜è¿°ã•れã¦ã?‚‹å ´åˆã?ã€?
142             * ãã¡ã‚‰ãŒå„ªå…ˆã•れã¾ã™ã?
143             *
144             * @og.rev 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ??
145             * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData ã‚?ã“ã?クラスã§ç›´æŽ¥å–å¾—ã™ã‚‹ã?(PostgreSQL対å¿?
146             *
147             * @param       conn    ãƒ??タベã?ス接ç¶?
148             * @param       table   ãƒ??ブルå?ROWSETã‚¿ã‚°ã®table属æ?ãŒæœªè¨­å®šæ™‚ã«ä½¿ç”¨)
149             */
150            public HybsXMLSave( final Connection conn,final String table ) {
151                    connection = conn;
152                    tableName  = table;
153    //              useParamMetaData = ApplicationInfo.useParameterMetaData( conn );
154                    useParamMetaData = useParameterMetaData( connection );          // 5.3.8.0 (2011/08/01)
155            }
156    
157            /**
158             * EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã™ã‚‹ã‹ã©ã?‹ã‚’指定ã§ãã¾ã?åˆæœŸå€¤:true)ã€?
159             * true を指定ã™ã‚‹ã¨ã€ã‚¨ãƒ©ãƒ¼æ™‚ã«ã¯ã€?RuntimeException ã‚?throw ã—ã¾ã™ã?
160             * false ã«ã™ã‚‹ã¨ã€æ¨™æº–エラー出力ã«ã®ã¿ã€å?力ã—ã¾ã™ã?
161             * ã“ã?フラグã¯ã€EXEC_SQL ã®ã¿æœ‰åйã§ã™ã?ãれ以外ã?タブã?処ç?§ã¯ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨
162             * ãã?時点ã§ã€Exception を発行ã—ã¦ã€å?ç?‚’終äº?—ã¾ã™ã?
163             * åˆæœŸå€¤ã¯ã€true(Exception を発行ã™ã‚? ã§ã™ã?
164             *
165             * @og.rev 5.6.9.2 (2013/10/18) æ–°è¦è¿½åŠ?
166             *
167             * @param flag true:Exception を発行ã™ã‚?false:標準エラー出力ã«å‡ºåŠ›ã™ã‚?
168             */
169            public void onExecErrException( final boolean flag ) {
170                    isExecErrException = flag;
171            }
172    
173            /**
174             * &lt;ROWSET&gt; ã‚¿ã‚°ã®ä¸?•ªæœ??ã«å‘¼ã³å‡ºã•れã¾ã™ã?
175             * ROWSET ã®å±žæ?ã§ã‚ã‚‹ã€table 属æ?ã¨ã€dbid 属æ? ã‚’ã?TagElement ã®
176             * get メソãƒ?ƒ‰ã§å–å¾—ã§ãã¾ã™ã?
177             * å–得時ã®ã‚­ãƒ¼ã¯ã€ãれãžã‚Œã?"TABLE" 㨠"DBID" ã§ã™ã?
178             *
179             * @param tag タグエレメン�
180             * @see org.opengion.fukurou.xml.TagElement
181             * @see HybsXMLHandler#setTagElementListener( TagElementListener )
182             */
183            public void actionInit( final TagElement tag ) {
184                    String table = tag.get( "tableName" );
185                    if( table != null ) { tableName = table; }
186            }
187    
188            /**
189             * &lt;ROW&gt; ã‚¿ã‚°ã® endElement 処ç?¯Žã«å‘¼ã³å‡ºã•れã¾ã™ã?
190             * ã“ã? Listener ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€è¡Œãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—é?度ã€?
191             * TagElement オブジェクトを作æ?ã—ã?ã“ã?メソãƒ?ƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ã?
192             *
193             * @og.rev 4.0.0.0 (2007/05/09) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ??
194             * @og.rev 4.0.0.0 (2007/09/25) isOracle ã‹ã‚‰ useParamMetaData ã«å¤‰æ›´
195             * @og.rev 4.3.7.0 (2009/06/01) HSQLDB対�
196             * @og.rev 5.3.8.0 (2011/08/01) useParamMetaData  setNull 対�PostgreSQL対�
197             * @og.rev 5.6.6.1 (2013/07/12) lastSQL 対応ã?ãƒ?ƒãƒ?‚°ç”¨ã«ã€æœ€å¾Œã«ä½¿ç”¨ã—ãŸSQLæ–?‚’残ã—ã¾ã™ã?
198             *
199             * @param tag タグエレメン�
200             * @see org.opengion.fukurou.xml.TagElement
201             * @see HybsXMLHandler#setTagElementListener( TagElementListener )
202             */
203            public void actionRow( final TagElement tag ) {
204                    tag.setAfterMap( afterMap );
205    
206                    String[] vals = null;                   // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
207                    try {
208                            // æ›´æ–°SQL(MERGE_SQLã‚¿ã‚°)ãŒå­˜åœ¨ã™ã‚‹å ´åˆã?処ç?
209                            int tempCnt = 0;
210                            if( updPstmt != null ) {
211    //                              String[] vals = tag.getValues( updClms );
212                                    vals = tag.getValues( updClms );                                                // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
213                                    for( int j=0; j<vals.length; j++ ) {
214                                            // 4.3.7.0 (2009/06/01) HSQLDB対応ã?空æ–?­—ã?å ´å?ullã«ç½®æ›ãˆ
215                                            if( vals[j] != null && vals[j].length() == 0 ){
216                                                    vals[j] = null;
217                                            }
218    
219                                            // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ?
220                                            if( useParamMetaData ) {
221                                                    int type = updMeta.getParameterType( j+1 );
222                                                    // 5.3.8.0 (2011/08/01) setNull 対�
223    //                                              updPstmt.setObject( j+1,vals[j],type );
224                                                    String val = vals[j];
225                                                    if( val == null || val.isEmpty() ) {
226                                                            updPstmt.setNull( j+1, type );
227                                                    }
228                                                    else {
229                                                            updPstmt.setObject( j+1, val, type );
230                                                    }
231                                            }
232                                            else {
233                                                    updPstmt.setObject( j+1,vals[j] );
234                                            }
235    
236                                    }
237                                    tempCnt = updPstmt.executeUpdate();
238                                    if( tempCnt > 1 ) {
239                                            String errMsg = "Update キーãŒé‡è¤?—ã¦ã?¾ã™ã?"
240                                                            + "TABLE=[" + tableName + "] ROW=["
241                                                            + tag.getRowNo() + "]" + CR
242                                                            + " SQL=[" + lastSQL + "]" + CR                         // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
243                                                            + tag.toString() + CR
244                                                            + Arrays.toString( vals ) + CR ;                        // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
245                                            throw new RuntimeException( errMsg );
246                                    }
247                                    updCnt += tempCnt;
248                            }
249                            // æ›´æ–°ã?0ä»¶ã®å ´åˆã?ã€INSERT処ç?‚’行ã„ã¾ã™ã?
250                            if( tempCnt == 0 ) {
251                                    // åˆå›žINSERT時ã?タグよりã€DB登録SQLæ–?‚’構築ã—ã¾ã™ã?
252                                    if( insPstmt == null ) {
253                                            insClms = tag.getKeys();
254    //                                      String sql = insertSQL( insClms,tableName );
255    //                                      insPstmt = connection.prepareStatement( sql );
256                                            lastSQL    = insertSQL( insClms,tableName );            // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
257                                            insPstmt = connection.prepareStatement( lastSQL );
258                                            // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ?
259                                            if( useParamMetaData ) { insMeta = insPstmt.getParameterMetaData(); }
260                                    }
261    //                              String[] vals = tag.getValues( insClms );
262                                    vals = tag.getValues( insClms );                                                // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
263                                    for( int j=0; j<vals.length; j++ ) {
264                                            // 4.3.7.0 (2009/06/01) HSQLDB対応ã?空æ–?­—ã?å ´å?ullã«ç½®æ›ãˆ
265                                            if( vals[j] != null && vals[j].length() == 0 ){
266                                                    vals[j] = null;
267                                            }
268    
269                                            // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ?
270                                            if( useParamMetaData ) {
271                                                    int type = insMeta.getParameterType( j+1 );
272                                                    // 5.3.8.0 (2011/08/01) setNull 対�
273    //                                              insPstmt.setObject( j+1,vals[j],type );
274                                                    String val = vals[j];
275                                                    if( val == null || val.isEmpty() ) {
276                                                            insPstmt.setNull( j+1, type );
277                                                    }
278                                                    else {
279                                                            insPstmt.setObject( j+1, val, type );
280                                                    }
281                                            }
282                                            else {
283                                                    insPstmt.setObject( j+1,vals[j] );
284                                            }
285                                    }
286                                    insCnt += insPstmt.executeUpdate();
287                            }
288                    }
289                    catch( SQLException ex ) {
290                            String errMsg = "DB登録エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€?
291                                                    + "TABLE=[" + tableName + "] ROW=["
292                                                    + tag.getRowNo() + "]" + CR
293                                                    + " SQL=[" + lastSQL + "]" + CR                         // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
294                                                    + tag.toString() + CR
295                                                    + Arrays.toString( vals ) + CR                          // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
296                                                    + ex.getMessage() + ":" + ex.getSQLState() + CR ;
297                            throw new RuntimeException( errMsg,ex );
298                    }
299            }
300    
301            /**
302             * &lt;EXEC_SQL&gt; ã‚¿ã‚°ã® endElement 処ç?¯Žã«å‘¼ã³å‡ºã•れã¾ã™ã?
303             * getBody メソãƒ?ƒ‰ã‚’使用ã—ã¦ã€ã“ã®ã‚¿ã‚°ã®BODYéƒ¨ã®æ–?­—å?ã‚’å–å¾—ã—ã¾ã™ã?
304             * ã“ã? Listener ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€EXEC_SQL ãƒ??ã‚¿ã‚’å–å¾—é?度ã€?
305             * TagElement オブジェクトを作æ?ã—ã?ã“ã?メソãƒ?ƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ã?
306             * EXEC_SQL ã‚¿ã‚°ã§ã¯ã€deleteæ–?‚„updateæ–?ªã©ã€ç‰¹æ®Šãªå‰å?ç?‚„後å?ç?”¨ã® SQLã¨
307             * DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?ªã©ã‚‚記述ã§ãã¾ã™ã?
308             * ã“ã“ã§ã¯ç°¡æ˜“çš„ã«ã€ä½•ã‹å®Ÿè¡Œã•れãŸå ´åˆã?ã€delete 処ç?¨è€?ˆã€å‰Šé™¤ã‚«ã‚¦ãƒ³ãƒˆã‚’åŠ?®—ã—ã€?
309             * 0ä»¶ã§å¸°ã£ã¦ããŸå ´åˆã«ã€DDLãŒå®Ÿè¡Œã•れãŸã¨è€?ˆã€DDLカウントを?‹ï¼‘ã—ã¾ã™ã?
310             * ãŸã ã—ã?0ä»¶ delete ã‚‚è?ãˆã‚‰ã‚Œã‚‹ãŸã‚ã€SQLæ–??å…ˆé?æ–?­—ã«ã‚ˆã‚‹ãƒã‚§ãƒ?‚¯ã¯å…¥ã‚Œã¦ãŠãã¾ã™ã?
311             *
312             * @og.rev 5.6.6.1 (2013/07/12) lastSQL 対応ã?ãƒ?ƒãƒ?‚°ç”¨ã«ã€æœ€å¾Œã«ä½¿ç”¨ã—ãŸSQLæ–?‚’残ã—ã¾ã™ã?
313             * @og.rev 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ?
314             * @og.rev 5.6.9.2 (2013/10/18) EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã™ã‚‹ã‹ã©ã?‹ã‚’指å®?
315             *
316             * @param tag タグエレメン�
317             * @see org.opengion.fukurou.xml.TagElement
318             * @see HybsXMLHandler#setTagElementListener( TagElementListener )
319             */
320            public void actionExecSQL( final TagElement tag ) {
321                    Statement execSQL = null ;
322                    try {
323    //                      String sql = tag.getBody();
324                            lastSQL = tag.getBody();                // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
325                            execSQL = connection.createStatement();
326    //                      delCnt += execSQL.executeUpdate( sql ) ;
327    
328                            // 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ?
329    //                      delCnt += execSQL.executeUpdate( lastSQL ) ;
330                            int cnt = execSQL.executeUpdate( lastSQL ) ;
331                            if( cnt > 0 ) { delCnt += cnt; }                             // ä»¶æ•°ãŒè¿”れã°ã€DDLã§ãªã?Ÿã‚ã?削除数を加ç®?
332                            else {
333                                    String sql = lastSQL.trim().toUpperCase( Locale.JAPAN );
334                                    if( !sql.startsWith( "DELETE" ) && !sql.startsWith( "INSERT" ) && !sql.startsWith( "UPDATE" ) ) {
335                                            ddlCnt ++ ;
336                                    }
337                            }
338                    }
339                    catch( SQLException ex ) {
340                            String errMsg = "DB登録エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€?
341                                                    + "TABLE=[" + tableName + "] ROW=["
342                                                    + tag.getRowNo() + "]" + CR
343                                                    + " SQL=[" + lastSQL + "]" + CR                         // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
344                                                    + tag.toString() + CR
345                                                    + ex.getMessage() + ":" + ex.getSQLState() + CR ;
346    
347                            // 5.6.9.2 (2013/10/18) EXEC_SQL ã®ã‚¨ãƒ©ãƒ¼æ™‚ã« Exception を発行ã™ã‚‹ã‹ã©ã?‹ã‚’指å®?
348    
349                            if( isExecErrException ) {
350                                    throw new RuntimeException( errMsg,ex );
351                            }
352                            else {
353                                    System.err.println( errMsg );
354                            }
355                    }
356                    finally {
357                            Closer.stmtClose( execSQL );
358                    }
359            }
360    
361            /**
362             * &lt;MERGE_SQL&gt; ã‚¿ã‚°ã® endElement 処ç?™‚ã«å‘¼ã³å‡ºã•れã¾ã™ã?
363             * getBody メソãƒ?ƒ‰ã‚’使用ã—ã¦ã€ã“ã®ã‚¿ã‚°ã®BODYéƒ¨ã®æ–?­—å?ã‚’å–å¾—ã—ã¾ã™ã?
364             * MERGE_SQLã‚¿ã‚°ã¯ã€ã?ージ処ç?—ãŸã„ãƒ??タ部よりも上ä½ã«è¨˜è¿°ã—ã¦ãŠã
365             * å¿?¦ãŒã‚りã¾ã™ãŒã€ä¸­é–“部ã«è¤?•°å›žè¨˜è¿°ã—ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“ã€?
366             * ã“ã?ã‚¿ã‚°ãŒç¾ã‚Œã‚‹ã¾ã§ã¯ã€INSERT ã®ã¿å®Ÿè¡Œã•れã¾ã™ã?ã“ã?タグ以é™ã?ã€?
367             * ä¸?—¦ UPDATE ã—ã?çµæžœã??ä»¶ã®å ´åˆã?ã€INSERTã™ã‚‹æµã‚Œã«ãªã‚Šã¾ã™ã?
368             * 完å?ã« INSERT ã®ã¿ã§ã‚ã‚‹ãƒ??ã‚¿ã‚’å‰åŠã«ã€UPDATE/INSERTを行ã†
369             * ãƒ??タを後åŠã«ã€ãã®é–“ã«ã€MERGE_SQL ã‚¿ã‚°ã‚’å?れるã“ã¨ã§ã€ç„¡æ„味ãª
370             * UPDATE ã‚’é¿ã‘ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã?
371             * ã“ã? Listener ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€MERGE_SQL ãƒ??ã‚¿ã‚’å–å¾—é?度ã€?
372             * TagElement オブジェクトを作æ?ã—ã?ã“ã?メソãƒ?ƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ã?
373             *
374             * @og.rev 4.0.0.0 (2007/05/09) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ??
375             * @og.rev 4.0.0.0 (2007/09/25) isOracle ã‹ã‚‰ useParamMetaData ã«å¤‰æ›´
376             * @og.rev 5.6.6.1 (2013/07/12) lastSQL 対応ã?ãƒ?ƒãƒ?‚°ç”¨ã«ã€æœ€å¾Œã«ä½¿ç”¨ã—ãŸSQLæ–?‚’残ã—ã¾ã™ã?
377             *
378             * @param tag タグエレメン�
379             * @see org.opengion.fukurou.xml.TagElement
380             * @see HybsXMLHandler#setTagElementListener( TagElementListener )
381             */
382            public void actionMergeSQL( final TagElement tag ) {
383                    if( updPstmt != null ) {
384                            String errMsg = "MERGE_SQLã‚¿ã‚°ãŒã?è¤?•°å›žè¨˜è¿°ã•れã¦ã?¾ã™ã?"
385                                                    + "TABLE=[" + tableName + "] ROW=["
386                                                    + tag.getRowNo() + "]" + CR
387                                                    + " SQL=[" + lastSQL + "]" + CR                         // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
388                                                    + tag.toString() + CR;
389                            throw new RuntimeException( errMsg );
390                    }
391    
392                    String orgSql = tag.getBody();
393                    Matcher matcher = pattern.matcher( orgSql );
394                    updClms = new ArrayList<String>();
395                    while( matcher.find() ) {
396                            // ã“ã“ã§ã¯ã€[XXX]ã«ãƒžãƒƒãƒã™ã‚‹ç‚ºã€å‰å¾Œã?[]ã‚’å–り除ãã¾ã™ã?
397                            updClms.add( orgSql.substring( matcher.start()+1,matcher.end()-1 ) );
398                    }
399    //              String sql = matcher.replaceAll( "?" );
400                    lastSQL = matcher.replaceAll( "?" );            // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
401    
402                    try {
403    //                      updPstmt = connection.prepareStatement( sql );
404                            updPstmt = connection.prepareStatement( lastSQL );
405                            // 4.0.0.0 (2007/09/25) ParameterMetaData を使用ã—ãŸãƒ‘ラメータ設定追åŠ?
406                            if( useParamMetaData ) { updMeta = updPstmt.getParameterMetaData(); }
407                    }
408                    catch( SQLException ex ) {
409                            String errMsg = "Statement作æ?時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€?
410                                                    + "TABLE=[" + tableName + "] ROW=["
411                                                    + tag.getRowNo() + "]" + CR
412                                                    + " SQL=[" + lastSQL + "]" + CR                         // 5.6.6.1 (2013/07/12) ãƒ?ƒãƒ?‚°ç”¨
413                                                    + tag.toString() + CR
414                                                    + ex.getMessage() + ":" + ex.getSQLState() + CR ;
415                            throw new RuntimeException( errMsg,ex );
416                    }
417            }
418    
419            /**
420             * UPDATE,DELETE を行ã†å ´åˆã? WHERE æ¡ä»¶ã«ãªã‚‹ã‚­ãƒ¼é…å?
421             * ã“ã?キー㮠AND æ¡ä»¶ã§ã‚«ãƒ©ãƒ?‚’特定ã—ã€UPDATE,DELETE ãªã©ã®å‡¦ç?‚’
422             * 行ã„ã¾ã™ã?
423             *
424             * @param       keyCols WHEREæ¡ä»¶ã«ãªã‚‹ã‚­ãƒ¼é…å?
425             */
426            public void setKeyColumns( final String[] keyCols ) {
427                    keyColumns = new String[keyCols.length];
428                    System.arraycopy( keyCols,0,keyColumns,0,keyColumns.length );
429            }
430    
431            /**
432             * XMLファイルを読ã¿å–ã‚‹å‰ã«æŒ?®šã™ã‚‹ã‚«ãƒ©ãƒ?¨å€¤ã®ãƒšã‚¢(マッãƒ?æƒ??ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
433             *
434             * ã“ã?カラãƒ?¨å€¤ã®ãƒšã‚¢ã®ãƒžãƒƒãƒ—ã?ã€ã‚ªãƒ–ジェクト構築å‰ã«è¨­å®šã•れる為ã€?
435             * XMLファイルã«ã‚­ãƒ¼ãŒå­˜åœ¨ã—ã¦ã?‚‹å ´åˆã?ã€å?ãŒæ›¸ã変ã‚りã¾ã™ã?(XML優å…?
436             * XMLファイルã«ã‚­ãƒ¼ãŒå­˜åœ¨ã—ã¦ã?ªã??åˆã?ã€ã“ã“ã§æŒ?®šã™ã‚‹Mapã®å€¤ã?
437             * åˆæœŸè¨­å®šå?ã¨ã—ã¦ä½¿ç”¨ã•れã¾ã™ã?
438             * ã“ã“ã§æŒ?®šã™ã‚?Map ã« LinkedHashMap を使用ã™ã‚‹å ´åˆã?カラãƒ??ã‚?
439             * æŒ?®šã™ã‚‹ã“ã¨ãŒå?æ¥ã¾ã™ã?
440             *
441             * @param       map     åˆæœŸè¨­å®šã™ã‚‹ã‚«ãƒ©ãƒ?ƒ‡ãƒ¼ã‚¿ãƒžãƒƒãƒ?
442             * @see #setAfterMap( Map )
443             */
444            public void setDefaultMap( final Map<String,String> map ) { defaultMap = map; }
445    
446            /**
447             * XMLファイルを読ã¿å–ã£ãŸå¾Œã§æŒ?®šã™ã‚‹ã‚«ãƒ©ãƒ?¨å€¤ã®ãƒšã‚¢(マッãƒ?æƒ??ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
448             *
449             * ã“ã?カラãƒ?¨å€¤ã®ãƒšã‚¢ã®ãƒžãƒƒãƒ—ã?ã€ã‚ªãƒ–ジェクト構築後ã«è¨­å®šã•れる為ã€?
450             * XMLファイルã®ã‚­ãƒ¼ã®å­˜åœ¨ã«é–¢ä¿‚ãªãã?Mapã®ã‚­ãƒ¼ã¨å€¤ãŒä½¿ç”¨ã•れã¾ã™ã?(Map優å…?
451             * null を設定ã—ãŸå?åˆã?ã€ãªã«ã‚‚å?ç?•れã¾ã›ã‚“ã€?
452             *
453             * @param map   後設定ã™ã‚‹ã‚«ãƒ©ãƒ?ƒ‡ãƒ¼ã‚¿ãƒžãƒƒãƒ?
454             * @see #setDefaultMap( Map )
455             */
456            public void setAfterMap( final Map<String,String> map ) { afterMap = map; }
457    
458            /**
459             * ãƒ??タベã?スã«è¿½åŠ??ç?INSERT)を行ã„ã¾ã™ã?
460             *
461             * å…ˆã«æŒ?®šã•れãŸã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’用ã?¦ã€æŒ‡å®šã?ãƒ??ブル㫠INSERT ã—ã¾ã™ã?
462             * 引数ã«ã¯ã€XMLファイルを指定ã—ãŸãƒªãƒ¼ãƒ??ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
463             * コãƒã‚¯ã‚·ãƒ§ãƒ³ã¯ã€çµ‚äº?¾Œã?コミットã•れã¾ã™ã?(close ã•れã¾ã›ã‚“ã€?
464             * リーãƒ??ã®ã‚¯ãƒ­ãƒ¼ã‚ºã¯ã€ã“ã“ã§ã¯è¡Œã£ã¦ã?¾ã›ã‚“ã€?
465             *
466             * @og.rev 5.1.1.0 (2009/11/11) insMeta , updMeta ã®ã‚¯ãƒªã‚¢(気休ã‚)
467             *
468             * @param       reader  XMLファイルを指定ã™ã‚‹ãƒªãƒ¼ãƒ??
469             */
470            public void insertXML( final Reader reader ) {
471                    try {
472                            HybsXMLHandler handler = new HybsXMLHandler();
473                            handler.setTagElementListener( this );
474                            handler.setDefaultMap( defaultMap );
475    
476                            handler.parse( reader );
477                    }
478                    finally {
479                            Closer.stmtClose( insPstmt );
480                            Closer.stmtClose( updPstmt );
481                            insPstmt = null;
482                            updPstmt = null;
483                            insMeta = null;         // 5.1.1.0 (2009/11/11)
484                            updMeta = null;         // 5.1.1.0 (2009/11/11)
485                    }
486            }
487    
488            /**
489             * インサート用ã®SQLæ–?‚’作æ?ã—ã¾ã™ã?
490             *
491             * @param       columns インサートã™ã‚‹ã‚«ãƒ©ãƒ?
492             * @param       tableName       インサートã™ã‚‹ãƒ†ãƒ¼ãƒ–ルå?
493             *
494             * @return      インサート用ã®SQLæ–?
495             */
496            private String insertSQL( final String[] columns,final String tableName ) {
497                    if( tableName == null ) {
498                            String errMsg = "tableName ãŒã‚»ãƒ?ƒˆã•れã¦ã?¾ã›ã‚“ã€? + CR
499                                                    + "tableName ã¯ã€ã‚³ãƒ³ã‚¹ãƒˆãƒ©ã‚¯ã‚¿ã§æŒ?®šã™ã‚‹ã‹ã€ROWSETã®tableName属æ?ã§"
500                                                    + "æŒ?®šã—ã¦ãŠãå¿?¦ãŒã‚りã¾ã? + CR ;
501                            throw new RuntimeException( errMsg );
502                    }
503    
504                    StringBuilder sql = new StringBuilder();
505                    sql.append( "INSERT INTO " ).append( tableName );
506                    sql.append( " ( " );
507                    sql.append( columns[0] );
508                    for( int i=1; i<columns.length; i++ ) {
509                            sql.append( "," ).append( columns[i] );
510                    }
511                    sql.append( " ) VALUES ( " );
512                    sql.append( "?" );
513                    for( int i=1; i<columns.length; i++ ) {
514                            sql.append( "," ).append( "?" );
515                    }
516                    sql.append( " )" );
517    
518                    return sql.toString();
519            }
520    
521            /**
522             * ãƒ??タベã?スã«è¿½åŠ?—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã?
523             *
524             * @return 登録件数
525             */
526            public int getInsertCount() { return insCnt; }
527    
528            /**
529             * ãƒ??タベã?スを更新ã—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã?
530             * ã“れã¯ã€æ‹¡å¼µXDKå½¢å¼ã§ã€MERGE_SQL タグを使用ã—ãŸå ´åˆã?更新処ç?»¶æ•°ã‚?
531             * åˆè¨ˆã—ãŸå?ã‚’è¿”ã—ã¾ã™ã?
532             *
533             * @return æ›´æ–°ä»¶æ•°
534             */
535            public int getUpdateCount() { return updCnt; }
536    
537            /**
538             * ãƒ??タベã?スã«å¤‰æ›´(æ›´æ–°ã€å‰Šé™¤ã‚’å«ã‚?ã—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã?
539             * ã“れã¯ã€æ‹¡å¼µXDKå½¢å¼ã§ã€EXEC_SQL タグを使用ã—ãŸå ´åˆã?実行件数をåˆè¨ˆã—ã?
540             * 値を返ã—ã¾ã™ã?
541             * よã£ã¦ã€æ›´æ–°ã‹ã?追åŠ?‹ã€å‰Šé™¤ã‹ã?ã€åˆ¤ã‚Šã¾ã›ã‚“ãŒã?通常 登録å‰ã«å‰Šé™¤ã™ã‚‹
542             * ケースã§ä½¿ã‚れるã“ã¨ã‹ã‚‰ã€deleteCount ã¨ã—ã¦ã?¾ã™ã?
543             *
544             * @return 変更件数(主ã«ã€å‰Šé™¤ä»¶æ•°)
545             */
546            public int getDeleteCount() { return delCnt; }
547    
548            /**
549             * ãƒ??タベã?スã«DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰å?ç?—ãŸä»¶æ•°ã‚’è¿”ã—ã¾ã™ã?
550             * ã“れã¯ã€æ‹¡å¼µXDKå½¢å¼ã§ã€EXEC_SQL タグを使用ã—ãŸå ´åˆã?実行件数をåˆè¨ˆã—ã?
551             * 値を返ã—ã¾ã™ã?
552             * EXEC_SQL ã§ã¯ã€ç™»éŒ²å‰ã«å‰Šé™¤ã™ã‚‹ delete 処ç?‚‚ã€EXEC_SQL タグを使用ã—ã¦å®Ÿè¡Œã—ã¾ã™ãŒ
553             * ãã?処ç?¨åˆ?‘ã¦ã‚«ã‚¦ãƒ³ãƒˆã—ã¾ã™ã?
554             *
555             * @og.rev 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ?
556             *
557             * @return DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰å?ç?—ãŸä»¶æ•°
558             */
559            public int getDDLCount() { return ddlCnt; }
560    
561            /**
562             * 実際ã«ç™»éŒ²ã•れã?ãƒ??ブルåã‚’è¿”ã—ã¾ã™ã?
563             *
564             * ãƒ??ブルåã?ã€æ‹¡å¼µXDKå½¢å¼ã?ROWSETã‚¿ã‚°ã®tableName属æ?ã«
565             * 記述ã—ã¦ãŠãã‹ã?コンストラクターã§å¼•æ•°ã¨ã—ã¦æ¸¡ã—ã¾ã™ã?
566             * 両方æŒ?®šã•れãŸå ´åˆã?ã€ROWSETã‚¿ã‚°ã®tableName属æ?ãŒå„ªå…ˆã•れã¾ã™ã?
567             * ã“ã“ã§ã®è¿”り値ã¯ã€å®Ÿéš›ã«ä½¿ç”¨ã•れã?ãƒ??ブルåã§ã™ã?
568             *
569             * @return 変更件数(主ã«ã€å‰Šé™¤ä»¶æ•°)
570             */
571            public String getTableName() { return tableName; }
572    
573            /**
574             * ã“ã?接続ãŒã€PreparedStatement#getParameterMetaData() を使用ã™ã‚‹ã‹ã©ã?‹ã‚’判定ã—ã¾ã™ã?
575             * 本æ¥ã¯ã€ConnectionFactory#useParameterMetaData(String)を使ã?¹ãã ãŒã?dbid ãŒç„¡ã?Ÿã‚ã?直接å–å¾—ã—ã¾ã™ã?
576             *
577             * @og.rev 5.3.8.0 (2011/08/01) æ–°è¦ä½œæ? ( ApplicationInfo#useParameterMetaData(Connection) ã‹ã‚‰ã‚³ãƒ”ã? )
578             * @og.rev 5.6.7.0 (2013/07/27) ProductName ã¯ã€DBUtil 経由ã§å–å¾—ã™ã‚‹ã?
579             *
580             * @param   conn 接続å?(コãƒã‚¯ã‚·ãƒ§ãƒ³)
581             *
582             * @return      使用ã™ã‚‹å ´åˆï¼štrue / ãã?ä»?false
583             */
584            private static boolean useParameterMetaData( final Connection conn ) {
585    
586                    String dbProductName = DBUtil.getProductName( conn );
587    
588                    return "PostgreSQL".equalsIgnoreCase( dbProductName ) ;
589    
590    //              try {
591    //                      DatabaseMetaData meta = conn.getMetaData();
592    //                      String dbProductName = meta.getDatabaseProductName();
593    //
594    //                      if( "PostgreSQL".equalsIgnoreCase( dbProductName ) ) { return true; }
595    //
596    //                      return false ;
597    //              }
598    //              catch( SQLException ex ) {
599    //                      String errMsg = "DatabaseMetaData ã‹ã‚‰ã€getDatabaseProductName ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€?
600    //                                      + ex.getMessage() + ":" + ex.getSQLState() ;
601    //                      throw new RuntimeException( errMsg,ex );
602    //              }
603            }
604    
605            /**
606             * ãƒ?‚¹ãƒˆç”¨ã®ãƒ¡ã‚¤ãƒ³ãƒ¡ã‚½ãƒ?ƒ‰
607             *
608             * java org.opengion.fukurou.xml.HybsXMLSave USER PASSWD URL TABLE FILE [ENCODE] [DRIVER]
609             *    USER  : DB接続ユーザー(GE)
610             *    PASSWD: DB接続パスワー�GE)
611             *    URL   : DB接続JDBCドライãƒURL(jdbc:oracle:thin:@localhost:1521:HYBS
612             *    TABLE : 登録ã™ã‚‹ãƒ??ブルID(GE21)
613             *    FILE  : 登録ã™ã‚‹ORACLE XDK å½¢å¼?XMLファイル(GE21.xml)
614             *    ENCODE: ファイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ?åˆæœŸå€¤:UTF-8
615             *    DRIVER: JDBCドライãƒã? åˆæœŸå€¤:oracle.jdbc.OracleDriver
616             *
617             * @og.rev 5.1.1.0 (2009/12/01) MySQL対å¿?明示çš?«ã€TRANSACTION_READ_COMMITTED を指定ã™ã‚‹ã?
618             * @og.rev 5.6.7.0 (2013/07/27) DDL?ˆãƒ‡ãƒ¼ã‚¿å®šç¾©è¨?ªžï¼šData Definition Language?‰ã?処ç?»¶æ•°è¿½åŠ?
619             *
620             * @param       args    コマンド引数é…å?
621             * @throws Exception
622             */
623            public static void main( final String[] args )
624                            throws ClassNotFoundException , SQLException {
625                    if( args.length < 5 ) {
626                            LogWriter.log( "Usage: java org.opengion.fukurou.xml.HybsXMLSave USER PASSWD URL TABLE FILE [ENCODE] [DRIVER]" );
627                            LogWriter.log( "   USER  : DB接続ユーザー(GE)" );
628                            LogWriter.log( "   PASSWD: DB接続パスワー�GE)" );
629                            LogWriter.log( "   URL   : DB接続JDBCドライãƒURL(jdbc:oracle:thin:@localhost:1521:HYBS)" );
630                            LogWriter.log( "   TABLE : 登録ã™ã‚‹ãƒ??ブルID(GE21)" );
631                            LogWriter.log( "   FILE  : 登録ã™ã‚‹ORACLE XDK å½¢å¼?XMLファイル(GE21.xml)" );
632                            LogWriter.log( " [ ENCODE: ファイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ?åˆæœŸå€¤:UTF-8 ]" );
633                            LogWriter.log( " [ DRIVER: JDBCドライãƒã? åˆæœŸå€¤:oracle.jdbc.OracleDriver ]" );
634                            return ;
635                    }
636    
637                    String user   = args[0] ;
638                    String passwd = args[1] ;
639                    String url    = args[2] ;
640                    String table  = args[3] ;
641                    String file   = args[4] ;
642                    String encode = ( args.length == 6 ) ? args[5] : "UTF-8"  ;
643                    String driver = ( args.length == 7 ) ? args[6] : "oracle.jdbc.OracleDriver"  ;
644    
645                    Class.forName(driver);
646    
647                    Connection conn = DriverManager.getConnection( url,user,passwd );
648                    Reader reader = null;
649                    int insCnt;
650                    int updCnt;
651                    int delCnt;
652                    int ddlCnt;                     // 5.6.7.0 (2013/07/27) DDL処ç?»¶æ•°è¿½åŠ?
653                    try {
654                            conn.setAutoCommit( false );
655                            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  // 5.1.1.0 (2009/12/01)
656                            HybsXMLSave save = new HybsXMLSave( conn,table );
657    
658                            reader = new BufferedReader(new InputStreamReader(
659                                                                    new FileInputStream( file ) ,encode ));
660                            save.insertXML( reader );
661                            insCnt = save.getInsertCount();
662                            updCnt = save.getUpdateCount();
663                            delCnt = save.getDeleteCount();
664                            ddlCnt = save.getDDLCount();            // 5.6.7.0 (2013/07/27) DDL処ç?»¶æ•°è¿½åŠ?
665    
666                            Closer.commit( conn );
667                    }
668                    // FileNotFoundException , UnsupportedEncodingException
669                    catch( java.io.FileNotFoundException ex ) {
670                            String errMsg = "ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“ã€? + ex.getMessage()
671                                                            + CR + "Table=[" + table + "] File =[" + file + "]" ;
672                            throw new RuntimeException( errMsg,ex );
673                    }
674                    catch( java.io.UnsupportedEncodingException ex ) {
675                            String errMsg = "æŒ?®šã?エンコードãŒå­˜åœ¨ã—ã¾ã›ã‚“ã€? + ex.getMessage()
676                                                            + CR + "Table=[" + table + "] Encode =[" + encode + "]" ;
677                            throw new RuntimeException( errMsg,ex );
678                    }
679                    finally {
680                            Closer.ioClose( reader );
681                            Closer.connClose( conn );
682                    }
683    
684                    System.out.println( "XML File[" + file + "] Into [" + table + "] Table" );
685                    System.out.println( "   Insert Count : [" + insCnt + "]" );
686                    System.out.println( "   Update Count : [" + updCnt + "]" );
687                    System.out.println( "   Delete Count : [" + delCnt + "]" );
688                    System.out.println( "   DDL    Count : [" + ddlCnt + "]" );
689            }
690    }