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    }