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 * <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 }