/* * Copyright (C) 2000 - 2008 TagServlet Ltd * * This file is part of Open BlueDragon (OpenBD) CFML Server Engine. * * OpenBD is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * Free Software Foundation,version 3. * * OpenBD is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenBD. If not, see http://www.gnu.org/licenses/ * * Additional permission under GNU GPL version 3 section 7 * * If you modify this Program, or any covered work, by linking or combining * it with any of the JARS listed in the README.txt (or a modified version of * (that library), containing parts covered by the terms of that JAR, the * licensors of this Program grant you additional permission to convey the * resulting work. * README.txt @ http://www.openbluedragon.org/license/README.txt * * http://www.openbluedragon.org/ */ package com.naryx.tagfusion.util; /** * This class is for collating and dumping all the information * related to stored procedures as recorded when there is debug output enabled * */ import java.util.ArrayList; import java.util.List; import com.naryx.tagfusion.cfm.engine.cfSession; import com.naryx.tagfusion.cfm.sql.preparedData; import com.naryx.tagfusion.cfm.sql.resultSetHolder; class debugStoredProc{ // params - type, CFSQLTYPE, vale, variable, dbVarName // resultsets - name, resultset private List<storedProcInfo> storedprocs; public debugStoredProc(){ storedprocs = new ArrayList<storedProcInfo>(); } public boolean hasQueries(){ return storedprocs.size() > 0; } /** * adds the given storedproc * to the list, extracting all the relevent data */ public void add( String _template, String _datasrc, String name, long _time, List<preparedData> _params, List<resultSetHolder> _resultsets ){ storedProcInfo newInfo = new storedProcInfo(); newInfo.template = _template; newInfo.name = name; newInfo.datasource = _datasrc; newInfo.execTime = _time; newInfo.params = _params; newInfo.results = _resultsets; newInfo.timeStamp = System.currentTimeMillis(); storedprocs.add( newInfo ); }// addQuery() public void dump( cfSession session ){ String fontSize = ( session.isWindowsOrMacUser() ? "10pt" : "12pt" ); if ( storedprocs.size() > 0 ){ session.write( "<style type=\"text/css\">\n" ); session.write( ".storedproc\n{" ); session.write( " color:black;\n" ); session.write( " background-color:white;\n" ); session.write( " font-family:\"courier\", arial, serif;\n" ); session.write( " font-size: " + fontSize + ";\n}\n" ); session.write( ".sp_tablename\n{" ); session.write( " color: #CCCCCC;\n" ); session.write( " background-color:#000099;\n" ); session.write( " padding:5px;\n" ); session.write( " border: 1px solid black;\n" ); session.write( " font-family: Verdana, Helvetica, Arial, sans-serif;\n" ); session.write( " font-weight: bold;\n" ); session.write( " font-size: " + fontSize + ";\n}\n" ); session.write( ".sp_tableheader\n{" ); session.write( " color:black;\n" ); session.write( " background-color:white;\n" ); session.write( " padding:5px;\n" ); session.write( " border: 1px solid black;\n" ); session.write( " font-family:\"courier\", arial, serif;\n" ); session.write( " font-weight: bold;\n" ); session.write( " font-size: " + fontSize + ";\n}\n" ); session.write( ".sp_tabledata\n{" ); session.write( " color:black;\n" ); session.write( " background-color:white;\n" ); session.write( " border: 1px solid black;\n" ); session.write( " padding:5px;\n" ); session.write( " font-family: courier, arial, serif;\n" ); session.write( " font-size: " + fontSize + ";\n}\n" ); session.write( "</style>\n\n" ); session.write( "<HR><p><b><div class=\"debughdr\">Stored Procedures</div></B></p>" ); storedProcInfo next; for ( int i = 0; i < storedprocs.size(); i++ ){ next = (storedProcInfo) storedprocs.get(i); session.write( "<div class=\"storedproc\"><p><b>" ); session.write( next.name ); session.write( "</b> (Datasource=" ); session.write( next.datasource ); session.write( ", Time=" ); session.write( String.valueOf( next.execTime ) ); session.write( "ms) in " ); session.write( next.template ); session.write( " @ " ); session.write( com.nary.util.Date.formatDate( next.timeStamp, "HH:mm:ss" ) ); session.write( "</p>" ); // write out parameters session.write( "<p><table border=0 cellpadding=0 cellspacing=0>\n<tr><td colspan=4 class=\"sp_tablename\">parameters</td></tr>\n" ); session.write( "<tr><td class=\"sp_tableheader\">type</td><td class=\"sp_tableheader\">CFSQLType</td>" ); session.write( "<td class=\"sp_tableheader\">value</td><td class=\"sp_tableheader\">variable</td></tr>\n" ); List<preparedData> qParams = next.params; if ( qParams != null ){ for ( int j = 0; j < qParams.size(); j++ ){ session.write( "<TR>" ); preparedData nextParam = qParams.get(j); // write out type if ( nextParam.isIN() && nextParam.isOUT() ){ session.write( "<TD class=\"sp_tabledata\">IN-OUT</TD>" ); }else if ( nextParam.isIN() ){ session.write( "<TD class=\"sp_tabledata\">IN</TD>" ); }else{ session.write( "<TD class=\"sp_tabledata\">OUT</TD>" ); } // CFSQLType session.write( "<TD class=\"sp_tabledata\">" ); session.write( nextParam.getSQLType() ); session.write( "</TD>" ); // value session.write( "<TD class=\"sp_tabledata\">" ); try{ String val = nextParam.getDataAsString(); if ( ( val != null ) && ( val.length() > 0 ) ) { session.write( val ); }else{ session.write( " " ); } }catch( Exception ignored ){} // catches NullPointerException too session.write( " </TD>" ); // variable session.write( "<TD class=\"sp_tabledata\">" ); if ( nextParam.getOutVariable() != null ){ session.write( nextParam.getOutVariable() ); }else{ session.write( " " ); } session.write( "</TD>" ); session.write( "</TR>" ); } session.write( "</table></p>\n" ); session.write( "</div>\n\n" ); } // write out resultsets session.write( "<p><table border=0 cellpadding=0 cellspacing=0>\n<tr><td class=\"sp_tablename\" colspan=\"2\">resultsets</td></tr>\n" ); session.write( "<tr><td class=\"sp_tableheader\">name</td><td class=\"sp_tableheader\">resultset</td></tr>\n" ); List<resultSetHolder> qResults = next.results; if ( qResults != null ){ for ( int j = 0; j < qResults.size(); j++ ){ session.write( "<TR>" ); resultSetHolder nextRS = qResults.get(j); // write out name session.write( "<TD class=\"sp_tabledata\">" ); session.write( nextRS.name ); session.write( "</TD>" ); // resultset session.write( "<TD class=\"sp_tabledata\">" ); session.write( String.valueOf( nextRS.resultIndex ) ); session.write( "</TD>" ); session.write( "</TR>" ); } session.write( "</table></p>\n" ); session.write( "</div>\n\n" ); } } } } class storedProcInfo{ public String name; public String datasource; public String template; public long execTime; public List<preparedData> params = null; public List<resultSetHolder> results = null; public long timeStamp; } }