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.util;
017
018 import java.sql.Connection;
019 import java.sql.CallableStatement;
020 import java.sql.SQLException;
021
022 /**
023 * <P>ApplicationInfo.java ã¯ã€å?通的ã«ä½¿ç”¨ã•れã‚?å†?ƒ¨æƒ??ã‚’æ?ç´ã™ã‚‹ã‚ªãƒ–ジェクトã§ã™ã?</P>
024 *
025 * å†?ƒ¨æƒ??ã¨ã¯ã€æŽ¥ç¶šãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæƒ…å ±ã¨ã€å®Ÿè¡Œçжæ³ã?アプリケーションæƒ??ãŒã‚りã¾ã™ã?
026 *
027 * ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæƒ…å ±ã¨ã¯ã€?i=192.168.51.81,h=null,u=C12345" çš?ªæ–?—å?ã§ã€?
028 * i=ã®å¾Œã‚ã« IPアドレスã€h=ã®å¾Œã‚ã«ãƒ›ã‚¹ãƒˆåã€u=ã®å¾Œã‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ã‚»ãƒ?ƒˆã—ã¦ã€?
029 * DBMS_APPLICATION_INFO.SET_CLIENT_INFO( "i=192.168.51.81,h=null,u=C12345" ) ã‚?
030 * CALL ã—ã¾ã™ã?
031 *
032 * アプリケーションæƒ??ã¨ã¯ã€?o=SELECT,p=GEXXXX" çš?ªæ–?—å?ã§ã€o=ã®å¾Œã‚ã« æ“作ã?
033 * p=ã®å¾Œã‚ã«ãƒ—ãƒã‚°ãƒ©ãƒ?Dã‚’ã‚»ãƒ?ƒˆã—ã¦ã€?
034 * DBMS_APPLICATION_INFO.SET_MODULE( "GE0010","o=æ“ä½?p=プãƒã‚°ãƒ©ãƒ?D" ) ã‚?
035 * CALL ã—ã¾ã™ã?
036 *
037 * ã“ã?PL/SQL を使用ã™ã‚‹ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ã?¦å®Ÿè¡Œã™ã‚‹ã¨ã€ã‚¢ã‚¯ã‚»ã‚¹ãƒã‚°è¨˜éŒ²ã‚’行ã†ç‚ºã®
038 * æƒ??ã¨ã—ã¦å–り出ã™ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã?
039 * 確èªã?ã€V$SESSION ã® MODULE , ACTION , CLIENT_INFO ã§è¡Œã„ã¾ã™ã?
040 *
041 * ã“ã?クラスã¯ã€åŒæœŸåŒ–ã•れã¦ã?¾ã›ã‚“ã€?
042 *
043 * @og.rev 3.8.7.0 (2006/12/15) æ–°è¦è¿½åŠ?
044 *
045 * @version 0.9.0 2000/10/12
046 * @author Kazuhiko Hasegawa
047 * @since JDK1.1,
048 */
049 public final class ApplicationInfo {
050 /** SET_CLIENT_INFO( "i=192.168.51.81,h=null,u=C12345" ) */
051 public static final String CLIENT_INFO = "{ call DBMS_APPLICATION_INFO.SET_CLIENT_INFO( ? ) }" ;
052 /** SET_MODULE( "GE0010","o=æ“ä½?p=プãƒã‚°ãƒ©ãƒ?D" ) */
053 public static final String MODULE = "{ call DBMS_APPLICATION_INFO.SET_MODULE( ?,? ) }" ;
054
055 private String gamenId = null;
056 private String clientInfo = "";
057 private String moduleInfo = "";
058
059 /**
060 * ユーザーID,IPアドレス,ホストå を指定ã—ã¦ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæƒ…å ±ã‚’è¨å®šã—ã¾ã™ã?
061 *
062 * ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæƒ…å ±ã¨ã¯ã€?i=192.168.51.81,h=null,u=C12345" çš?ªæ–?—å?ã§ã€?
063 * i=ã®å¾Œã‚ã« IPアドレスã€h=ã®å¾Œã‚ã«ãƒ›ã‚¹ãƒˆåã€u=ã®å¾Œã‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ã‚»ãƒ?ƒˆ
064 * ã—ã¦ã?¾ã™ã?
065 *
066 * @param userId ユーザーID
067 * @param ipAdrs IPアドレス
068 * @param host ホストå
069 */
070 public void setClientInfo( final String userId,final String ipAdrs,final String host ) {
071 StringBuilder buf = new StringBuilder();
072 append( "i=" , ipAdrs , buf );
073 append( "h=" , host , buf );
074 append( "u=" , userId , buf );
075
076 clientInfo = buf.toString() ;
077 }
078
079 /**
080 * ç”»é¢ID,æ“ä½?プãƒã‚°ãƒ©ãƒ?Dを指定ã—ã¦ã€ã‚¢ãƒ—リケーションã«é–¢ã™ã‚‹æƒ??ã‚’è¨å®šã—ã¾ã™ã?
081 *
082 * ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæƒ…å ±ã¨ã¯ã€?o=SELECT,p=GEXXXX" çš?ªæ–?—å?ã§ã€?
083 * o=ã®å¾Œã‚ã« æ“作ã?p=ã®å¾Œã‚ã«ãƒ—ãƒã‚°ãƒ©ãƒ?Dã‚’ã‚»ãƒ?ƒˆã—ã¦ã?¾ã™ã?
084 *
085 * @param gamenId ç”»é¢ID
086 * @param ope オペレーション(æ“ä½?
087 * @param prgId プãƒã‚°ãƒ©ãƒ?D
088 */
089 public void setModuleInfo( final String gamenId,final String ope,final String prgId ) {
090 this.gamenId = gamenId ;
091
092 StringBuilder buf = new StringBuilder();
093 append( "o=" , ope , buf );
094 append( "p=" , prgId , buf );
095
096 moduleInfo = buf.toString() ;
097 }
098
099 /**
100 * setModuleInfo ã§æœ?¾Œã«è¨å®šã•れ㟠画é¢IDã‚’è¿”ã—ã¾ã™ã?
101 *
102 * ãªã«ã‚‚è¨å®šã•れã¦ã?ªã??期状態ã?ã€null ã§ã™ã?
103 *
104 * @return ç”»é¢ID
105 * @see #setModuleInfo( String,String,String )
106 */
107 public String getGamenId() {
108 return gamenId ;
109 }
110
111 /**
112 * key 㨠val ã‚’é?çµã—ãŸæ–‡å—å?を作æ?ã—ã¾ã™ã?
113 * 引数㮠val ã?null ã®å ´åˆã?ã€ä½•ã‚‚æ“作ã—ã¾ã›ã‚“ã€?
114 * buf ã«ã™ã§ã«ãªã«ã‹ãŒç™»éŒ²æ¸ˆã¿ã®å ´åˆã?ã€?," を追åŠ?—ã¦ã‹ã‚‰ã€??çµã—ã¾ã™ã?
115 *
116 * @param key ã‚ー
117 * @param val 値
118 * @param buf 連çµã™ã‚‹StringBuilderオブジェクãƒ?
119 */
120 private void append( final String key,final String val,final StringBuilder buf ) {
121 if( val != null ) {
122 if( buf.length() == 0 ) { buf.append( key ).append( val ); }
123 else { buf.append( ',' ).append( key ).append( val ); }
124 }
125 }
126
127 /**
128 * アクセスãƒã‚°è¨˜éŒ²ã‚’行ã†ç‚ºã® DBMS_APPLICATION_INFO.SET_CLIENT_INFO ã¨ã€?
129 * DBMS_APPLICATION_INFO.SET_MODULE ã‚?CALL ã—ã¾ã™ã?
130 *
131 * SET_CLIENT_INFO( "i=192.168.51.81,h=null,u=C12345" ) ã§ã¯ã€?
132 * ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæƒ…å ±ã¨ã—ã¦ã€?i=192.168.51.81,h=null,u=C12345" çš?ªæ–?—å?ã§ã€?
133 * i=ã®å¾Œã‚ã« IPアドレスã€h=ã®å¾Œã‚ã«ãƒ›ã‚¹ãƒˆåã€u=ã®å¾Œã‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ã‚»ãƒ?ƒˆã—ã¦ã?¾ã™ã?
134 *
135 * SET_MODULE( "GE0010","o=æ“ä½?p=プãƒã‚°ãƒ©ãƒ?D" )ã§ã¯ã€?
136 * アプリケーションã«é–¢ã™ã‚‹æƒ??ã¨ã—ã¦ã€?o=æ“ä½?p=プãƒã‚°ãƒ©ãƒ?D" ã‚’ã‚»ãƒ?ƒˆã—ã¦ã?¾ã™ã?
137 * 確èªã?ã€V$SESSION ã® MODULE , ACTION , CLIENT_INFO ã§è¡Œã„ã¾ã™ã?
138 *
139 * @param conn 接続å?(コãƒã‚¯ã‚·ãƒ§ãƒ³)
140 */
141 public void callAppInfo( final Connection conn ) {
142 CallableStatement callStmt ;
143 try {
144 callStmt = conn.prepareCall( CLIENT_INFO );
145 callStmt.setString( 1,clientInfo );
146 callStmt.executeUpdate();
147 callStmt.close();
148
149 callStmt = conn.prepareCall( MODULE );
150 callStmt.setString( 1,gamenId );
151 callStmt.setString( 2,moduleInfo );
152 callStmt.executeUpdate();
153 callStmt.close();
154 }
155 catch (SQLException ex) {
156 String errMsg = "å±¥æ´åŽé›†å‡¦ç?‚’実行ã§ãã¾ã›ã‚“ã§ã—ãŸã€?
157 + ex.getMessage() + ":" + ex.getSQLState() ;
158 throw new RuntimeException( errMsg,ex );
159 }
160 }
161
162 /**
163 * ã“ã?接続ãŒã€PreparedStatement#getParameterMetaData() を使用ã™ã‚‹ã‹ã©ã?‹ã‚’判定ã—ã¾ã™ã?
164 *
165 * PreparedStatement ã«å¯¾ã—ã¦ã€String化ã•れ㟠数å—ãªã©ã‚?setObject( int,String ) ã™ã‚‹ã¨ãã?
166 * ORACLE 㨠SQLServer ã¯ã€ãã®ã¾ã¾è¨å®šã™ã‚Œã?ã€è?å‹•çš„ã«å¤‰æ›ã•れã¾ã™ã?
167 * postgreSQL ã§ã¯ã€ParameterMetaData#getParameterType(int) ã§ã€ã‚«ãƒ©ãƒ?‚¿ã‚¤ãƒ—ã‚’å–å¾—ã—ã€?
168 * setObject( int,String,int ) ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã?
169 * ãã?判定ã«ã€ã“ã®ãƒ¡ã‚½ãƒ?ƒ‰ã‚’使用ã—ã¾ã™ã?
170 * ã“ã?çµæžœã¯ã€ã‚ãã¾ã§ã€å„種ãƒ??タベã?ス毎ã?実地調査ã®çµæžœã‚’å?ã«ã€åˆ¤å®šçµæžœã‚?
171 * è¿”ã™ã‚ˆã†ã«ã—ã¦ã?¾ã™ã?
172 * ORACLE ã®å ´åˆã?ã€ä½¿ç”¨ã—ãªã?false)ãŒè¿”るよã†ã«è¨å®šã—ã¦ã?¾ã™ã?
173 * SQLServer ã§ã¯ã€ORACLEã¨åŒæ§˜ã«ã€false ã‚’è¿”ã—ã¾ã™ã?
174 *
175 * @og.rev 4.0.0.0 (2007/09/25) æ–°è¦è¿½åŠ?
176 * @og.rev 5.1.1.0 (2009/12/01) MySQL/PostgreSQL 対�
177 * @og.rev 5.3.8.0 (2011/08/01) å»?¢( ConnectionFactory#useParameterMetaData(String) ã«ç§»å‹?)
178 *
179 * @param conn 接続å?(コãƒã‚¯ã‚·ãƒ§ãƒ³)
180 *
181 * @return 使用ã™ã‚‹å ´åˆï¼štrue / ãã?ä»?false
182 */
183 // public static boolean useParameterMetaData( final Connection conn ) {
184 //// return false;
185 //
186 // try {
187 // DatabaseMetaData meta = conn.getMetaData();
188 // String dbProductName = meta.getDatabaseProductName();
189 //
190 // // if( "ORACLE".equalsIgnoreCase( dbProductName ) ) { return false; }
191 // // if( "Microsoft SQL Server".equalsIgnoreCase( dbProductName ) ) { return false; }
192 //
193 // if( "PostgreSQL".equalsIgnoreCase( dbProductName ) ) { return true; }
194 //
195 // return false ;
196 // }
197 // catch (SQLException ex) {
198 // String errMsg = "DatabaseMetaData ã‹ã‚‰ã€getDatabaseProductName ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€?
199 // + ex.getMessage() + ":" + ex.getSQLState() ;
200 // throw new RuntimeException( errMsg,ex );
201 // }
202 // }
203 }