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