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 }