/*
* Copyright (C) 2000 - 2011 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/
*
* $Id: $
*/
package com.naryx.tagfusion.util;
/**
* This class is for collating and dumping all the information
* related to queries 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.engine.dataNotSupportedException;
import com.naryx.tagfusion.cfm.sql.cfSQLQueryData;
import com.naryx.tagfusion.cfm.sql.preparedData;
class debugQuery {
private List<queryInfo> queries;
public debugQuery() {
queries = new ArrayList<queryInfo>();
}
public boolean hasQueries() {
return queries.size() > 0;
}
/**
* adds the given query with the name _qn sourced from the template _t
* to the list of queries, extracting all the relevent data
*/
public void addQuery(String _qn, String _t, cfSQLQueryData _q, List<preparedData> _qp) {
queryInfo info = new queryInfo();
info.timeStamp = System.currentTimeMillis();
info.queryName = _qn;
info.execTime = _q.getExecuteTime();
info.datasource = _q.getDataSourceName();
info.template = _t;
info.sql = _q.getQueryString();
info.cached = _q.getCacheUsed();
info.records = _q.getNoRows();
info.params = _qp;
queries.add(info);
}// addQuery()
public void addUpdate(String _template, String _datasrc, String _sql) {
addCommon("CFUPDATE", _template, _datasrc, _sql);
}
public void addInsert(String _template, String _datasrc, String _sql) {
addCommon("CFINSERT", _template, _datasrc, _sql);
}
private void addCommon(String _type, String _template, String _datasrc, String _sql) {
queryInfo info = new queryInfo();
info.timeStamp = System.currentTimeMillis();
info.queryName = _type;
info.datasource = _datasrc;
info.template = _template;
info.sql = _sql;
queries.add(info);
}
public void dump(cfSession session) {
String fontSize = (session.isWindowsOrMacUser() ? "small" : "medium");
if (queries.size() > 0) {
session.write("<style type=\"text/css\">\n");
session.write(".queryname\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(".querydetails\n{");
session.write(" color:black;\n");
session.write(" background-color:white;\n");
session.write(" font-family:\"Times New Roman\", Times, serif;\n");
session.write(" font-size: " + fontSize + ";\n}\n\n");
session.write("</style>\n\n");
session.write("<hr/><p><b><div class=\"debughdr\">SQL Queries</div></B></p>");
queryInfo next;
for (int i = 0; i < queries.size(); i++) {
next = (queryInfo) queries.get(i);
session.write("<p><div class=\"queryname\"><b>");
session.write(next.queryName);
session.write("</b></div><div class=\"querydetails\"> (Datasource=");
session.write((next.datasource != null) ? next.datasource : "dbQuery");
session.write(", Time=");
session.write(String.valueOf(next.execTime));
session.write("ms, Records=");
session.write(String.valueOf(next.records));
if (next.cached) {
session.write(", Cached Query");
}
session.write(") in ");
session.write(next.template);
session.write(" @ ");
session.write(com.nary.util.Date.formatDate(next.timeStamp, "HH:mm:ss"));
session.write("</p><p align=center><pre>");
session.write(next.sql);
session.write("</pre></p>");
List<preparedData> qParams = next.params;
if (qParams != null) {
session.write("Query Parameter value(s):<BR>\n");
for (int j = 0; j < qParams.size(); j++) {
preparedData nextParam = qParams.get(j);
session.write("Parameter #");
session.write(String.valueOf(j + 1));
session.write(" Type: ");
session.write(nextParam.getSQLType());
session.write(" Value: ");
try {
session.write(nextParam.getDataAsString());
} catch (dataNotSupportedException ignored) {
}
session.write("<br>\n");
}
}
session.write("</div>\n\n");
}
}
}
class queryInfo {
public String queryName;
public String datasource;
public String sql;
public String template;
public List<preparedData> params = null;
public long execTime;
public int records = 0;
public long timeStamp;
public boolean cached = false;
}
}