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.util.Locale;
019    
020    /**
021     * å?ƒ‡ãƒ¼ã‚¿ãƒ™ã?スã«å¯¾å¿œã™ã‚‹enumåã‚’è¿”ã—ã¾ã™ã?
022     * 主ã«ã€å„ãƒ??タベã?スã«ãŠã‘る関数åã?差異をå¸åŽã™ã‚‹ãŸã‚ã?enumã§ã™ã?
023     * 本æ¥ã¯ã€äº’æ›æ€§ã®ã‚るファンクション以外ã?使用ã—ãªã?‚ˆã?«ã—ã¾ã—ょã??
024     * ã¾ãŸã?ç„¡ã‘れã°äº’æ›æ€§ãƒ‘ックãªã©ã§ã€ãƒ•ァンクションを定義ã—ã¦ã—ã¾ã??ã‚?
025     * ä¸?¤ã®æ–¹æ³•ã§ã™ã?
026     *
027     * <table border="1" frame="box" rules="all" >
028     *  <caption>å?ƒ‡ãƒ¼ã‚¿ãƒ™ã?スã«ãŠã‘る関数</caption>
029     *  <tr><th>ãƒ??タベã?スå?</th><th>連çµ?/th><th>部åˆ?–‡å­—å?</th></tr>
030     *  <tr><td>{&#064;DBF.XXX}</td><td>CON </td><td>SUBSTR    </td></tr>
031     *  <tr><td>ORACLE         </td><td>||  </td><td>SUBSTR    </td></tr>
032     *  <tr><td>HSQL           </td><td>||  </td><td>SUBSTR    </td></tr>
033     *  <tr><td>POSTGRES       </td><td>||  </td><td>SUBSTR    </td></tr>
034     *  <tr><td>MYSQL          </td><td>||  </td><td>SUBSTR    </td></tr>
035     *  <tr><td>SQLSERVER      </td><td>+   </td><td>SUBSTRING </td></tr>
036     *  <tr><td>FIREBIRD       </td><td>||  </td><td>SUBSTR    </td></tr>
037     * </table>
038     *
039     * @og.rev 5.1.4.0 (2010/03/01) æ–°è¦ä½œæ?
040     *
041     * @version  5.0
042     * @author   Kazuhiko Hasegawa
043     * @since    JDK5.0,
044     */
045    public enum DBFunctionName {
046            // 引数付ãenum定義?šã“ã“ã«ã€å¿?¦ãªé–¢æ•°ãŒå¢—ãˆã‚‹ãŸã³ã«ã€è¿½åŠ?—ã¦ã?ã¾ã™ã?
047            //                        CON   SUBSTR
048              ORACLE        ( "||","SUBSTR" )
049            , HSQL          ( "||","SUBSTR" )
050            , POSTGRES      ( "||","SUBSTR" )
051            , MYSQL         ( "||","SUBSTR" )
052            , SQLSERVER     ( "+" ,"SUBSTRING" )
053            , FIREBIRD      ( "||","SUBSTR" ) ;
054    
055            private final String dbfCON ;
056            private final String dbfSUBSTR ;
057    
058            /**
059             * コンストラクター(enum ã®å ´åˆã?ã€private宣è¨?•れる)
060             *
061             * @og.rev 5.1.4.0 (2010/03/01) æ–°è¦ä½œæ?
062             *
063             * @param       con     第ä¸?¼•æ•°ã«ã¦æŒ?®?CON)
064             * @param       substr  第ä¸?¼•æ•°ã«ã¦æŒ?®?SUBSTR)
065             */
066            private DBFunctionName( final String con , final String substr ) {
067                    dbfCON    = con;
068                    dbfSUBSTR = substr;
069            }
070    
071            /**
072             * 共通ファンクションã«å¯¾å¿œã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ã?ス個別ã®ãƒ•ァンクションåã‚’è¿”ã—ã¾ã™ã?
073             *
074             * @og.rev 5.1.4.0 (2010/03/01) æ–°è¦ä½œæ?
075             *
076             * @param   func 共通ファンクション
077             *
078             * @return  ファンクションå?
079             */
080            public String getFunctionName( final String func ) {
081                    if( "NAME".equals( func ) ) { return toString(); }
082                    if( "CON".equals( func ) ) { return dbfCON; }
083                    if( "SUBSTR".equals( func ) ) { return dbfSUBSTR; }
084    
085                    return func;
086            }
087    
088            /**
089             * シーケンスåよりシーケンスオブジェクトを検索ã—ã?次ã®å€¤ã‚’å–りå?ã—ã¾ã™ã?
090             * DBã«å¯¾ã™ã‚‹ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚ªãƒ–ジェクトã?予ã‚作æ?ã•れã¦ã?‚‹å¿?¦ãŒã‚りã¾ã™ã?
091             *
092             * ã¾ãŸã?MySQLã®å ´åˆã?ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚ªãƒ–ジェクトãŒå®Ÿè£?•れã¦ã?ªã?Ÿã‚ã?
093             * å†?ƒ¨çš?«ã¯ã€å¼•æ•°ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹åã¨åŒã˜åå‰ã®ãƒ??ブルã‹ã‚‰ã€Integeråž‹ã?
094             * "SEQID"ã¨ã?†é ?›®åを検索ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚’エミュレートã—ã¦ã?¾ã™ã?
095             *
096             * @og.rev 5.1.9.0 (2010/08/01) æ–°è¦è¿½åŠ?
097             *
098             * @param seqName シーケンスå?
099             * @param tran トランザクション
100             *
101             * @return シーケンス番å·
102             */
103            public int getSequence( final String seqName, final Transaction tran ) {
104                    String sql = null;
105                    String[][] rtn = null;
106                    switch ( this ) {
107                            case ORACLE:
108                                    sql = "select " + seqName + ".nextval from dual";
109                                    break;
110                            case HSQL:
111                                    sql = "select next value for " + seqName + " from dual";
112                                    break;
113                            case POSTGRES:
114                                    sql = "select nextval('" + seqName + "')";
115                                    break;
116                            case MYSQL:
117                                    sql = "update " + seqName + " set SEQID = last_insert_id(SEQID+1)";
118                                    DBUtil.dbExecute( sql, new String[0], tran );
119                                    sql = "select last_insert_id()";
120                                    break;
121                            case SQLSERVER:
122                                    throw new RuntimeException( "ç¾åœ¨ã€SQLSERVERã§ã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹æ©Ÿè?ã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“ã€? );
123                            case FIREBIRD:
124                                    sql = "select gen_id(" + seqName + ", 1) from rdb$database";
125                                    break;
126                            default:
127                                    throw new RuntimeException( "ç¾åœ¨ã€ã“ã®ãƒ??タベã?スã§ã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹æ©Ÿè?ã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“ã€? );
128                    }
129    
130                    rtn = DBUtil.dbExecute( sql, new String[0], tran );
131                    return Integer.valueOf( rtn[0][0] );
132            }
133    
134            /**
135             * å?ƒ‡ãƒ¼ã‚¿ãƒ™ã?スã«å¯¾å¿œã™ã‚‹enumåã‚’è¿”ã—ã¾ã™ã?
136             *
137             * @og.rev 5.1.4.0 (2010/03/01) æ–°è¦ä½œæ?
138             *
139             * @param   dbName ãƒ??タベã?スå?
140             *
141             * @return  ãƒ??タベã?スã«å¯¾å¿œã™ã‚‹enumå?
142             */
143            public static DBFunctionName getDBName( final String dbName ) {
144                    String dbn = dbName.toUpperCase( Locale.JAPAN );
145    
146                    if(      dbn.indexOf( "ORACLE"          ) >= 0 ) { return DBFunctionName.ORACLE;     }
147                    else if( dbn.indexOf( "HSQL"            ) >= 0 ) { return DBFunctionName.HSQL;               }
148                    else if( dbn.indexOf( "POSTGRES"        ) >= 0 ) { return DBFunctionName.POSTGRES;   }
149                    else if( dbn.indexOf( "MYSQL"           ) >= 0 ) { return DBFunctionName.MYSQL;              }
150                    else if( dbn.indexOf( "SQLSERVER"       ) >= 0 ) { return DBFunctionName.SQLSERVER;  }
151                    else if( dbn.indexOf( "FIREBIRD"        ) >= 0 ) { return DBFunctionName.FIREBIRD;   }
152    
153                    final String errMsg = "åˆæœŸåŒ–時ã«ã€æŒ‡å®šã? dbName キーãŒå­˜åœ¨ã—ã¾ã›ã‚“ã€?
154                                                    + "[" + dbn + "]" ;
155    
156                    throw new RuntimeException( errMsg );
157            }
158    
159            /**
160             * å?ƒ‡ãƒ¼ã‚¿ãƒ™ã?スã«å¯¾å¿œã™ã‚‹ãƒ•ァンクションåã‚’è¿”ã—ã¾ã™ã?
161             *
162             * @og.rev 4.3.8.0 (2009/08/01) SUBSTRを追�
163             * @og.rev 5.1.2.0 (2010/01/01) MySQL対å¿?SUBSTRBå»?­¢(帳票ãƒ??ã‚¿ã®åˆ?‰²ã®å†?ƒ¨å‡¦ç?Œ–ã«ä¼´ã?
164             * @og.rev 5.1.4.0 (2010/03/01) ãƒ??タベã?スå?ã§ã¯ãªãã?dbid ã§åˆ¤æ–­ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´
165             *
166             * @param   func ファンクションå?定義æ–?­?
167             * @param   dbid 接続å?ID
168             *
169             * @return  実ファンクションå?
170             */
171            public static String getFunctionName( final String func ,final String dbid ) {
172                    DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( dbid ) );
173    
174                    return dbName.getFunctionName( func );
175            }
176    
177    }