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     *  <tr><td>CACHE          </td><td>||  </td><td>SUBSTRING </td></tr>
038     * </table>
039     *
040     * @og.rev 5.1.4.0 (2010/03/01) 新規作æ?
041     * @og.rev 5.8.5.0 (2015/03/06) CACHE追åŠ?
042     *
043     * @version  5.0
044     * @author   Kazuhiko Hasegawa
045     * @since    JDK5.0,
046     */
047    public enum DBFunctionName {
048            // 引数付きenum定義?šここに、å¿?¦�な関数が増えるたびに、追åŠ?�—てã�?��ますã?
049            //                        CON   SUBSTR
050              ORACLE        ( "||","SUBSTR" )
051            , HSQL          ( "||","SUBSTR" )
052            , POSTGRES      ( "||","SUBSTR" )
053            , MYSQL         ( "||","SUBSTR" )
054            , SQLSERVER     ( "+" ,"SUBSTRING" )
055            , FIREBIRD      ( "||","SUBSTR" ) 
056            , CACHE         ( "||","SUBSTRING" ) ; 
057    
058            private final String dbfCON ;
059            private final String dbfSUBSTR ;
060    
061            /**
062             * コンストラクター(enum の場合ã?、private宣è¨?�•れる)
063             *
064             * @og.rev 5.1.4.0 (2010/03/01) 新規作æ?
065             *
066             * @param       con     第ä¸?¼•数にてæŒ?®?CON)
067             * @param       substr  第ä¸?¼•数にてæŒ?®?SUBSTR)
068             */
069            private DBFunctionName( final String con , final String substr ) {
070                    dbfCON    = con;
071                    dbfSUBSTR = substr;
072            }
073    
074            /**
075             * 共通ファンクションに対応するデータベã?ス個別のファンクション名を返しますã?
076             *
077             * 現時点では、NAME,CON,SUBSTR のみ使用できますã?
078             *
079             *
080             * @og.rev 5.1.4.0 (2010/03/01) 新規作æ?
081             *
082             * @param   func 共通ファンクション
083             *
084             * @return  ファンクションå�?
085             */
086            public String getFunctionName( final String func ) {
087                    if( "NAME".equals(   func ) ) { return toString();      }
088                    if( "CON".equals(    func ) ) { return dbfCON;          }
089                    if( "SUBSTR".equals( func ) ) { return dbfSUBSTR;       }
090    
091                    return func;
092            }
093    
094            /**
095             * シーケンス名よりシーケンスオブジェクトを検索しã?次の値を取りå?しますã?
096             * DBに対するシーケンスオブジェクトã?予め作æ?されてã�?‚‹å¿?¦�がありますã?
097             *
098             * またã?MySQLの場合ã?、シーケンスオブジェクトが実è£?�•れてã�?�ªã�?�Ÿめã?
099             * å†?ƒ¨çš?�«は、引数のシーケンス名と同じ名前のãƒ??ブルから、Integer型ã?
100             * "SEQID"とã�?�†é ?›®名を検索することにより、シーケンスをエミュレートしてã�?�¾すã?
101             *
102             * @og.rev 5.1.9.0 (2010/08/01) 新規追åŠ?
103             * @og.rev 5.8.5.0 (2015/03/06) CACHE追åŠ?
104             *
105             * @param seqName シーケンスå�?
106             * @param tran トランザクション
107             *
108             * @return シーケンス番号
109             */
110            public int getSequence( final String seqName, final Transaction tran ) {
111                    String sql = null;
112                    String[][] rtn = null;
113                    switch ( this ) {
114                            case ORACLE:
115                                    sql = "select " + seqName + ".nextval from dual";
116                                    break;
117                            case HSQL:
118                                    sql = "select next value for " + seqName + " from dual";
119                                    break;
120                            case POSTGRES:
121                                    sql = "select nextval('" + seqName + "')";
122                                    break;
123                            case MYSQL:
124                                    sql = "update " + seqName + " set SEQID = last_insert_id(SEQID+1)";
125                                    DBUtil.dbExecute( sql, new String[0], tran );
126                                    sql = "select last_insert_id()";
127                                    break;
128                            case SQLSERVER:
129                                    throw new RuntimeException( "現在、SQLSERVERではシーケンス機è?はサポã?トされてã�?�¾せんã€? );
130                            case FIREBIRD:
131                                    sql = "select gen_id(" + seqName + ", 1) from rdb$database";
132                                    break;
133                            case CACHE:
134                                    throw new RuntimeException( "現在、CACHEではシーケンス機è?はサポã?トされてã�?�¾せんã€? );
135                            default:
136                                    throw new RuntimeException( "現在、このãƒ??タベã?スではシーケンス機è?はサポã?トされてã�?�¾せんã€? );
137                    }
138    
139                    rtn = DBUtil.dbExecute( sql, new String[0], tran );
140                    return Integer.valueOf( rtn[0][0] );
141            }
142    
143            /**
144             * å�?ƒ‡ータベã?スに対応するenum名を返しますã?
145             *
146             * @og.rev 5.1.4.0 (2010/03/01) 新規作æ?
147             * @og.rev 5.8.5.0 (2015/03/06) CACHE追åŠ?
148             *
149             * @param   dbName ãƒ??タベã?スå�?
150             *
151             * @return  ãƒ??タベã?スに対応するenumå�?
152             */
153            public static DBFunctionName getDBName( final String dbName ) {
154                    String dbn = dbName.toUpperCase( Locale.JAPAN );
155    
156                    if(      dbn.indexOf( "ORACLE"          ) >= 0 ) { return DBFunctionName.ORACLE;     }
157                    else if( dbn.indexOf( "HSQL"            ) >= 0 ) { return DBFunctionName.HSQL;               }
158                    else if( dbn.indexOf( "POSTGRES"        ) >= 0 ) { return DBFunctionName.POSTGRES;   }
159                    else if( dbn.indexOf( "MYSQL"           ) >= 0 ) { return DBFunctionName.MYSQL;              }
160                    else if( dbn.indexOf( "SQLSERVER"       ) >= 0 ) { return DBFunctionName.SQLSERVER;  }
161                    else if( dbn.indexOf( "FIREBIRD"        ) >= 0 ) { return DBFunctionName.FIREBIRD;   }
162                    else if( dbn.indexOf( "CACHE"           ) >= 0 ) { return DBFunctionName.CACHE;      }
163    
164                    final String errMsg = "初期化時に、指定ã? dbName キーが存在しませんã€?
165                                                    + "[" + dbn + "]" ;
166    
167                    throw new RuntimeException( errMsg );
168            }
169    
170            /**
171             * å�?ƒ‡ータベã?スに対応するファンクション名を返しますã?
172             *
173             * @og.rev 4.3.8.0 (2009/08/01) SUBSTRを追åŠ?
174             * @og.rev 5.1.2.0 (2010/01/01) MySQL対å¿?SUBSTRBå»?­¢(帳票ãƒ??タのåˆ?‰²のå†?ƒ¨処ç�?Œ–に伴ã�?
175             * @og.rev 5.1.4.0 (2010/03/01) ãƒ??タベã?スå�?ではなくã?dbid で判断するように変更
176             * @og.rev 5.7.7.2 (2014/06/20) DBF.NAME 時ã?処ç�??簡ç´?Œ–
177             *
178             * @param   func ファンクションå�?定義æ–?­?
179             * @param   dbid 接続å?ID
180             *
181             * @return  実ファンクションå�?
182             */
183            public static String getFunctionName( final String func ,final String dbid ) {
184    //              DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( dbid ) );
185    
186                    // 5.7.7.2 (2014/06/20) DBF.NAME 時ã?処ç�??簡ç´?Œ–
187                    String dbName = ConnectionFactory.getDBName( dbid );
188                    if( "NAME".equals( func ) ) { return dbName; }
189                    else {
190                            return getDBName( dbName ).getFunctionName( func );
191                    }
192    
193    //              return dbName.getFunctionName( func );
194            }
195    }