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.hayabusa.taglib;
017
018 import static org.opengion.fukurou.util.StringUtil.nval;
019
020 import java.io.IOException;
021 import java.io.ObjectInputStream;
022 import java.io.ObjectOutputStream;
023 import java.util.Locale;
024
025 import org.opengion.fukurou.db.DBUtil;
026 import org.opengion.fukurou.db.Transaction;
027 import org.opengion.fukurou.db.TransactionReal;
028 import org.opengion.fukurou.util.ErrorMessage;
029 import org.opengion.fukurou.util.StringUtil;
030 import org.opengion.hayabusa.common.HybsSystem;
031 import org.opengion.hayabusa.common.HybsSystemException;
032 import org.opengion.hayabusa.db.DBColumn;
033 import org.opengion.hayabusa.db.DBEditConfig;
034 import org.opengion.hayabusa.db.DBTableModel;
035 import org.opengion.hayabusa.db.Query;
036 import org.opengion.hayabusa.db.QueryFactory;
037 import org.opengion.hayabusa.resource.GUIInfo;
038
039 /**
040 * ãƒ??タベã?スの検索を行うタグですã?
041 *
042 * こã?タグのå†?®¹に、SQLæ–?‚’記述しますã? whereタグã€?andタグ を使ã�?�¨引数に応じて
043 * 実行されるSQLæ–?�Œ異なりまã�?使用例参照)ã€?
044 * またã?PL/SQLのSPで検索を行うときもこã?タグを使ã�?�¾すã?
045 * SystemData の USE_SQL_INJECTION_CHECK ã�?true かã?quotCheck 属æ?ã�?true の場合ã?ã€?
046 * ?³?±?¬インジェクション対策用のクォーãƒ?‚£ションチェãƒ?‚¯を行いますã?リクエスト引数に
047 * クォーãƒ?‚£ション(')が含まれると、エラーになりますã?
048 * 同様にUSE_XSS_CHECKがtrueかã?xssCheck属æ?がtrueの場合ã?ã€?
049 * クロスサイトススクリプティング(XSS)対策ã?ためless/greater than signのチェãƒ?‚¯を行いますã?
050 *
051 * ※ こã?タグは、Transaction タグの対象ですã?
052 *
053 * @og.formSample
054 * ●形式ï¼?
055 * ・<og:query command="NEW" >
056 * SELECTæ–?
057 * </og:query>
058 * ・<og:query command="NEW" names="?¥?¥?¥" queryType="JDBCErrMsg" >
059 * { call PL/SQL(?,?,?,? ) }
060 * </og:query>
061 * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
062 *
063 * ●Tag定義??
064 * <og:query
065 * queryType 【TAG】Query を発行する為のクラスID(JDBC,JDBCCallable,JDBCErrMsg,JDBCUpdate)を指定します{@og.doc03Link queryType 初期値:JDBC})
066 * command 【TAG】コマンãƒ?NEW,RENEW)をセãƒ?ƒˆしまã�?PlsqlUpdateTag,UpdateTag の場合ã?、ENTRY)
067 * scope 【TAG】キャãƒ?‚·ュする場合ã?スコープ[request/page/session/applicaton]を指定しまã�?初期値:session)
068 * maxRowCount 【TAGã€?通常は使ã�?�¾せん)ãƒ??タのæœ?¤§読み込み件数を指定しまã�?(初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限])
069 * skipRowCount 【TAGã€?通常は使ã�?�¾せん)ãƒ??タの読み始めの初期値を指定しまã�?
070 * displayMsg 【TAG】検索結果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?(初期値:VIEW_DISPLAY_MSG[=])
071 * overflowMsg 【TAG】検索ãƒ??タが最大検索数をオーバã?した場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?(初期値:MSG0007[検索結果がã?制限行数をè¶?�ˆましたので、残りはカãƒ?ƒˆされました])
072 * notfoundMsg 【TAG】検索結果がゼロ件の場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0077[対象ãƒ??タはありませんでした])
073 * names 【TAG】PL/SQLを利用する場合ã?引数にセãƒ?ƒˆすべã�?ãƒ??タの名称をCSV形式でè¤?•°æŒ?®šしまã�?
074 * stopZero 【TAG】検索結果が0件のときå?ç�?‚’続行するかどã�?�‹[true/false]を指定しまã�?初期値:false[続行する])
075 * tableId 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
076 * dbid 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しまã�?
077 * trace 【TAG】引数の SQL æ–?‚’ EXPLAIN PLAN を[true:行う/それ以å¤?行わない]を指定しまã�?初期値:false)
078 * checkNames 【TAG】リクエスト変数の正規化を行うカラãƒ?‚’CSV形式でè¤?•°æŒ?®šしまã�?
079 * modifyType 【TAG】DB検索時ã? モãƒ?‚£ファイタイプをæŒ?®šします[A:追åŠ?C:更新/D:削除]
080 * quotCheck 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?初期値:USE_SQL_INJECTION_CHECK)
081 * stopError 【TAG】PLSQL/SQL処ç�?‚¨ラーの時に処ç�?‚’中止するかどã�?�‹[true/false]を設定しまã�?初期値:true)
082 * xssCheck 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_XSS_CHECK[=true])
083 * mainTrans 【TAGã€?通常使ã�?�¾せん)タグで処ç�?�•れる処ç�?�Œメインとなるトランザクション処ç�?�‹どã�?�‹を指定しまã�?初期値:true)
084 * caseKey 【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
085 * caseVal 【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
086 * caseNN 【TAG】指定ã?値がã?null/ゼロæ–?—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
087 * caseNull 【TAG】指定ã?値がã?null/ゼロæ–?—å? の場合ã?、このタグは使用されまã�?初期値:true)
088 * useBeforeHtmlTag 【TAGã€?処ç�?™‚é–?queryTime)などのæƒ??出力[true:有効/false:無効]を指定しまã�?初期値:true)
089 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
090 * > ... Body ...
091 * </og:query>
092 *
093 * ●使用ä¾?
094 * <og:query command="NEW">
095 * select PN,YOBI,NMEN,HINM from XX01 where PN = '{@PN}' order by PN
096 * </og:query>
097 *
098 * ・検索条件がå?力されたæ™?{@PN}がNOT NULLのとã�?
099 * 作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 where PN = 'AAA' order by PN
100 * ・検索条件がå?力されなかった時({@PN}がNULLのとã�?
101 * 作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 where PN = '' order by PN
102 *
103 * <og:query command="NEW">
104 * select PN,YOBI,NMEN,HINM from XX01
105 * <og:where>
106 * <og:and value="PN = '{@PN}%'" />
107 * <og:and value="YOBI like '{@YOBI}%'" />
108 * </og:where>
109 * order by PN
110 * </og:query>
111 *
112 * ・検索条件がå?力されたæ™?{@PN}がNOT NULLのとã�?
113 * 作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 PN = 'AAA%' and YOBI like 'BBB%' order by PN
114 * ・検索条件がå?力されなかった時({@PN}がNULLのとã�? WHERE句がなくなるã?
115 * 作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 order by PN
116 *
117 * 注æ„?WhereTagを使ったå?合ã?下ã?ようにはなりませんã€?
118 * select PN,YOBI,NMEN,HINM from XX01 PN = '' and YOBI like '%' order by PN
119 *
120 * <og:query command="NEW">
121 * select PN,YOBI,NMEN,HINM from XX01 where PN="11111"
122 * <og:where startKey="and">
123 * <og:and value="YOBI like '{@PN}%'" />
124 * </og:where>
125 * order by PN
126 * </og:query>
127 *
128 * ・検索条件がå?力されたæ™?{@YOBI}がNOT NULLのとã�?
129 * 作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 PN = '11111' and YOBI like 'BBB%' order by PN
130 * ・検索条件がå?力されなかった時({@YOBI}がNULLのとã�? WHERE句がなくなるã?
131 * 作æ?されるSQLæ–?�çselect PN,YOBI,NMEN,HINM from XX01 PN = '11111' order by PN
132 *
133 * <og:query
134 * command = "NEW"
135 * names = "SYSTEM_ID,LANG,CLM,NAME_JA,LABEL_NAME,KBSAKU,USER.ID"
136 * checkNames = "CLM,NAME_JA"
137 * queryType = "JDBCErrMsg"
138 * displayMsg = "">
139 * {call TYPE3B01.TYPE3B01(?,?,?,?)}
140 * </og:query>
141 *
142 * ・queryType に JDBCErrMsg を指定して、PL/SQL をコールできますã?
143 * 引数は、names 属æ?をキーにリクエスト変数から読み込みますã?
144 * ・checkNames にカラãƒ?��を指定すると、columns.valueSet による
145 * リクエスト変数の正規化を行いますã?
146 *
147 * @og.group ?¤?¢検索
148 * @og.group ?¤?¢登録
149 *
150 * @version 4.0
151 * @author Kazuhiko Hasegawa
152 * @since JDK5.0,
153 */
154 public class QueryTag extends CommonTagSupport {
155 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
156 private static final String VERSION = "5.6.5.3 (2013/06/28)" ;
157
158 private static final long serialVersionUID = 565320130628L ;
159
160 /** command 引数に渡す事ã?出来ã‚?コマンãƒ? 新è¦?{@value} */
161 public static final String CMD_NEW = "NEW" ;
162 /** command 引数に渡す事ã?出来ã‚?コマンãƒ? 再検索 {@value} */
163 public static final String CMD_RENEW = "RENEW" ;
164 /** command 引数に渡す事ã?出来ã‚?コマンãƒ?リスãƒ? */
165 private static final String[] COMMAND_LIST = new String[] { CMD_NEW , CMD_RENEW };
166
167 /** エラーメãƒ?‚»ージID {@value} */
168 protected static final String errMsgId = HybsSystem.ERR_MSG_KEY;
169
170 private String queryType = null;
171 // 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
172 // private String dbid = "DEFAULT";
173 private String dbid = null ;
174 protected transient DBTableModel table = null;
175 protected transient ErrorMessage errMessage = null;
176 protected String tableId = HybsSystem.TBL_MDL_KEY;
177 protected String command = CMD_NEW;
178 protected int skipRowCount = 0;
179 protected int maxRowCount = -1;
180 protected String sql = null;
181 protected int executeCount = -1; // 検索/実行件数
182 protected String names = null;
183 protected boolean outMessage = true;
184 protected int errCode = ErrorMessage.OK;
185 protected boolean quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" ); // 4.0.0 (2005/08/31)
186 private boolean trace = false; // 4.0.0 (2005/01/31) å»?¢
187 private boolean stopZero = false;
188 private String modifyType = null; // 3.8.5.1 (2006/05/08) modifyType 属æ?を追åŠ?�—ますã?
189 // private String displayMsg = "MSG0033"; // ã€?»¶検索しましたã€?
190 protected String displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
191 private String overflowMsg = "MSG0007"; // 検索結果がã?制限行数をè¶?�ˆましたので、残りはカãƒ?ƒˆされましたã€?
192 private String notfoundMsg = "MSG0077"; // 対象ãƒ??タはありませんでしたã€?
193 private boolean isMainTrans = true; // 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??見直ã�?
194
195 // 3.5.4.7 (2004/02/06) 実行時間測定用のDIV要ç´?‚’出力しますã?
196 protected long dyStart = 0;
197 // 4.3.3.0 (2008/09/22) PLSQL/SQL実行エラーの際に、å?ç�?‚’中止するかどã�?�‹ã€?
198 protected boolean stopError = true;
199
200 private StringBuilder debugMsg = null; // 3.5.6.0 (2004/06/18)
201
202 // 3.8.0.5 (2005/08/20) リクエスト変数の正規化を行いますã?
203 private String checkNames = null;
204
205 // 3.8.5.3 (2006/08/07) トレース時ã?メãƒ?‚»ージæ–?—å?を保存しておきますã?
206 private String traceMsg = null;
207
208 protected boolean xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15)
209
210 // 5.3.5.0 (2011/05/01) 処ç�?™‚é–?queryTime)などのæƒ??出力ã?有効/無効を指定しますã?
211 private boolean useBeforeHtmlTag = true ;
212
213 /**
214 * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
215 *
216 * @og.rev 3.5.4.7 (2004/02/06) 実行時間測定用にã€?–‹始時刻を取得しますã?
217 * @og.rev 3.5.6.5 (2004/08/09) 暫定的に、DBTableModelをå?行削除しますã?
218 * @og.rev 3.6.0.0 (2004/09/24) DBTableModel の先行削除は、scope="session" の場合ã?みã€?
219 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??、DBTableModelが新規作æ?されたå?ç�?�§のみ行うã€?
220 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
221 *
222 * @return 後続å?ç�??æŒ?¤º
223 */
224 @Override
225 public int doStartTag() {
226 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
227 if( useTag() ) {
228 dyStart = System.currentTimeMillis();
229 if( ! check( command, COMMAND_LIST ) ) { return(SKIP_BODY); }
230
231 useMainTrans( isMainTrans ); // 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??見直ã�?
232 startQueryTransaction( tableId ); // 3.6.0.8 (2004/11/19)
233
234 // 3.5.6.5 (2004/08/09) 削除するのは、セãƒ?‚·ョンのオブジェクトでよいã€?
235 // 3.6.0.0 (2004/09/24) 削除するのは、scope="session" の場合ã?みã€?
236 if( "session".equals( getScope() ) ) {
237 removeSessionAttribute( tableId );
238 removeSessionAttribute( HybsSystem.VIEWFORM_KEY );
239 }
240
241 return( EVAL_BODY_BUFFERED ); // Body を評価するã€? extends BodyTagSupport æ™?
242 }
243 return ( SKIP_BODY ); // Body を評価しなã�?
244 }
245
246 /**
247 * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
248 *
249 * @og.rev 3.1.1.0 (2003/03/28) ボディのå†?®¹を取得するå?ç�?‚’、CommonTagSupport で行うã€?
250 * @og.rev 3.6.0.8 (2004/11/19) エラー発生時に確実にリリースされるよã�?�« try finally 追åŠ?
251 * @og.rev 3.8.5.3 (2006/08/07) USER.LASTSQL へのSQLæ–??保存ã?、実行前に行っておきますã?
252 * @og.rev 3.8.6.3 (2006/11/30) SQL æ–??前後ã?スペã?スを取り除きますã?
253 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
254 * @og.rev 4.0.0.0 (2005/01/31) lang â‡?ResourceManager へ変更
255 * @og.rev 4.0.0.0 (2005/08/31) useQuotCheck() による?³?±?¬インジェクション対ç?
256 * @og.rev 4.3.4.0 (2008/12/01) GE20(ユーザー定数)へ登録するかã?フラグへの対å¿?
257 * @og.rev 5.0.0.2 (2009/09/15) XSS対å¿?
258 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??、DBTableModelが新規作æ?されたå?ç�?�§のみ行うã€?
259 * @og.rev 5.1.9.0 (2010/08/01) TransactionTag 対応ã?上位に TransactionTag があれã?、そこからConnection をもらうã€?
260 * @og.rev 5.3.6.0 (2011/06/01) é›?¨ˆã?合計などのEdit機è?に対応しますã?
261 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
262 * @og.rev 5.3.7.0 (2011/07/01) PL/SQLかつscope="request"で正しく出力するためqueryType,namesも保存するã?
263 * @og.rev 5.3.8.0 (2011/08/01) Transaction発生ç®?‰€でclose()
264 * @og.rev 5.5.3.4 (2012/06/19) trace 時ã?、実際の検索処ç�?‚’行わなã�?§˜に変更ã€?
265 * @og.rev 5.6.5.3 (2013/06/28) LASTQUERYTYPE â‡?LASTSQLTYPE 変更ã€?
266 *
267 * @return 後続å?ç�??æŒ?¤º(SKIP_BODY)
268 */
269 @Override
270 public int doAfterBody() {
271
272 // 4.0.0 (2005/08/31) useQuotCheck() による?³?±?¬インジェクション対ç?
273 useQuotCheck( quotCheck );
274 // 5.0.0.2 (2009/09/15) XSS対ç?
275 useXssCheck( xssCheck );
276
277 sql = getBodyString().trim();
278
279 // 3.2.1.0 (2003/05/28) æœ?µ‚S?±?¬æ–?‚’、UserInfo に、キャãƒ?‚·ュしておくã€?
280 // setUserInfo( "LASTSQL", sql );
281 // 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??見直ã�?
282 if( isMainTrans ) {
283 setUserInfo( "LASTSQL", sql, false );
284 // 5.3.7.0 (2011/07/01) PL/SQLかつscope="request"で正しく出力するためqueryType,namesも保存するã?
285 // setUserInfo( "LASTQUERYTYPE", queryType, false );
286 setUserInfo( "LASTSQLTYPE", queryType, false ); // 5.6.5.3 (2013/06/28)
287 setUserInfo( "LASTNAMES", names, false );
288 }
289
290 Query query = QueryFactory.newInstance( queryType );
291 Transaction tran = null;
292 try {
293 if( maxRowCount < 0 ) {
294 maxRowCount = sysInt( "DB_MAX_ROW_COUNT" );
295 }
296
297 // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
298 // final Transaction tran ;
299 TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
300 if( tranTag == null ) {
301 // tran = new TransactionReal( dbid,getApplicationInfo() );
302 tran = new TransactionReal( getApplicationInfo() ); // 5.3.7.0 (2011/07/01) 引数変更
303 }
304 else {
305 tran = tranTag.getTransaction();
306 }
307 query.setTransaction( dbid,tran ); // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
308
309 query.setSkipRowCount( skipRowCount );
310 query.setMaxRowCount( maxRowCount );
311 // query.setConnectionID( dbid );
312 query.setResourceManager( getResource() ); // 4.0.0 (2005/01/31)
313
314 if( trace ) {
315 // traceMsg = traceQuery( sql );
316 traceMsg = traceQuery( sql,tran ); // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
317 // 5.5.3.4 (2012/06/19) trace 時ã?、実際の検索処ç�?‚’行わなã�?§˜に変更
318 // query.setMaxRowCount( 1 );
319 return(SKIP_BODY);
320 }
321 query.setStatement( sql );
322 // query.setApplicationInfo( getApplicationInfo() ); // 3.8.7.0 (2006/12/15)
323
324 // 5.3.6.0 (2011/06/01) é›?¨ˆã?合計などのEdit機è?に対応しますã?
325 if( isMainTrans ) {
326 String guikey = getGUIInfoAttri( "KEY" );
327 String editName = getRequestValue( "editName" );
328 DBEditConfig config = getUser().getEditConfig( guikey, editName );
329 if( config != null ) {
330 query.setEditConfig( config );
331 }
332 }
333
334 execute( query );
335
336 executeCount = query.getExecuteCount();
337 if( errCode < ErrorMessage.NG && executeCount >= 0 ) { // 異常以外ã?場å�?
338 table = query.getDBTableModel();
339 // 3.8.5.1 (2006/05/08) modifyType 属æ?を追åŠ?�—ますã?
340 if( modifyType != null ) {
341 for( int row=0; row<executeCount; row++ ) {
342 table.setModifyType( row,modifyType );
343 }
344 }
345 }
346 }
347 finally {
348 // if( query != null ) { query.close(); }
349 QueryFactory.close( query );
350 if( tran != null ) { tran.close(); } // 5.3.8.0 (2011/08/01) Transaction発生ç®?‰€でclose()
351 }
352 return(SKIP_BODY);
353 }
354
355 /**
356 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
357 *
358 * @og.rev 2.0.0.8 (2002/10/09) command="NEW" のときã?み、displayMsg を表示させますã?
359 * @og.rev 2.1.1.4 (2002/11/25) ãƒ?ƒ�ãƒ?‚°時にæœ?µ‚SQLをユーザーæƒ??をセãƒ?ƒˆするように変更ã€?
360 * @og.rev 2.1.2.1 (2002/11/27) ErrorMessage をクリアしなã�?‚ˆã�?�«変更ã€?
361 * @og.rev 3.1.1.0 (2003/03/28) JspWriter オブジェクトã?使用ç®?‰€をã?jspPrint() を使用するように変更ã€?
362 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
363 * @og.rev 3.2.1.0 (2003/05/28) æœ?µ‚S?±?¬æ–?‚’、UserInfo に、キャãƒ?‚·ュしておくã€?
364 * @og.rev 3.3.3.3 (2003/08/06) 検索結果の件数をã?"DB.COUNT" キーでリクエストにセãƒ?ƒˆするã€?
365 * @og.rev 3.3.3.3 (2003/08/06) 検索結果をã?"DB.ERR_CODE" キーでリクエストにセãƒ?ƒˆするã€?
366 * @og.rev 3.5.4.7 (2004/02/06) 実行時間測定用のDIV要ç´?‚’出力しておきますã?
367 * @og.rev 3.5.4.9 (2004/02/25) 警告時に停止してã�?�¾したがã?継続å?ç�?�•せますã?
368 * @og.rev 3.5.5.0 (2004/03/12) ErrorMessage オブジェクトを、query がæ?功した時にもクリアするように変更
369 * @og.rev 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソãƒ?ƒ‰を利用
370 * @og.rev 3.5.5.8 (2004/05/20) ErrorMessage オブジェクトを、コマンドが NEW の場合ã?み、クリア
371 * @og.rev 3.5.6.0 (2004/06/18) debugMsg 属æ?をå?力するよã�?�«修正しますã?
372 * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェãƒ?‚¯を行いますã?
373 * @og.rev 3.8.5.3 (2006/08/07) USER.LASTSQL へのSQLæ–??保存ã?、実行前に行っておきますã?
374 * @og.rev 4.0.0.0 (2006/11/14) notfoundMsg 属æ?を追åŠ??displayMsg は、VIEW_USE_DISPLAY_MSG で制御
375 * @og.rev 4.0.0.0 (2007/10/18) メãƒ?‚»ージリソース統å�? getResource().getMessage â‡?getResource().getLabel )
376 * @og.rev 4.3.3.0 (2008/09/22) 属æ? stopError の設定により、JSP処ç�?‚’中止するかどã�?�‹を制御しますã?
377 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
378 * @og.rev 5.3.5.0 (2011/05/01) 処ç�?™‚é–?queryTime)などのæƒ??出力ã?有効/無効を指定しますã?
379 * @og.rev 5.5.0.3 (2012/03/13) オーバã?フローメãƒ?‚»ージが存在しなã�?�¨きã?、何もしなã�??(改行も入れなã�?
380 * @og.rev 5.5.3.4 (2012/06/19) trace 時ã?、実際の検索処ç�?‚’行わなã�?§˜に変更ã€?
381 * @og.rev 5.6.3.0 (2013/04/01) エラー時メãƒ?‚»ージ変更
382 *
383 * @return 後続å?ç�??æŒ?¤º
384 */
385 @Override
386 public int doEndTag() {
387 debugPrint(); // 4.0.0 (2005/02/28)
388 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
389 if( !useTag() ) { return(EVAL_PAGE); }
390
391 if( trace ) {
392 jspPrint( traceMsg );
393 return (SKIP_PAGE); // 5.5.3.4 (2012/06/19) trace 時ã?、実際の検索処ç�?‚’行わなã�?§˜に変更ã€?
394 }
395
396 String label = ""; // 4.0.0 (2005/11/30) 検索しなかったå?合ã?
397 if( check( command, COMMAND_LIST ) ) {
398 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
399
400 // 実行件数の表示 command="NEW" のときã?み、displayMsg を表示させますã?
401 // 4.0.0 (2005/11/30) 出力é?の変更。ä¸?•ªæœ??に出力しますã?
402 // boolean useStatusBar = HybsSystem.sysBool( "VIEW_USE_DISPLAY_MSG" );
403 if( CMD_NEW.equals( command ) ) {
404 // if( useStatusBar && executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
405 if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
406 buf.append( executeCount );
407 // buf.append( getResource().getMessage( displayMsg ) );
408 buf.append( getResource().getLabel( displayMsg ) );
409 buf.append( HybsSystem.BR );
410 }
411 else if( executeCount == 0 && notfoundMsg != null && notfoundMsg.length() > 0 ) {
412 // buf.append( getResource().getMessage( notfoundMsg ) );
413 buf.append( getResource().getLabel( notfoundMsg ) );
414 buf.append( HybsSystem.BR );
415 }
416 }
417
418 // 3.3.3.3 (2003/08/06) 検索結果の件数をã?"DB.COUNT" キーでリクエストにセãƒ?ƒˆするã€?
419 setRequestAttribute( "DB.COUNT" , String.valueOf( executeCount ) );
420 // 3.3.3.3 (2003/08/06) 検索結果をã?"DB.ERR_CODE" キーでリクエストにセãƒ?ƒˆするã€?
421 setRequestAttribute( "DB.ERR_CODE", String.valueOf( errCode ) );
422
423 // オーバã?フロー時ã?メãƒ?‚»ージを表示
424 // if( table != null && table.isOverflow() ) {
425 // 5.5.0.3 (2012/03/09) オーバã?フローメãƒ?‚»ージが存在しなã�?�¨きã?、何もしなã�??(改行も入れなã�?
426 if( table != null && table.isOverflow() && overflowMsg != null && overflowMsg.length() > 0 ) {
427 // buf.append( getResource().getMessage( overflowMsg ) );
428 buf.append( getResource().getLabel( overflowMsg ) );
429 buf.append( HybsSystem.BR );
430 }
431
432 // 3.5.5.2 (2004/04/02) TaglibUtil.makeHTMLErrorTable メソãƒ?ƒ‰を利用
433 String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
434 if( err != null && err.length() > 0 ) {
435 buf.append( err );
436 setSessionAttribute( errMsgId,errMessage );
437 }
438 else if( CMD_NEW.equals( command ) ) { // 3.5.5.8 (2004/05/20)
439 removeSessionAttribute( errMsgId );
440 }
441 label = buf.toString();
442
443 if( table != null && ! commitTableObject( tableId, table ) ) {
444 // 3.6.0.8 (2004/11/19) トランザクションチェãƒ?‚¯を行いますã?
445 // jspPrint( "QueryTag Query処ç�?�Œ割り込まれましたã€?BTableModel は登録しませんã€? );
446
447 // 5.6.4.0 (2013/04/01) リソースから出力するよã�?�«対å¿?
448 ErrorMessage errMsgObj = new ErrorMessage( "QueryTag Query Error!" );
449 errMsgObj.addMessage( 0,ErrorMessage.NG,"ERR0041" );
450 jspPrint( TaglibUtil.makeHTMLErrorTable( errMsgObj,getResource() ) );
451
452 return (SKIP_PAGE);
453 }
454 }
455
456 jspPrint( label );
457
458 // 3.5.4.9 (2004/02/25) 警告時に停止してã�?�¾したがã?継続å?ç�?�•せますã?
459 // int rtnCode = EVAL_PAGE;
460 final int rtnCode ;
461 if( errCode >= ErrorMessage.NG ) { // 異常
462 if( stopError ) { // 4.3.3.0 (2008/09/22) 属æ? stopError の設定により、å?ç�?‚’中止するかを判断しますã?
463 rtnCode = SKIP_PAGE;
464 }
465 else {
466 rtnCode = EVAL_PAGE;
467 }
468 }
469 else {
470 // 件数?�件かつ stopZero = true
471 if( executeCount == 0 && stopZero ) {
472 rtnCode = SKIP_PAGE;
473 }
474 else {
475 rtnCode = EVAL_PAGE;
476 }
477 }
478
479 // 3.5.4.7 (2004/02/06)
480 long dyTime = System.currentTimeMillis()-dyStart;
481
482 // 5.3.5.0 (2011/05/01) 処ç�?™‚é–?queryTime)などのæƒ??出力ã?有効/無効を指定しますã?
483 if( useBeforeHtmlTag ) {
484 jspPrint( "<div id=\"queryTime\" value=\"" + (dyTime) + "\"></div>" ); // 3.5.6.3 (2004/07/12)
485 }
486
487 // 4.0.0 (2005/01/31) セキュリãƒ?‚£チェãƒ?‚¯(ãƒ??タアクセス件数登録)
488 GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
489 if( guiInfo != null ) { guiInfo.addReadCount( executeCount,dyTime,sql ); }
490
491 return( rtnCode );
492 }
493
494 /**
495 * タグリブオブジェクトをリリースしますã?
496 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
497 *
498 * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
499 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
500 * @og.rev 3.5.4.7 (2004/02/06) 実行時間測定用に、dyStart を追åŠ?�—ますã?
501 * @og.rev 3.5.6.0 (2004/06/18) debugMsg 属æ?を追åŠ?�—ますã?
502 * @og.rev 3.8.0.5 (2005/08/20) checkNames 属æ?を追åŠ?�—ますã?
503 * @og.rev 3.8.5.1 (2006/05/08) modifyType 属æ?を追åŠ?�—ますã?
504 * @og.rev 3.8.5.1 (2006/05/08) traceMsg 属æ?(トレース時ã?メãƒ?‚»ージæ–?—å?)を追åŠ?�—ますã?
505 * @og.rev 4.0.0.0 (2005/08/31) quotCheck 属æ?の追åŠ?
506 * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
507 * @og.rev 4.3.3.0 (2008/09/22) stopError 属æ?の追åŠ?
508 * @og.rev 5.0.0.2 (2009/09/15) XSS対å¿?
509 * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??、DBTableModelが新規作æ?されたå?ç�?�§のみ行うã€?
510 * @og.rev 5.3.5.0 (2011/05/01) 処ç�?™‚é–?queryTime)などのæƒ??出力ã?有効/無効を指定しますã?
511 *
512 */
513 @Override
514 protected void release2() {
515 super.release2();
516 tableId = HybsSystem.TBL_MDL_KEY;
517 queryType = null;
518 // dbid = "DEFAULT";
519 dbid = null;
520 command = CMD_NEW;
521 skipRowCount = 0;
522 maxRowCount = -1;
523 table = null;
524 sql = null;
525 // displayMsg = "MSG0033"; // ã€?»¶検索しましたã€?
526 displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
527 overflowMsg = "MSG0007"; // 検索結果がã?制限行数をè¶?�ˆましたので、残りはカãƒ?ƒˆされましたã€?
528 notfoundMsg = "MSG0077"; // 対象ãƒ??タはありませんでしたã€?
529 executeCount = -1; // 検索/実行件数
530 names = null;
531 outMessage = true;
532 trace = false;
533 errCode = ErrorMessage.OK;
534 errMessage = null;
535 stopZero = false;
536 stopError = true; // 4.3.3.0 (2008/09/22)
537 dyStart = 0;
538 debugMsg = null; // 3.5.6.0 (2004/06/18)
539 checkNames = null; // 3.8.0.5 (2005/08/20)
540 quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" ); // 4.0.0 (2005/08/31)
541 modifyType = null; // 3.8.5.1 (2006/05/08)
542 traceMsg = null; // 3.8.5.3 (2006/08/07)
543 xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15)
544 isMainTrans = true; // 5.1.6.0 (2010/05/01) DBLastSqlの処ç�??見直ã�?
545 useBeforeHtmlTag = true ; // 5.3.5.0 (2011/05/01)
546 }
547
548 /**
549 * Query を実行しますã?
550 *
551 * @og.rev 2.1.2.3 (2002/12/02) ãƒ??タベã?ス更新時に、更新フラグをセãƒ?ƒˆするように変更
552 * @og.rev 3.4.0.0 (2003/09/01) 登録エラー時ã?キーと値を表示するように変更ã€?
553 * @og.rev 3.5.6.0 (2004/06/18) ãƒ?ƒ�ãƒ?‚°æƒ??出力用に、printDebug メソãƒ?ƒ‰を追åŠ??
554 * @og.rev 3.6.1.0 (2005/01/05) エラーコードによる commit/rollback の判断追åŠ?
555 * @og.rev 5.3.7.0 (2011/07/01) nameの判定にゼロæ–?—å?を付加
556 *
557 * @param query オブジェクãƒ?
558 */
559 protected void execute( final Query query ) {
560 String[] nameArray = null;
561 String[] values = null;
562 try {
563 // if( names == null ) {
564 if( names == null || names.length() == 0 ) {
565 query.execute();
566 }
567 else {
568 nameArray = StringUtil.csv2Array( names );
569 values = getRequest( nameArray );
570 // 3.5.6.0 (2004/06/18) ãƒ?ƒ�ãƒ?‚°æƒ??出力用
571 if( isDebug() ) { printDebug( nameArray,values ); }
572 query.execute( values );
573 }
574 errCode = query.getErrorCode();
575 errMessage = query.getErrorMessage();
576 // 3.6.1.0 (2005/01/05) エラーコードによる commit/rollback の判断追åŠ?
577 // if( query.getUpdateFlag() ) {
578 if( query.isUpdate() ) {
579 if( errCode < ErrorMessage.NG ) { // 異常以下ã?場å�?
580 query.commit();
581 }
582 else {
583 query.rollback();
584 }
585 }
586 }
587 catch( HybsSystemException ex ) {
588 query.rollback();
589
590 // 4.0.0 (2005/02/28) エラー時ã?表示とãƒ?ƒ�ãƒ?‚°時ã?表示を統ä¸?�™るã?
591 String errMsg = "DATABASE ERROR! " + HybsSystem.CR ;
592 if( nameArray != null ) {
593 printDebug( nameArray,values );
594 errMsg += debugMsg;
595 }
596 throw new HybsSystemException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
597 }
598 finally {
599 if( query != null ) { query.close(); }
600 }
601 }
602
603 /**
604 * ãƒ?ƒ�ãƒ?‚°用にã€??列データを書きå?しますã?
605 *
606 * @og.rev 3.5.6.0 (2004/06/18) 新規追åŠ?
607 *
608 * @param nms 引数 names の配å?ãƒ??タ
609 * @param vals names に対応するリクエスト情報の配å?
610 */
611 private void printDebug( final String[] nms,final String[] vals ) {
612 if( debugMsg == null ) { debugMsg = new StringBuilder(); }
613
614 debugMsg.append( " names=[" );
615 debugMsg.append( StringUtil.array2csv( nms ) );
616 debugMsg.append( "]" );
617 debugMsg.append( HybsSystem.CR );
618 debugMsg.append( " values=[" );
619 debugMsg.append( StringUtil.array2csv( vals ) );
620 debugMsg.append( "]" );
621 debugMsg.append( HybsSystem.CR );
622 }
623
624 /**
625 * 名称配å?をå?に、リクエスト情報のãƒ??タを取得しますã?
626 * checkNames 属æ?に設定されてã�?‚‹カラãƒ?�Œあれば、å?を正規化しますã?
627 *
628 * @og.rev 3.8.0.5 (2005/08/20) リクエスト変数の正規化(checkNames)対å¿?
629 *
630 * @param nameArray キーとなる名称の配å?
631 *
632 * @return そã?リクエスト情報の配å?
633 */
634 protected String[] getRequest( final String[] nameArray ) {
635 String[] rtn = new String[nameArray.length];
636
637 for( int i=0; i<rtn.length; i++ ) {
638 rtn[i] = getRequestValue( nameArray[i] );
639
640 // 3.8.0.5 (2005/08/20) checkNames がありã?rtn[i] があるå?合ã?
641 if( checkNames != null && checkNames.length() > 0 && rtn[i].length() > 0 ) {
642 if( ( "," + checkNames + "," ).indexOf( "," + nameArray[i] + "," ) >= 0 ) {
643 DBColumn dbColumn = getDBColumn( nameArray[i] );
644 String val = dbColumn.valueSet( rtn[i] );
645 if( val != null ) { rtn[i] = val; }
646 }
647 }
648 }
649
650 return rtn;
651 }
652
653 /**
654 * 【TAGã€?通常は使ã�?�¾せん)ãƒ??タの読み始めの初期値を指定しますã?
655 *
656 * @og.tag
657 * ãƒ??タベã?ス自体ã?検索は,æŒ?®šされたSQLの全件を検索しますが,
658 * DBTableModelのãƒ??タとしては、スキãƒ??件数åˆ??登録されませんã€?
659 * サーバã?のメモリè³?º�と応答時間ã?確保ã?為ですã?
660 *
661 * @param count 読み始めの初期値
662 */
663 public void setSkipRowCount( final String count ) {
664 skipRowCount = nval( getRequestParameter( count ),skipRowCount );
665 }
666
667 /**
668 * 【TAGã€?通常は使ã�?�¾せん)ãƒ??タのæœ?¤§読み込み件数を指定しまã�?
669 * (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])ã€?
670 *
671 * @og.tag
672 * ãƒ??タベã?ス自体ã?検索は,æŒ?®šされたSQLの全件を検索しますが,
673 * DBTableModelのãƒ??タとして登録するæœ?¤§件数をこの値に設定しますã?
674 * サーバã?のメモリè³?º�と応答時間ã?確保ã?為ですã?
675 * 0 をセãƒ?ƒˆすると、無制é™?Integer.MAX_VALUE)になりますã?
676 * (初期値:ユーザー定数のDB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])ã€?
677 *
678 * @og.rev 5.5.8.5 (2012/11/27) 0を無制限として処ç�?�—ますã?
679 *
680 * @param count æœ?¤§読み込み件数
681 * @see org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT
682 */
683 public void setMaxRowCount( final String count ) {
684 maxRowCount = nval( getRequestParameter( count ),maxRowCount );
685 if( maxRowCount == 0 ) { maxRowCount = Integer.MAX_VALUE ; } // 5.5.8.5 (2012/11/27)
686 }
687
688 /**
689 * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
690 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
691 *
692 * @og.tag
693 * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
694 * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
695 * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
696 * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
697 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
698 *
699 * @param id sessionに登録する時ã? ID
700 */
701 public void setTableId( final String id ) {
702 tableId = nval( getRequestParameter( id ),tableId ); // 3.8.0.9 (2005/10/17)
703 }
704
705 /**
706 * 【TAG】Query を発行する為のクラスID(JDBC,JDBCCallable,JDBCErrMsg,JDBCUpdate)を指定しまã�?{@og.doc03Link queryType 初期値:JDBC})ã€?
707 *
708 * @og.tag
709 * 検索を実行する手段は、Query インターフェースの実è£?‚¯ラスになりますã?
710 * こã?タグでは、Query.execute( String[] ) メソãƒ?ƒ‰が呼ばれますã?
711 * 例えば、ストアドã?ロシージャ等を実行するå?合に、queryType="JDBCErrMsg"
712 * を指定することができますã?
713 * 初期値はã€?JDBC" ですã?
714 * queryType は、シスãƒ?ƒ リソースの Query_**** 宣è¨?? **** を与えますã?
715 * これらã?、Query インターフェースを継承したサブクラスであるå¿?¦�がありますã?
716 * 標準で、org.opengion.hayabusa.db 以下ã? Query_**** クラスがã?Query_**** 宣è¨?と
717 * して、定義されてã�?�¾すã?
718 * 属æ?クラス定義の {@link org.opengion.hayabusa.db.Query Query} を参照願いますã?
719 * {@og.doc03Link queryType Query_**** クラス}
720 *
721 * @param id Query を発行する為の実クラス ID
722 * @see org.opengion.hayabusa.db.Query Queryのサブクラス
723 * @see org.opengion.hayabusa.db.Query#execute( String[] )
724 */
725 public void setQueryType( final String id ) {
726 queryType = getRequestParameter( id );
727 }
728
729 /**
730 * 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
731 *
732 * @og.tag
733 * Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
734 * これは、シスãƒ?ƒ リソースで、DEFAULT_DB_URL 等でæŒ?®šしてã�?‚‹ ãƒ??タベã?ス接続å?
735 * æƒ??に、XX_DB_URL を定義することでã€?dbid="XX" とすると、この 接続å?を使用して
736 * ãƒ??タベã?スにアクセスできますã?
737 *
738 * @param id ãƒ??タベã?ス接続ID
739 */
740 public void setDbid( final String id ) {
741 dbid = nval( getRequestParameter( id ),dbid );
742 }
743
744 /**
745 * 【TAG】コマンãƒ?NEW,RENEW)をセãƒ?ƒˆしまã�?PlsqlUpdateTag,UpdateTag の場合ã?、ENTRY)ã€?
746 *
747 * @og.tag
748 * コマンドã?,HTMLから(get/post)æŒ?®šされますã?で,CMD_xxx で設定される
749 * フィールド定数値のã�?�¥れかをã?æŒ?®šできますã?
750 *
751 * @param cmd コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?—å?)
752 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.QueryTag.CMD_NEW">コマンド定数</a>
753 */
754 public void setCommand( final String cmd ) {
755 String cmd2 = getRequestParameter( cmd );
756 if( cmd2 != null && cmd2.length() >= 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
757 }
758
759 /**
760 * 【TAG】検索結果が0件のときå?ç�?‚’続行するかどã�?�‹[true/false]を指定しまã�?初期値:false[続行する])ã€?
761 *
762 * @og.tag
763 * 初期値は、false(続行すã‚?ですã?
764 *
765 * @param cmd 検索結果が0件のときã?[true:処ç�?‚’中止する/false:続行する]
766 */
767 public void setStopZero( final String cmd ) {
768 stopZero = nval( getRequestParameter( cmd ),stopZero );
769 }
770
771 /**
772 * 【TAG】検索結果を画面上に表示するメãƒ?‚»ージリソースIDを指定しまã�?
773 * (初期値:VIEW_DISPLAY_MSG[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_DISPLAY_MSG}])ã€?
774 *
775 * @og.tag
776 * ここでは、検索結果の件数ã‚?™»録された件数をまずå?力しã€?
777 * そã?次に、ここでæŒ?®šしたメãƒ?‚»ージをリソースから取得して表示しますã?
778 * 件数を表示させたい場合ã?、displayMsg = "MSG0033"[ã€?»¶検索しました] をセãƒ?ƒˆしてくださいã€?
779 * 表示させたくなã�??合ã?, displayMsg = "" をセãƒ?ƒˆしてくださいã€?
780 * (初期値:シスãƒ?ƒ 定数のVIEW_DISPLAY_MSG[={@og.value org.opengion.hayabusa.common.SystemData#VIEW_DISPLAY_MSG}])ã€?
781 *
782 * @param id ãƒ?‚£スプレイに表示させるメãƒ?‚»ージ ID
783 * @see org.opengion.hayabusa.common.SystemData#VIEW_DISPLAY_MSG
784 */
785 public void setDisplayMsg( final String id ) {
786 String ids = getRequestParameter( id );
787 if( ids != null ) { displayMsg = ids; }
788 }
789
790 /**
791 * 【TAG】検索ãƒ??タが最大検索数をオーバã?した場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?
792 * (初期値:MSG0007[検索結果がã?制限行数をè¶?�ˆましたので、残りはカãƒ?ƒˆされました])ã€?
793 *
794 * @og.tag
795 * 検索結果がã?maxRowCount で設定された値より多い場合ã?何らかã?ãƒ??タは検索されã�?
796 * åˆ?‚Š捨てられたことになりますã?
797 * ここでは、displayMsg を表示した後ã?å¿?¦�に応じて、このメãƒ?‚»ージを表示しますã?
798 * 表示させたくなã�??合ã?, overflowMsg = "" をセãƒ?ƒˆしてくださいã€?
799 * 初期値は、MSG0007[検索結果がã?制限行数をè¶?�ˆましたので、残りはカãƒ?ƒˆされました]ですã?
800 *
801 * @param id ãƒ?‚£スプレイに表示させるメãƒ?‚»ージ ID
802 */
803 public void setOverflowMsg( final String id ) {
804 String ids = getRequestParameter( id );
805 if( ids != null ) { overflowMsg = ids; }
806 }
807
808 /**
809 * 【TAG】検索結果がゼロ件の場合に表示するメãƒ?‚»ージリソースIDを指定しまã�?初期値:MSG0077[対象ãƒ??タはありませんでした])ã€?
810 *
811 * @og.tag
812 * ここでは、検索結果がゼロ件の場合ã?み、特別なメãƒ?‚»ージを表示させますã?
813 * 従来は、displayMsg と兼用で、ã?0ã€?»¶検索しました』とã�?�†表示でしたがã?
814 * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合ã?み別に表示させますã?
815 * 表示させたくなã�??合ã?, notfoundMsg = "" をセãƒ?ƒˆしてくださいã€?
816 * 初期値は、MSG0077[対象ãƒ??タはありませんでした]ですã?
817 *
818 * @param id ãƒ?‚£スプレイに表示させるメãƒ?‚»ージ ID
819 */
820 public void setNotfoundMsg( final String id ) {
821 String ids = getRequestParameter( id );
822 if( ids != null ) { notfoundMsg = ids; }
823 }
824
825 /**
826 * 【TAG】PL/SQLを利用する場合ã?引数にセãƒ?ƒˆすべã�?ãƒ??タの名称をCSV形式でè¤?•°æŒ?®šしますã?
827 *
828 * @og.tag
829 * è¤?•°ある場合ã?、カンマ区åˆ?‚Šæ–?—で渡しますã?
830 * names 属æ?は、queryType に応じて設定可否が異なりますã?で、ご注意くã�?�•ã�??
831 * names なし:JDBC,JDBCUpdate
832 * names あり?šJDBCCallable,JDBCErrMsg,JDBCUpdate
833 * (JDBCUpdateは、names 属æ?のあり/なし両方に対応してã�?�¾すã?)
834 *
835 * @og.rev 3.0.1.3 (2003/03/11) names 属æ?に null で渡すå?合ã?バグを修正
836 *
837 * @param nm 引数の名称(è¤?•°ある場合ã?、カンマ区åˆ?‚Šæ–??
838 */
839 public void setNames( final String nm ) {
840 names = nval( getRequestParameter( nm ),names );
841 }
842
843 /**
844 * 【TAG】検索結果のメãƒ?‚»ージを表示する/しない[true/false]を指定しまã�?初期値:true)ã€?
845 *
846 * @og.tag
847 * 初期値は、表示する?štrue ですã?
848 *
849 * @param flag [true:表示する/それ以å¤?含めない]
850 */
851 public void setOutMessage( final String flag ) {
852 outMessage = nval( getRequestParameter( flag ),outMessage );
853 }
854
855 /**
856 * 【TAG】引数の SQL æ–?‚’ EXPLAIN PLAN を[true:行う/それ以å¤?行わない]を指定しまã�?初期値:false)ã€?
857 *
858 * @og.tag
859 *
860 * ここでは、以下ã?処ç�?‚’行いますã?
861 * ?‘.引数の SQL æ–?‚’画面に表示しますã?
862 * ?’.引数の SQL æ–?‚’ EXPLAIN PLAN した結果をã?画面に表示しますã?
863 * なおã?以前ã?、セãƒ?‚·ョンのトレースを行ってã�?�¾したがã?そã?機è?は、å»?¢ã�?�Ÿしますã?
864 * 初期値は、行わなã�?¼šfalse ですã?
865 *
866 * @param flag トレース [true:行う/それ以å¤?行わない]
867 */
868 public void setTrace( final String flag ) {
869 trace = nval( getRequestParameter( flag ),trace );
870 }
871
872 /**
873 * 【TAG】リクエスト変数の正規化を行うカラãƒ?‚’CSV形式でè¤?•°æŒ?®šしますã?
874 *
875 * @og.tag
876 * PL/SQLを利用する場合ã?引数にセãƒ?ƒˆすべã�?ãƒ??タをã?リクエスト変数の
877 * 値そã?ままではなくã?カラãƒ?‚ªブジェクトã? valueSet メソãƒ?ƒ‰経由で正規化
878 * した値を使用するようにしますã?
879 *
880 * @og.rev 3.8.0.5 (2005/08/20) 新規追åŠ?
881 *
882 * @param nm リクエスト変数の正規化を行うカラãƒ?
883 */
884 public void setCheckNames( final String nm ) {
885 checkNames = nval( getRequestParameter( nm ),checkNames );
886 }
887
888 /**
889 * 【TAG】DB検索時ã? モãƒ?‚£ファイタイプをæŒ?®šします[A:追åŠ?C:更新/D:削除]ã€?
890 *
891 * @og.tag
892 * DB検索時に、そのãƒ??タをA(追åŠ?、C(更新)、D(削除)のモãƒ?‚£ファイタイプを
893 * つけた状態にしますã?
894 * そã?状態で、そのまま、update する事が可能になりますã?
895 *
896 * @og.rev 3.8.5.1 (2006/05/08) 新規追åŠ?
897 *
898 * @param type DB検索時ã? モãƒ?‚£ファイタイãƒ?[A:追åŠ?C:更新/D:削除]
899 */
900 public void setModifyType( final String type ) {
901 modifyType = nval( getRequestParameter( type ),modifyType );
902 }
903
904 /**
905 * 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
906 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
907 *
908 * @og.tag
909 * ?³?±?¬インジェクション対策ã?ä¸?�¤として、暫定的ではありますが、SQLのパラメータに
910 * 渡す文字å?にクォーãƒ?‚£ション(') を許さなã�?¨定にすれば、ある程度は防止できますã?
911 * 数字タイプã?引数にはã€?or 5=5 などのクォーãƒ?‚£ションを使用しなã�?‚³ードを埋めてもã?
912 * 数字チェãƒ?‚¯で検å?可能ですã?æ–?—タイプã?場合ã?、å¿?�š (')をã?ずしてã€?
913 * ' or 'A' like 'A のような形式になる為ã€?')チェãƒ?‚¯ã�?�‘でも有効ですã?
914 * (') が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
915 * 初期値は、SystemData#USE_SQL_INJECTION_CHECK ですã?
916 *
917 * @og.rev 4.0.0.0 (2005/08/31) 新規追åŠ?
918 *
919 * @param flag クォーãƒ?‚£ションチェãƒ?‚¯ [true:する/それ以å¤?しない]
920 */
921 public void setQuotCheck( final String flag ) {
922 quotCheck = nval( getRequestParameter( flag ),quotCheck );
923 }
924
925 /**
926 * 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
927 * (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
928 *
929 * @og.tag
930 * クロスサイトスクリプティング(XSS)対策ã?ä¸?’°としてless/greater than signにつã�?�¦のチェãƒ?‚¯を行いますã?
931 * (><) が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
932 * (初期値:シスãƒ?ƒ 定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])
933 *
934 * @og.rev 5.0.0.2 (2009/09/15) 新規追åŠ?
935 *
936 * @param flag XSSチェãƒ?‚¯ [true:する/false:しない]
937 * @see org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
938 */
939 public void setXssCheck( final String flag ) {
940 xssCheck = nval( getRequestParameter( flag ),xssCheck );
941 }
942
943 /**
944 * 【TAG】PLSQL/SQL処ç�?‚¨ラーの時に処ç�?‚’中止するかどã�?�‹[true/false]を設定しまã�?初期値:true)ã€?
945 *
946 * @og.tag
947 * false(中止しなã�?に設定するå?合ã?後続å?ç�?�§は、{@DB.ERR_CODE}の値によりã€?
948 * PLSQL/SQLの異常/正常終äº?�«よってåˆ?²�å?ç�??可能となりますã?
949 * 初期値は、true(中止する)ですã?
950 *
951 * @og.rev 4.3.3.0 (2008/09/22) 新規追åŠ?
952 *
953 * @param flag [true:中止する/false:中止しない]
954 */
955 public void setStopError( final String flag ) {
956 stopError = nval( getRequestParameter( flag ),stopError );
957 }
958
959 /**
960 * 引数の SQL æ–?‚’ EXPLAIN PLAN しますã?
961 *
962 * ここでは、以下ã?処ç�?‚’行いますã?
963 * ?‘.引数の SQL æ–?‚’画面に表示しますã?
964 * ?’.引数の SQL æ–?‚’ EXPLAIN PLAN した結果をã?画面に表示しますã?
965 * なおã?こã?処ç�??、ORACLE 専用処ç�?�§すã?
966 *
967 * @og.rev 3.8.5.3 (2006/08/07) 新規追åŠ?
968 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
969 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応しますã?
970 * @og.rev 5.5.3.4 (2012/06/19) getUserInfo は、キー部åˆ?� けで処ç�?�—ますã?
971 *
972 * @param sql EXPLAIN PLANするSQL æ–?
973 * @param tran Transactionオブジェクãƒ?
974 *
975 * @return トレース結果のæ–?—å?
976 */
977 // private String traceQuery( final String sql ) {
978 private String traceQuery( final String sql , final Transaction tran ) {
979 // ApplicationInfo appInfo = getApplicationInfo();
980
981 // String userId = getUserInfo( "USER.ID" ) ;
982 String userId = getUserInfo( "ID" ) ; // 5.5.3.4 (2012/06/19) getUserInfo は、キー部åˆ?� けで処ç�?�—ますã?
983
984 String[] arg1 = new String[] { userId };
985 // DBUtil.dbExecute( "DELETE FROM PLAN_TABLE WHERE STATEMENT_ID = ?",arg1,appInfo,dbid );
986 DBUtil.dbExecute( "DELETE FROM PLAN_TABLE WHERE STATEMENT_ID = ?",arg1,tran,dbid ); // 5.1.9.0 (2010/08/01)
987
988 String explan1 = "EXPLAIN PLAN SET STATEMENT_ID = '" + userId + "' FOR " + sql ;
989 // DBUtil.dbExecute( explan1,null,appInfo,dbid );
990 DBUtil.dbExecute( explan1,null,tran,dbid ); // 5.1.9.0 (2010/08/01)
991
992 String[] arg2 = new String[] { userId,userId,userId };
993 // String explan2 = "SELECT LEVEL,LPAD(' ',LEVEL,' ') || RTRIM( OPERATION ) || ' ' ||"
994 // + " RTRIM( OPTIONS ) || ' ' || RTRIM( OBJECT_NAME )"
995 // + " FROM PLAN_TABLE"
996 // + " WHERE STATEMENT_ID = ?"
997 // + " CONNECT BY PRIOR ID = PARENT_ID"
998 // + " AND STATEMENT_ID = ?"
999 // + " START WITH ID = 0"
1000 // + " AND STATEMENT_ID = ?" ;
1001 String explan2 = "select LEVEL as LVL"
1002 + ",lpad(' ',LEVEL,' ') || rtrim( OPERATION ) || ' ' || rtrim( OPTIONS ) || ' ' || rtrim( OBJECT_NAME ) as EXECUTION_PLAN"
1003 + ",OBJECT_NAME as OBJ_NAME"
1004 + ",DECODE(INSTR(OBJECT_TYPE,' '),0,OBJECT_TYPE,SUBSTR(OBJECT_TYPE,1,INSTR(OBJECT_TYPE,' ')-1)) as OBJ_TYPE"
1005 + ",OPTIMIZER as OPT"
1006 + ",COST as CST"
1007 + ",CARDINALITY as CARD"
1008 + ",BYTES as BYTE"
1009 + ",ACCESS_PREDICATES as ACCS"
1010 + ",FILTER_PREDICATES as FILTER"
1011 + " from PLAN_TABLE"
1012 + " where STATEMENT_ID = ?"
1013 + " start with ID = 0"
1014 + " and STATEMENT_ID = ?"
1015 + " connect by prior ID = PARENT_ID"
1016 + " and STATEMENT_ID = ?" ;
1017 // String[][] plan = DBUtil.dbExecute( explan2,arg2,appInfo,dbid );
1018 // String[][] plan = DBUtil.dbExecute( explan2,arg2,tran,dbid ); // 5.1.9.0 (2010/08/01)
1019
1020 // StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1021 // buf.append( "<pre>" ).append( sql ).append( "</pre>" ).append( HybsSystem.BR );
1022 // buf.append( "<table>" );
1023 // buf.append( "<tr class=\"row_h\"><th>LEVEL</th><th>EXECUTION_PLAN</th></tr>" );
1024 // for( int i=0; i<plan.length; i++ ) {
1025 // buf.append( "<tr class=\"row_" ).append( i%2 ).append( "\">" );
1026 // buf.append( "<td>" ).append( plan[i][0] ).append( "</td>" );
1027 // buf.append( "<td><pre>" ).append( plan[i][1] ).append( "</td></tr>" );
1028 // }
1029 // buf.append( "</table>" ).append( HybsSystem.BR );
1030
1031 String[][] plan = DBUtil.dbExecute( explan2,arg2,tran,dbid,true ); // 5.5.3.4 (2012/06/19) ヘッãƒ??æƒ??も同時に取得するã?
1032
1033 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1034 buf.append( "<pre>" ).append( sql ).append( "</pre>" ).append( HybsSystem.BR );
1035 buf.append( "<table>" );
1036 // 1行目のヘッãƒ??の出åŠ?
1037 int colsize = plan[0].length;
1038 buf.append( "<tr class=\"row_h\">" );
1039 for( int j=0; j<colsize; j++ ) {
1040 buf.append( "<th>" ).append( plan[0][j] ).append( "</th>" );
1041 }
1042 buf.append( "</tr>" );
1043
1044 for( int i=1; i<plan.length; i++ ) {
1045 buf.append( "<tr class=\"row_" ).append( i%2 ).append( "\">" );
1046 for( int j=0; j<colsize; j++ ) {
1047 if( j==1 ) {
1048 buf.append( "<td><pre>" ).append( plan[i][1] ).append( "</pre></td>" );
1049 }
1050 else {
1051 buf.append( "<td>" ).append( plan[i][j] ).append( "</td>" );
1052 }
1053 }
1054 buf.append( "</tr>" );
1055 }
1056 buf.append( "</table>" ).append( HybsSystem.BR );
1057 return buf.toString();
1058 }
1059
1060 /**
1061 * 【TAGã€?通常使ã�?�¾せん)タグで処ç�?�•れる処ç�?�Œメインとなるトランザクション処ç�?�‹どã�?�‹を指定しまã�?初期値:true)ã€?
1062 *
1063 * @og.tag
1064 * こã?値は、ファイルãƒ?‚¦ンロードå?ç�?�«影響しますã?こã?値がtrueにæŒ?®šされた時にcommitされたDBTableModelã�?
1065 * ファイルãƒ?‚¦ンロードã?対象の表になりますã?
1066 *
1067 * こã?パラメーターはã€??常、各タグにより実è£?�•れã?ユーザーが指定するå¿?¦�ã?ありませんã€?
1068 * ä½?�—ã€?つのJSPå†?�§DBTableModelがè¤?•°生æ?されるå?合に、前に処ç�?�—たDBTableModelにつã�?�¦ファイルãƒ?‚¦ンロードをさせたい
1069 * 場合ã?、後ろでDBTableModelを生成するタグで、æ?示çš?�«こã?値をfalseにæŒ?®šすることで、ファイルãƒ?‚¦ンロードå?ç�??対象から
1070 * 除外することができますã?
1071 *
1072 * @og.rev 5.1.6.0 (2010/05/01) 新規作æ?
1073 *
1074 * @param flag メイントランザクションかどã�?�‹
1075 */
1076 public void setMainTrans( final String flag ) {
1077 isMainTrans = nval( getRequestParameter( flag ),isMainTrans );
1078 }
1079
1080 /**
1081 * 【TAGã€?処ç�?™‚é–?queryTime)などのæƒ??出力[true:有効/false:無効]を指定しまã�?初期値:true)ã€?
1082 *
1083 * @og.tag
1084 * Query で、検索する場合に、å?ç�?™‚é–?queryTime)などのæƒ??をå?力してã�?�¾すがã€?
1085 * ViewForm で、CustomData などの 非HTML表示ビューを使用する場合ã?ãƒ??タとしてã€?
1086 * 紛れ込んでしまã�?�Ÿめã?出力を抑制するå¿?¦�がありますã?
1087 * true(有効)にすると、これらのHTMLがå?力されますã?false にすると、å?力されませんã€?
1088 * 初期値は、true(有効) ですã?
1089 *
1090 * @og.rev 5.3.5.0 (2011/05/01) 新規追åŠ?
1091 *
1092 * @param useTag æƒ??出力ã?有効/無効を指å®?[true:有効/false:無効]
1093 */
1094 public void setUseBeforeHtmlTag( final String useTag ) {
1095 useBeforeHtmlTag = nval( getRequestParameter( useTag ),useBeforeHtmlTag );
1096 }
1097
1098 /**
1099 * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
1100 *
1101 * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
1102 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
1103 *
1104 * @param strm ObjectOutputStreamオブジェクãƒ?
1105 * @throws IOException 入出力エラーが発生したå?å�?
1106 */
1107 private void writeObject( final ObjectOutputStream strm ) throws IOException {
1108 strm.defaultWriteObject();
1109 }
1110
1111 /**
1112 * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
1113 *
1114 * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
1115 *
1116 * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
1117 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
1118 *
1119 * @param strm ObjectInputStreamオブジェクãƒ?
1120 * @see #release2()
1121 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
1122 * @throws ClassNotFoundException クラスを見つけることができなかったå?å�?
1123 */
1124 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
1125 strm.defaultReadObject();
1126 }
1127
1128 /**
1129 * こã?オブジェクトã?æ–?—å?表現を返しますã?
1130 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
1131 *
1132 * @return こã?クラスのæ–?—å?表現
1133 */
1134 @Override
1135 public String toString() {
1136 return sql ;
1137
1138 // return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
1139 // .println( "VERSION" ,VERSION )
1140 // .println( "tableId" ,tableId )
1141 // .println( "queryType" ,queryType )
1142 // .println( "dbid" ,dbid )
1143 // .println( "command" ,command )
1144 // .println( "skipRowCount" ,skipRowCount )
1145 // .println( "maxRowCount" ,maxRowCount )
1146 // .println( "sql" ,sql )
1147 // .println( "displayMsg" ,displayMsg )
1148 // .println( "overflowMsg" ,overflowMsg )
1149 // .println( "executeCount" ,executeCount )
1150 // .println( "names" ,names )
1151 // .println( "outMessage" ,outMessage )
1152 // .println( "trace" ,trace )
1153 // .println( "errCode" ,errCode )
1154 // .println( "stopZero" ,stopZero )
1155 // .println( "quotCheck" ,quotCheck )
1156 // .println( "dyStart" ,dyStart )
1157 // .println( "checkNames" ,checkNames )
1158 // .println( "Other..." ,getAttributes().getAttribute() )
1159 // .fixForm().toString() ;
1160 }
1161 }