cls) {
+ Object result = formatters.get().get(name);
+
+ return (T)result;
+ }
+
+ private static void setFormatter(String name, Object formatter) {
+ formatters.get().put(name, formatter);
+ }
+
+ public static DateFormat getTimeStampFormatter() {
+ DateFormat result = getFormatter(TIMESTAMP, DateFormat.class);
+
+ if (result == null) {
+ result = new SimpleDateFormat("HH:mm:ss.SSS");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static NumberFormat getNanoTimeStampFormatter() {
+ NumberFormat result = getFormatter(NANOTIMESTAMP, DecimalFormat.class);
+
+ if (result == null) {
+ result = new DecimalFormat("###,##0.000");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static String formatDuration(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatNanoDuration(long time) {
+ return getNanoTimeStampFormatter().format((double) time / 1000000.0);
+ }
+
+ public static String formatTimestamp(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatTimestamp(Date date) {
+ return getTimeStampFormatter().format(new Date(getMillisecondOfDay(date)));
+ }
+
+ public static long getMillisecondOfDay(Date date) {
+ long result = 0;
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+
+ result += c.get(Calendar.HOUR_OF_DAY) * 1000L * 60L * 60L;
+ result += c.get(Calendar.MINUTE) * 1000L * 60L;
+ result += c.get(Calendar.SECOND) * 1000L;
+ result += c.get(Calendar.MILLISECOND);
+
+ return result;
+ }
+
+
+
+}
diff --git a/src/nl/astraeus/jdbc/web/page/Menu.html b/src/nl/astraeus/jdbc/web/page/Menu.html
index 99cb516..8c3ea7c 100644
--- a/src/nl/astraeus/jdbc/web/page/Menu.html
+++ b/src/nl/astraeus/jdbc/web/page/Menu.html
@@ -33,7 +33,7 @@
- {endif}
+ {/if}
{if(user.nickName)}
@@ -42,7 +42,7 @@
- {endif}
+ {/if}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryDetail.html b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
index b1c2d24..7d76fcd 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryDetail.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
@@ -21,13 +21,15 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -41,14 +43,14 @@
- {foreach(queries as q)}
+ {each(queries as q)}
- {if(q.stackTrace)}{endif} |
+ {if(q.stackTrace)}{/if} |
{q.formattedTimestamp} |
{q.threadId} |
{q.type.description} |
{q.total} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
index c10e0f4..04cccc7 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -34,14 +34,16 @@
- {foreach(queries as q)}
+ {each(queries as q)}
|
{q.total} |
{q.formattedNano} |
{q.count} |
+ {escape(none)}
{q.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/lib/vst-0.4.jar b/lib/vst-0.4.jar
index db63792..37c9e38 100644
--- a/lib/vst-0.4.jar
+++ b/lib/vst-0.4.jar
Binary files differ
diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java
index 3019d9b..6ce25f0 100644
--- a/src/nl/astraeus/jdbc/JdbcLogger.java
+++ b/src/nl/astraeus/jdbc/JdbcLogger.java
@@ -104,23 +104,7 @@
}
public String getSql() {
- String tmp = sql.toLowerCase();
-
- tmp = tmp.replaceAll("create table ", "CREATE TABLE ");
- tmp = tmp.replaceAll("insert into ", "INSERT INTO ");
- tmp = tmp.replaceAll("delete from ", "DELETE FROM ");
-
- tmp = tmp.replaceAll("select ", "SELECT ");
- tmp = tmp.replaceAll(" from ", " \nFROM ");
- tmp = tmp.replaceAll(" where ", " \nWHERE ");
- tmp = tmp.replaceAll(" order by ", " \nORDER BY ");
- tmp = tmp.replaceAll(" group by ", " \nGROUP BY ");
- tmp = tmp.replaceAll(" having ", " \nHAVING ");
-
- tmp = tmp.replaceAll("update ", "UPDATE ");
- tmp = tmp.replaceAll(" set ", " \nSET ");
-
- return tmp;
+ return SqlFormatter.getHTMLFormattedSQL(sql);
}
public void addCount(LogEntry le) {
diff --git a/src/nl/astraeus/jdbc/SqlFormatter.java b/src/nl/astraeus/jdbc/SqlFormatter.java
new file mode 100644
index 0000000..135e0cc
--- /dev/null
+++ b/src/nl/astraeus/jdbc/SqlFormatter.java
@@ -0,0 +1,52 @@
+package nl.astraeus.jdbc;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.CCJSqlParserManager;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.select.Select;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.awt.*;
+import java.io.StringReader;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:10 PM
+ */
+public class SqlFormatter {
+ private final static Logger logger = LoggerFactory.getLogger(SqlFormatter.class);
+
+ public static String getHTMLFormattedSQL(String sql) {
+ String tmp = " "+sql.toLowerCase();
+ String tab = " ";
+ String ntab = "\n"+tab;
+
+ tmp = tmp.replaceAll(" create table ", blue("CREATE TABLE")+ntab);
+ tmp = tmp.replaceAll(" insert into ", blue("INSERT INTO")+ntab);
+ tmp = tmp.replaceAll(" delete from ", blue("DELETE FROM")+ntab);
+ tmp = tmp.replaceAll(" values\\(", "\n"+blue("VALUES")+"(");
+
+ tmp = tmp.replaceAll(" select ", blue("SELECT")+ntab);
+ tmp = tmp.replaceAll(" from ", "\n"+blue("FROM")+ntab);
+ tmp = tmp.replaceAll(" where ", "\n"+blue("WHERE")+ntab);
+ tmp = tmp.replaceAll(" order by ", "\n"+blue("ORDER BY")+ntab);
+ tmp = tmp.replaceAll(" group by ", "\n"+blue("GROUP BY")+ntab);
+ tmp = tmp.replaceAll(" having ", "\n"+blue("HAVING")+tab);
+
+ tmp = tmp.replaceAll(" update ", blue("UPDATE")+ntab);
+ tmp = tmp.replaceAll(" set ", "\n"+blue("SET")+ntab);
+
+ tmp = tmp.replaceAll(" commit", "\n"+blue("COMMIT"));
+ tmp = tmp.replaceAll(" rollback", "\n"+blue("ROLLBACK"));
+ tmp = tmp.replaceAll(" close", "\n"+blue("CLOSE"));
+
+ return tmp.trim();
+ }
+
+ public static String blue(String text) {
+ return "
"+text+"";
+ }
+
+}
diff --git a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
index 07aac40..c6a0906 100644
--- a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
+++ b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
@@ -26,6 +26,8 @@
statement.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
statement.close();
+ conn.setAutoCommit(false);
+
boolean running = true;
int count = 1;
PreparedStatement ps = null;
@@ -58,9 +60,21 @@
Thread.sleep(10);
+ conn.commit();
ps = conn.prepareStatement("SELECT * FROM "+TableName);
ResultSet rs = ps.executeQuery();
+
statement.close();
+
+ ps = conn.prepareStatement("UPDATE "+TableName+" SET NAME = ?");
+
+ ps.setString(1, "String "+System.currentTimeMillis());
+
+ ps.execute();
+ ps.close();
+
+ conn.commit();
+ Thread.sleep(10);
}
conn.close();
diff --git a/src/nl/astraeus/jdbc/formatter/SelectFormatter.java b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
new file mode 100644
index 0000000..de8d20b
--- /dev/null
+++ b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
@@ -0,0 +1,20 @@
+package nl.astraeus.jdbc.formatter;
+
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectVisitor;
+import net.sf.jsqlparser.statement.select.Union;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:16 PM
+ */
+public class SelectFormatter implements SelectVisitor {
+ public void visit(PlainSelect plainSelect) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void visit(Union union) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/src/nl/astraeus/jdbc/util/Formatting.java b/src/nl/astraeus/jdbc/util/Formatting.java
new file mode 100644
index 0000000..e0e57fb
--- /dev/null
+++ b/src/nl/astraeus/jdbc/util/Formatting.java
@@ -0,0 +1,91 @@
+package nl.astraeus.jdbc.util;
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * User: rnentjes
+ * Date: 4/21/12
+ * Time: 12:58 PM
+ */
+public class Formatting {
+ private static String DATE_FORMATTER = "date_formatter";
+ private static String TIMESTAMP = "TIMESTAMP";
+ private static String NANOTIMESTAMP = "NANOTIMESTAMP";
+
+ private static ThreadLocal
diff --git a/src/nl/astraeus/jdbc/web/page/QueryDetail.html b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
index b1c2d24..7d76fcd 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryDetail.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
@@ -21,13 +21,15 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -41,14 +43,14 @@
- {foreach(queries as q)}
+ {each(queries as q)}
- {if(q.stackTrace)}{endif} |
+ {if(q.stackTrace)}{/if} |
{q.formattedTimestamp} |
{q.threadId} |
{q.type.description} |
{q.total} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
index c10e0f4..04cccc7 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -34,14 +34,16 @@
- {foreach(queries as q)}
+ {each(queries as q)}
|
{q.total} |
{q.formattedNano} |
{q.count} |
+ {escape(none)}
{q.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.java b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
index 32d11d1..49f7654 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.java
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
@@ -1,7 +1,10 @@
package nl.astraeus.jdbc.web.page;
import nl.astraeus.jdbc.JdbcLogger;
+import nl.astraeus.jdbc.SqlFormatter;
import nl.astraeus.jdbc.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
@@ -14,11 +17,24 @@
* Time: 9:16 PM
*/
public class QueryOverview extends TemplatePage {
+ private static Logger logger = LoggerFactory.getLogger(QueryOverview.class);
boolean sortTotalCalls = true;
boolean sortAvgTime = false;
boolean sortTotalTime = false;
+ private Object parser = null;
+
+ public QueryOverview() {
+ try {
+ Class.forName("net.sf.jsqlparser.parser.CCJSqlParserManager");
+
+ parser = new SqlFormatter();
+ } catch (ClassNotFoundException e) {
+ logger.warn("jsqlparser support not found");
+ }
+ }
+
@Override
public Page processRequest(HttpServletRequest request) {
if ("sortTotalCalls".equals(request.getParameter("action"))) {
@@ -118,6 +134,11 @@
});
}
+ if (parser != null) {
+ //Statement statement
+ //CCJSqlParserManager p
+ }
+
result.put("queries", list);
result.put("count", entries.size());
diff --git a/lib/vst-0.4.jar b/lib/vst-0.4.jar
index db63792..37c9e38 100644
--- a/lib/vst-0.4.jar
+++ b/lib/vst-0.4.jar
Binary files differ
diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java
index 3019d9b..6ce25f0 100644
--- a/src/nl/astraeus/jdbc/JdbcLogger.java
+++ b/src/nl/astraeus/jdbc/JdbcLogger.java
@@ -104,23 +104,7 @@
}
public String getSql() {
- String tmp = sql.toLowerCase();
-
- tmp = tmp.replaceAll("create table ", "CREATE TABLE ");
- tmp = tmp.replaceAll("insert into ", "INSERT INTO ");
- tmp = tmp.replaceAll("delete from ", "DELETE FROM ");
-
- tmp = tmp.replaceAll("select ", "SELECT ");
- tmp = tmp.replaceAll(" from ", " \nFROM ");
- tmp = tmp.replaceAll(" where ", " \nWHERE ");
- tmp = tmp.replaceAll(" order by ", " \nORDER BY ");
- tmp = tmp.replaceAll(" group by ", " \nGROUP BY ");
- tmp = tmp.replaceAll(" having ", " \nHAVING ");
-
- tmp = tmp.replaceAll("update ", "UPDATE ");
- tmp = tmp.replaceAll(" set ", " \nSET ");
-
- return tmp;
+ return SqlFormatter.getHTMLFormattedSQL(sql);
}
public void addCount(LogEntry le) {
diff --git a/src/nl/astraeus/jdbc/SqlFormatter.java b/src/nl/astraeus/jdbc/SqlFormatter.java
new file mode 100644
index 0000000..135e0cc
--- /dev/null
+++ b/src/nl/astraeus/jdbc/SqlFormatter.java
@@ -0,0 +1,52 @@
+package nl.astraeus.jdbc;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.CCJSqlParserManager;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.select.Select;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.awt.*;
+import java.io.StringReader;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:10 PM
+ */
+public class SqlFormatter {
+ private final static Logger logger = LoggerFactory.getLogger(SqlFormatter.class);
+
+ public static String getHTMLFormattedSQL(String sql) {
+ String tmp = " "+sql.toLowerCase();
+ String tab = " ";
+ String ntab = "\n"+tab;
+
+ tmp = tmp.replaceAll(" create table ", blue("CREATE TABLE")+ntab);
+ tmp = tmp.replaceAll(" insert into ", blue("INSERT INTO")+ntab);
+ tmp = tmp.replaceAll(" delete from ", blue("DELETE FROM")+ntab);
+ tmp = tmp.replaceAll(" values\\(", "\n"+blue("VALUES")+"(");
+
+ tmp = tmp.replaceAll(" select ", blue("SELECT")+ntab);
+ tmp = tmp.replaceAll(" from ", "\n"+blue("FROM")+ntab);
+ tmp = tmp.replaceAll(" where ", "\n"+blue("WHERE")+ntab);
+ tmp = tmp.replaceAll(" order by ", "\n"+blue("ORDER BY")+ntab);
+ tmp = tmp.replaceAll(" group by ", "\n"+blue("GROUP BY")+ntab);
+ tmp = tmp.replaceAll(" having ", "\n"+blue("HAVING")+tab);
+
+ tmp = tmp.replaceAll(" update ", blue("UPDATE")+ntab);
+ tmp = tmp.replaceAll(" set ", "\n"+blue("SET")+ntab);
+
+ tmp = tmp.replaceAll(" commit", "\n"+blue("COMMIT"));
+ tmp = tmp.replaceAll(" rollback", "\n"+blue("ROLLBACK"));
+ tmp = tmp.replaceAll(" close", "\n"+blue("CLOSE"));
+
+ return tmp.trim();
+ }
+
+ public static String blue(String text) {
+ return "
"+text+"";
+ }
+
+}
diff --git a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
index 07aac40..c6a0906 100644
--- a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
+++ b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
@@ -26,6 +26,8 @@
statement.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
statement.close();
+ conn.setAutoCommit(false);
+
boolean running = true;
int count = 1;
PreparedStatement ps = null;
@@ -58,9 +60,21 @@
Thread.sleep(10);
+ conn.commit();
ps = conn.prepareStatement("SELECT * FROM "+TableName);
ResultSet rs = ps.executeQuery();
+
statement.close();
+
+ ps = conn.prepareStatement("UPDATE "+TableName+" SET NAME = ?");
+
+ ps.setString(1, "String "+System.currentTimeMillis());
+
+ ps.execute();
+ ps.close();
+
+ conn.commit();
+ Thread.sleep(10);
}
conn.close();
diff --git a/src/nl/astraeus/jdbc/formatter/SelectFormatter.java b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
new file mode 100644
index 0000000..de8d20b
--- /dev/null
+++ b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
@@ -0,0 +1,20 @@
+package nl.astraeus.jdbc.formatter;
+
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectVisitor;
+import net.sf.jsqlparser.statement.select.Union;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:16 PM
+ */
+public class SelectFormatter implements SelectVisitor {
+ public void visit(PlainSelect plainSelect) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void visit(Union union) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/src/nl/astraeus/jdbc/util/Formatting.java b/src/nl/astraeus/jdbc/util/Formatting.java
new file mode 100644
index 0000000..e0e57fb
--- /dev/null
+++ b/src/nl/astraeus/jdbc/util/Formatting.java
@@ -0,0 +1,91 @@
+package nl.astraeus.jdbc.util;
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * User: rnentjes
+ * Date: 4/21/12
+ * Time: 12:58 PM
+ */
+public class Formatting {
+ private static String DATE_FORMATTER = "date_formatter";
+ private static String TIMESTAMP = "TIMESTAMP";
+ private static String NANOTIMESTAMP = "NANOTIMESTAMP";
+
+ private static ThreadLocal
> formatters = new ThreadLocal>() {
+ @Override
+ protected Map initialValue() {
+ return new HashMap();
+ }
+ };
+
+ private static T getFormatter(String name, Class cls) {
+ Object result = formatters.get().get(name);
+
+ return (T)result;
+ }
+
+ private static void setFormatter(String name, Object formatter) {
+ formatters.get().put(name, formatter);
+ }
+
+ public static DateFormat getTimeStampFormatter() {
+ DateFormat result = getFormatter(TIMESTAMP, DateFormat.class);
+
+ if (result == null) {
+ result = new SimpleDateFormat("HH:mm:ss.SSS");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static NumberFormat getNanoTimeStampFormatter() {
+ NumberFormat result = getFormatter(NANOTIMESTAMP, DecimalFormat.class);
+
+ if (result == null) {
+ result = new DecimalFormat("###,##0.000");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static String formatDuration(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatNanoDuration(long time) {
+ return getNanoTimeStampFormatter().format((double) time / 1000000.0);
+ }
+
+ public static String formatTimestamp(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatTimestamp(Date date) {
+ return getTimeStampFormatter().format(new Date(getMillisecondOfDay(date)));
+ }
+
+ public static long getMillisecondOfDay(Date date) {
+ long result = 0;
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+
+ result += c.get(Calendar.HOUR_OF_DAY) * 1000L * 60L * 60L;
+ result += c.get(Calendar.MINUTE) * 1000L * 60L;
+ result += c.get(Calendar.SECOND) * 1000L;
+ result += c.get(Calendar.MILLISECOND);
+
+ return result;
+ }
+
+
+
+}
diff --git a/src/nl/astraeus/jdbc/web/page/Menu.html b/src/nl/astraeus/jdbc/web/page/Menu.html
index 99cb516..8c3ea7c 100644
--- a/src/nl/astraeus/jdbc/web/page/Menu.html
+++ b/src/nl/astraeus/jdbc/web/page/Menu.html
@@ -33,7 +33,7 @@
- {endif}
+ {/if}
{if(user.nickName)}
@@ -42,7 +42,7 @@
- {endif}
+ {/if}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryDetail.html b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
index b1c2d24..7d76fcd 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryDetail.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
@@ -21,13 +21,15 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -41,14 +43,14 @@
- {foreach(queries as q)}
+ {each(queries as q)}
- {if(q.stackTrace)}{endif} |
+ {if(q.stackTrace)}{/if} |
{q.formattedTimestamp} |
{q.threadId} |
{q.type.description} |
{q.total} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
index c10e0f4..04cccc7 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -34,14 +34,16 @@
- {foreach(queries as q)}
+ {each(queries as q)}
|
{q.total} |
{q.formattedNano} |
{q.count} |
+ {escape(none)}
{q.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.java b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
index 32d11d1..49f7654 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.java
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
@@ -1,7 +1,10 @@
package nl.astraeus.jdbc.web.page;
import nl.astraeus.jdbc.JdbcLogger;
+import nl.astraeus.jdbc.SqlFormatter;
import nl.astraeus.jdbc.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
@@ -14,11 +17,24 @@
* Time: 9:16 PM
*/
public class QueryOverview extends TemplatePage {
+ private static Logger logger = LoggerFactory.getLogger(QueryOverview.class);
boolean sortTotalCalls = true;
boolean sortAvgTime = false;
boolean sortTotalTime = false;
+ private Object parser = null;
+
+ public QueryOverview() {
+ try {
+ Class.forName("net.sf.jsqlparser.parser.CCJSqlParserManager");
+
+ parser = new SqlFormatter();
+ } catch (ClassNotFoundException e) {
+ logger.warn("jsqlparser support not found");
+ }
+ }
+
@Override
public Page processRequest(HttpServletRequest request) {
if ("sortTotalCalls".equals(request.getParameter("action"))) {
@@ -118,6 +134,11 @@
});
}
+ if (parser != null) {
+ //Statement statement
+ //CCJSqlParserManager p
+ }
+
result.put("queries", list);
result.put("count", entries.size());
diff --git a/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html b/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
index d2af61d..e34caf4 100644
--- a/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
+++ b/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
@@ -10,7 +10,9 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -23,12 +25,12 @@
- {foreach(trace as el)}
+ {each(trace as el)}
{el.className} |
{el.methodName} |
{el.lineNumber} |
- {eachend}
+ {/each}
diff --git a/lib/vst-0.4.jar b/lib/vst-0.4.jar
index db63792..37c9e38 100644
--- a/lib/vst-0.4.jar
+++ b/lib/vst-0.4.jar
Binary files differ
diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java
index 3019d9b..6ce25f0 100644
--- a/src/nl/astraeus/jdbc/JdbcLogger.java
+++ b/src/nl/astraeus/jdbc/JdbcLogger.java
@@ -104,23 +104,7 @@
}
public String getSql() {
- String tmp = sql.toLowerCase();
-
- tmp = tmp.replaceAll("create table ", "CREATE TABLE ");
- tmp = tmp.replaceAll("insert into ", "INSERT INTO ");
- tmp = tmp.replaceAll("delete from ", "DELETE FROM ");
-
- tmp = tmp.replaceAll("select ", "SELECT ");
- tmp = tmp.replaceAll(" from ", " \nFROM ");
- tmp = tmp.replaceAll(" where ", " \nWHERE ");
- tmp = tmp.replaceAll(" order by ", " \nORDER BY ");
- tmp = tmp.replaceAll(" group by ", " \nGROUP BY ");
- tmp = tmp.replaceAll(" having ", " \nHAVING ");
-
- tmp = tmp.replaceAll("update ", "UPDATE ");
- tmp = tmp.replaceAll(" set ", " \nSET ");
-
- return tmp;
+ return SqlFormatter.getHTMLFormattedSQL(sql);
}
public void addCount(LogEntry le) {
diff --git a/src/nl/astraeus/jdbc/SqlFormatter.java b/src/nl/astraeus/jdbc/SqlFormatter.java
new file mode 100644
index 0000000..135e0cc
--- /dev/null
+++ b/src/nl/astraeus/jdbc/SqlFormatter.java
@@ -0,0 +1,52 @@
+package nl.astraeus.jdbc;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.CCJSqlParserManager;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.select.Select;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.awt.*;
+import java.io.StringReader;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:10 PM
+ */
+public class SqlFormatter {
+ private final static Logger logger = LoggerFactory.getLogger(SqlFormatter.class);
+
+ public static String getHTMLFormattedSQL(String sql) {
+ String tmp = " "+sql.toLowerCase();
+ String tab = " ";
+ String ntab = "\n"+tab;
+
+ tmp = tmp.replaceAll(" create table ", blue("CREATE TABLE")+ntab);
+ tmp = tmp.replaceAll(" insert into ", blue("INSERT INTO")+ntab);
+ tmp = tmp.replaceAll(" delete from ", blue("DELETE FROM")+ntab);
+ tmp = tmp.replaceAll(" values\\(", "\n"+blue("VALUES")+"(");
+
+ tmp = tmp.replaceAll(" select ", blue("SELECT")+ntab);
+ tmp = tmp.replaceAll(" from ", "\n"+blue("FROM")+ntab);
+ tmp = tmp.replaceAll(" where ", "\n"+blue("WHERE")+ntab);
+ tmp = tmp.replaceAll(" order by ", "\n"+blue("ORDER BY")+ntab);
+ tmp = tmp.replaceAll(" group by ", "\n"+blue("GROUP BY")+ntab);
+ tmp = tmp.replaceAll(" having ", "\n"+blue("HAVING")+tab);
+
+ tmp = tmp.replaceAll(" update ", blue("UPDATE")+ntab);
+ tmp = tmp.replaceAll(" set ", "\n"+blue("SET")+ntab);
+
+ tmp = tmp.replaceAll(" commit", "\n"+blue("COMMIT"));
+ tmp = tmp.replaceAll(" rollback", "\n"+blue("ROLLBACK"));
+ tmp = tmp.replaceAll(" close", "\n"+blue("CLOSE"));
+
+ return tmp.trim();
+ }
+
+ public static String blue(String text) {
+ return "
"+text+"";
+ }
+
+}
diff --git a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
index 07aac40..c6a0906 100644
--- a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
+++ b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
@@ -26,6 +26,8 @@
statement.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
statement.close();
+ conn.setAutoCommit(false);
+
boolean running = true;
int count = 1;
PreparedStatement ps = null;
@@ -58,9 +60,21 @@
Thread.sleep(10);
+ conn.commit();
ps = conn.prepareStatement("SELECT * FROM "+TableName);
ResultSet rs = ps.executeQuery();
+
statement.close();
+
+ ps = conn.prepareStatement("UPDATE "+TableName+" SET NAME = ?");
+
+ ps.setString(1, "String "+System.currentTimeMillis());
+
+ ps.execute();
+ ps.close();
+
+ conn.commit();
+ Thread.sleep(10);
}
conn.close();
diff --git a/src/nl/astraeus/jdbc/formatter/SelectFormatter.java b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
new file mode 100644
index 0000000..de8d20b
--- /dev/null
+++ b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
@@ -0,0 +1,20 @@
+package nl.astraeus.jdbc.formatter;
+
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectVisitor;
+import net.sf.jsqlparser.statement.select.Union;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:16 PM
+ */
+public class SelectFormatter implements SelectVisitor {
+ public void visit(PlainSelect plainSelect) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void visit(Union union) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/src/nl/astraeus/jdbc/util/Formatting.java b/src/nl/astraeus/jdbc/util/Formatting.java
new file mode 100644
index 0000000..e0e57fb
--- /dev/null
+++ b/src/nl/astraeus/jdbc/util/Formatting.java
@@ -0,0 +1,91 @@
+package nl.astraeus.jdbc.util;
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * User: rnentjes
+ * Date: 4/21/12
+ * Time: 12:58 PM
+ */
+public class Formatting {
+ private static String DATE_FORMATTER = "date_formatter";
+ private static String TIMESTAMP = "TIMESTAMP";
+ private static String NANOTIMESTAMP = "NANOTIMESTAMP";
+
+ private static ThreadLocal
> formatters = new ThreadLocal>() {
+ @Override
+ protected Map initialValue() {
+ return new HashMap();
+ }
+ };
+
+ private static T getFormatter(String name, Class cls) {
+ Object result = formatters.get().get(name);
+
+ return (T)result;
+ }
+
+ private static void setFormatter(String name, Object formatter) {
+ formatters.get().put(name, formatter);
+ }
+
+ public static DateFormat getTimeStampFormatter() {
+ DateFormat result = getFormatter(TIMESTAMP, DateFormat.class);
+
+ if (result == null) {
+ result = new SimpleDateFormat("HH:mm:ss.SSS");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static NumberFormat getNanoTimeStampFormatter() {
+ NumberFormat result = getFormatter(NANOTIMESTAMP, DecimalFormat.class);
+
+ if (result == null) {
+ result = new DecimalFormat("###,##0.000");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static String formatDuration(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatNanoDuration(long time) {
+ return getNanoTimeStampFormatter().format((double) time / 1000000.0);
+ }
+
+ public static String formatTimestamp(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatTimestamp(Date date) {
+ return getTimeStampFormatter().format(new Date(getMillisecondOfDay(date)));
+ }
+
+ public static long getMillisecondOfDay(Date date) {
+ long result = 0;
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+
+ result += c.get(Calendar.HOUR_OF_DAY) * 1000L * 60L * 60L;
+ result += c.get(Calendar.MINUTE) * 1000L * 60L;
+ result += c.get(Calendar.SECOND) * 1000L;
+ result += c.get(Calendar.MILLISECOND);
+
+ return result;
+ }
+
+
+
+}
diff --git a/src/nl/astraeus/jdbc/web/page/Menu.html b/src/nl/astraeus/jdbc/web/page/Menu.html
index 99cb516..8c3ea7c 100644
--- a/src/nl/astraeus/jdbc/web/page/Menu.html
+++ b/src/nl/astraeus/jdbc/web/page/Menu.html
@@ -33,7 +33,7 @@
- {endif}
+ {/if}
{if(user.nickName)}
@@ -42,7 +42,7 @@
- {endif}
+ {/if}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryDetail.html b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
index b1c2d24..7d76fcd 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryDetail.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
@@ -21,13 +21,15 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -41,14 +43,14 @@
- {foreach(queries as q)}
+ {each(queries as q)}
- {if(q.stackTrace)}{endif} |
+ {if(q.stackTrace)}{/if} |
{q.formattedTimestamp} |
{q.threadId} |
{q.type.description} |
{q.total} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
index c10e0f4..04cccc7 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -34,14 +34,16 @@
- {foreach(queries as q)}
+ {each(queries as q)}
|
{q.total} |
{q.formattedNano} |
{q.count} |
+ {escape(none)}
{q.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.java b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
index 32d11d1..49f7654 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.java
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
@@ -1,7 +1,10 @@
package nl.astraeus.jdbc.web.page;
import nl.astraeus.jdbc.JdbcLogger;
+import nl.astraeus.jdbc.SqlFormatter;
import nl.astraeus.jdbc.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
@@ -14,11 +17,24 @@
* Time: 9:16 PM
*/
public class QueryOverview extends TemplatePage {
+ private static Logger logger = LoggerFactory.getLogger(QueryOverview.class);
boolean sortTotalCalls = true;
boolean sortAvgTime = false;
boolean sortTotalTime = false;
+ private Object parser = null;
+
+ public QueryOverview() {
+ try {
+ Class.forName("net.sf.jsqlparser.parser.CCJSqlParserManager");
+
+ parser = new SqlFormatter();
+ } catch (ClassNotFoundException e) {
+ logger.warn("jsqlparser support not found");
+ }
+ }
+
@Override
public Page processRequest(HttpServletRequest request) {
if ("sortTotalCalls".equals(request.getParameter("action"))) {
@@ -118,6 +134,11 @@
});
}
+ if (parser != null) {
+ //Statement statement
+ //CCJSqlParserManager p
+ }
+
result.put("queries", list);
result.put("count", entries.size());
diff --git a/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html b/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
index d2af61d..e34caf4 100644
--- a/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
+++ b/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
@@ -10,7 +10,9 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -23,12 +25,12 @@
- {foreach(trace as el)}
+ {each(trace as el)}
{el.className} |
{el.methodName} |
{el.lineNumber} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/TransactionOverview.html b/src/nl/astraeus/jdbc/web/page/TransactionOverview.html
index 2a23d2b..7030b98 100644
--- a/src/nl/astraeus/jdbc/web/page/TransactionOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/TransactionOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -36,16 +36,18 @@
- {foreach(transactions as t)}
+ {each(transactions as t)}
- {t.totalTime} |
- {t.avgTime} |
+ {t.formattedTotalTime} |
+ {t.formattedAvgTime} |
{t.count} |
+ {escape(none)}
{t.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/lib/vst-0.4.jar b/lib/vst-0.4.jar
index db63792..37c9e38 100644
--- a/lib/vst-0.4.jar
+++ b/lib/vst-0.4.jar
Binary files differ
diff --git a/src/nl/astraeus/jdbc/JdbcLogger.java b/src/nl/astraeus/jdbc/JdbcLogger.java
index 3019d9b..6ce25f0 100644
--- a/src/nl/astraeus/jdbc/JdbcLogger.java
+++ b/src/nl/astraeus/jdbc/JdbcLogger.java
@@ -104,23 +104,7 @@
}
public String getSql() {
- String tmp = sql.toLowerCase();
-
- tmp = tmp.replaceAll("create table ", "CREATE TABLE ");
- tmp = tmp.replaceAll("insert into ", "INSERT INTO ");
- tmp = tmp.replaceAll("delete from ", "DELETE FROM ");
-
- tmp = tmp.replaceAll("select ", "SELECT ");
- tmp = tmp.replaceAll(" from ", " \nFROM ");
- tmp = tmp.replaceAll(" where ", " \nWHERE ");
- tmp = tmp.replaceAll(" order by ", " \nORDER BY ");
- tmp = tmp.replaceAll(" group by ", " \nGROUP BY ");
- tmp = tmp.replaceAll(" having ", " \nHAVING ");
-
- tmp = tmp.replaceAll("update ", "UPDATE ");
- tmp = tmp.replaceAll(" set ", " \nSET ");
-
- return tmp;
+ return SqlFormatter.getHTMLFormattedSQL(sql);
}
public void addCount(LogEntry le) {
diff --git a/src/nl/astraeus/jdbc/SqlFormatter.java b/src/nl/astraeus/jdbc/SqlFormatter.java
new file mode 100644
index 0000000..135e0cc
--- /dev/null
+++ b/src/nl/astraeus/jdbc/SqlFormatter.java
@@ -0,0 +1,52 @@
+package nl.astraeus.jdbc;
+
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.parser.CCJSqlParserManager;
+import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.select.Select;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.awt.*;
+import java.io.StringReader;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:10 PM
+ */
+public class SqlFormatter {
+ private final static Logger logger = LoggerFactory.getLogger(SqlFormatter.class);
+
+ public static String getHTMLFormattedSQL(String sql) {
+ String tmp = " "+sql.toLowerCase();
+ String tab = " ";
+ String ntab = "\n"+tab;
+
+ tmp = tmp.replaceAll(" create table ", blue("CREATE TABLE")+ntab);
+ tmp = tmp.replaceAll(" insert into ", blue("INSERT INTO")+ntab);
+ tmp = tmp.replaceAll(" delete from ", blue("DELETE FROM")+ntab);
+ tmp = tmp.replaceAll(" values\\(", "\n"+blue("VALUES")+"(");
+
+ tmp = tmp.replaceAll(" select ", blue("SELECT")+ntab);
+ tmp = tmp.replaceAll(" from ", "\n"+blue("FROM")+ntab);
+ tmp = tmp.replaceAll(" where ", "\n"+blue("WHERE")+ntab);
+ tmp = tmp.replaceAll(" order by ", "\n"+blue("ORDER BY")+ntab);
+ tmp = tmp.replaceAll(" group by ", "\n"+blue("GROUP BY")+ntab);
+ tmp = tmp.replaceAll(" having ", "\n"+blue("HAVING")+tab);
+
+ tmp = tmp.replaceAll(" update ", blue("UPDATE")+ntab);
+ tmp = tmp.replaceAll(" set ", "\n"+blue("SET")+ntab);
+
+ tmp = tmp.replaceAll(" commit", "\n"+blue("COMMIT"));
+ tmp = tmp.replaceAll(" rollback", "\n"+blue("ROLLBACK"));
+ tmp = tmp.replaceAll(" close", "\n"+blue("CLOSE"));
+
+ return tmp.trim();
+ }
+
+ public static String blue(String text) {
+ return "
"+text+"";
+ }
+
+}
diff --git a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
index 07aac40..c6a0906 100644
--- a/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
+++ b/src/nl/astraeus/jdbc/example/JdbcStatisticsExample.java
@@ -26,6 +26,8 @@
statement.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
statement.close();
+ conn.setAutoCommit(false);
+
boolean running = true;
int count = 1;
PreparedStatement ps = null;
@@ -58,9 +60,21 @@
Thread.sleep(10);
+ conn.commit();
ps = conn.prepareStatement("SELECT * FROM "+TableName);
ResultSet rs = ps.executeQuery();
+
statement.close();
+
+ ps = conn.prepareStatement("UPDATE "+TableName+" SET NAME = ?");
+
+ ps.setString(1, "String "+System.currentTimeMillis());
+
+ ps.execute();
+ ps.close();
+
+ conn.commit();
+ Thread.sleep(10);
}
conn.close();
diff --git a/src/nl/astraeus/jdbc/formatter/SelectFormatter.java b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
new file mode 100644
index 0000000..de8d20b
--- /dev/null
+++ b/src/nl/astraeus/jdbc/formatter/SelectFormatter.java
@@ -0,0 +1,20 @@
+package nl.astraeus.jdbc.formatter;
+
+import net.sf.jsqlparser.statement.select.PlainSelect;
+import net.sf.jsqlparser.statement.select.SelectVisitor;
+import net.sf.jsqlparser.statement.select.Union;
+
+/**
+ * User: rnentjes
+ * Date: 4/18/12
+ * Time: 10:16 PM
+ */
+public class SelectFormatter implements SelectVisitor {
+ public void visit(PlainSelect plainSelect) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void visit(Union union) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/src/nl/astraeus/jdbc/util/Formatting.java b/src/nl/astraeus/jdbc/util/Formatting.java
new file mode 100644
index 0000000..e0e57fb
--- /dev/null
+++ b/src/nl/astraeus/jdbc/util/Formatting.java
@@ -0,0 +1,91 @@
+package nl.astraeus.jdbc.util;
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * User: rnentjes
+ * Date: 4/21/12
+ * Time: 12:58 PM
+ */
+public class Formatting {
+ private static String DATE_FORMATTER = "date_formatter";
+ private static String TIMESTAMP = "TIMESTAMP";
+ private static String NANOTIMESTAMP = "NANOTIMESTAMP";
+
+ private static ThreadLocal
> formatters = new ThreadLocal>() {
+ @Override
+ protected Map initialValue() {
+ return new HashMap();
+ }
+ };
+
+ private static T getFormatter(String name, Class cls) {
+ Object result = formatters.get().get(name);
+
+ return (T)result;
+ }
+
+ private static void setFormatter(String name, Object formatter) {
+ formatters.get().put(name, formatter);
+ }
+
+ public static DateFormat getTimeStampFormatter() {
+ DateFormat result = getFormatter(TIMESTAMP, DateFormat.class);
+
+ if (result == null) {
+ result = new SimpleDateFormat("HH:mm:ss.SSS");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static NumberFormat getNanoTimeStampFormatter() {
+ NumberFormat result = getFormatter(NANOTIMESTAMP, DecimalFormat.class);
+
+ if (result == null) {
+ result = new DecimalFormat("###,##0.000");
+ setFormatter(TIMESTAMP, result);
+ }
+ return result;
+ }
+
+ public static String formatDuration(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatNanoDuration(long time) {
+ return getNanoTimeStampFormatter().format((double) time / 1000000.0);
+ }
+
+ public static String formatTimestamp(long time) {
+ return getTimeStampFormatter().format(new Date(time));
+ }
+
+ public static String formatTimestamp(Date date) {
+ return getTimeStampFormatter().format(new Date(getMillisecondOfDay(date)));
+ }
+
+ public static long getMillisecondOfDay(Date date) {
+ long result = 0;
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(date);
+
+ result += c.get(Calendar.HOUR_OF_DAY) * 1000L * 60L * 60L;
+ result += c.get(Calendar.MINUTE) * 1000L * 60L;
+ result += c.get(Calendar.SECOND) * 1000L;
+ result += c.get(Calendar.MILLISECOND);
+
+ return result;
+ }
+
+
+
+}
diff --git a/src/nl/astraeus/jdbc/web/page/Menu.html b/src/nl/astraeus/jdbc/web/page/Menu.html
index 99cb516..8c3ea7c 100644
--- a/src/nl/astraeus/jdbc/web/page/Menu.html
+++ b/src/nl/astraeus/jdbc/web/page/Menu.html
@@ -33,7 +33,7 @@
- {endif}
+ {/if}
{if(user.nickName)}
@@ -42,7 +42,7 @@
- {endif}
+ {/if}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryDetail.html b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
index b1c2d24..7d76fcd 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryDetail.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryDetail.html
@@ -21,13 +21,15 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -41,14 +43,14 @@
- {foreach(queries as q)}
+ {each(queries as q)}
- {if(q.stackTrace)}{endif} |
+ {if(q.stackTrace)}{/if} |
{q.formattedTimestamp} |
{q.threadId} |
{q.type.description} |
{q.total} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.html b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
index c10e0f4..04cccc7 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -34,14 +34,16 @@
- {foreach(queries as q)}
+ {each(queries as q)}
|
{q.total} |
{q.formattedNano} |
{q.count} |
+ {escape(none)}
{q.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/QueryOverview.java b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
index 32d11d1..49f7654 100644
--- a/src/nl/astraeus/jdbc/web/page/QueryOverview.java
+++ b/src/nl/astraeus/jdbc/web/page/QueryOverview.java
@@ -1,7 +1,10 @@
package nl.astraeus.jdbc.web.page;
import nl.astraeus.jdbc.JdbcLogger;
+import nl.astraeus.jdbc.SqlFormatter;
import nl.astraeus.jdbc.util.Util;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.text.DateFormat;
@@ -14,11 +17,24 @@
* Time: 9:16 PM
*/
public class QueryOverview extends TemplatePage {
+ private static Logger logger = LoggerFactory.getLogger(QueryOverview.class);
boolean sortTotalCalls = true;
boolean sortAvgTime = false;
boolean sortTotalTime = false;
+ private Object parser = null;
+
+ public QueryOverview() {
+ try {
+ Class.forName("net.sf.jsqlparser.parser.CCJSqlParserManager");
+
+ parser = new SqlFormatter();
+ } catch (ClassNotFoundException e) {
+ logger.warn("jsqlparser support not found");
+ }
+ }
+
@Override
public Page processRequest(HttpServletRequest request) {
if ("sortTotalCalls".equals(request.getParameter("action"))) {
@@ -118,6 +134,11 @@
});
}
+ if (parser != null) {
+ //Statement statement
+ //CCJSqlParserManager p
+ }
+
result.put("queries", list);
result.put("count", entries.size());
diff --git a/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html b/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
index d2af61d..e34caf4 100644
--- a/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
+++ b/src/nl/astraeus/jdbc/web/page/ShowStacktrace.html
@@ -10,7 +10,9 @@
+ {escape(none)}
{sql}
+ {/escape}
@@ -23,12 +25,12 @@
- {foreach(trace as el)}
+ {each(trace as el)}
{el.className} |
{el.methodName} |
{el.lineNumber} |
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/TransactionOverview.html b/src/nl/astraeus/jdbc/web/page/TransactionOverview.html
index 2a23d2b..7030b98 100644
--- a/src/nl/astraeus/jdbc/web/page/TransactionOverview.html
+++ b/src/nl/astraeus/jdbc/web/page/TransactionOverview.html
@@ -9,8 +9,8 @@
Time span: {deltaTime} ({fromTime} - {toTime})
Avg. time/query: {avgTime}
-
-
{if(recording)}Recording{else}Not recording{endif}
+
@@ -36,16 +36,18 @@
- {foreach(transactions as t)}
+ {each(transactions as t)}
- {t.totalTime} |
- {t.avgTime} |
+ {t.formattedTotalTime} |
+ {t.formattedAvgTime} |
{t.count} |
+ {escape(none)}
{t.sql}
|
+ {/escape}
- {eachend}
+ {/each}
diff --git a/src/nl/astraeus/jdbc/web/page/TransactionOverview.java b/src/nl/astraeus/jdbc/web/page/TransactionOverview.java
index 42c2741..3a725b6 100644
--- a/src/nl/astraeus/jdbc/web/page/TransactionOverview.java
+++ b/src/nl/astraeus/jdbc/web/page/TransactionOverview.java
@@ -1,6 +1,7 @@
package nl.astraeus.jdbc.web.page;
import nl.astraeus.jdbc.JdbcLogger;
+import nl.astraeus.jdbc.util.Formatting;
import nl.astraeus.jdbc.util.Util;
import javax.servlet.http.HttpServletRequest;
@@ -67,12 +68,34 @@
return nanoTime / getCount();
}
+ public String getFormattedAvgTime() {
+ return Formatting.formatNanoDuration(nanoTime / getCount());
+ }
+
+ public String getFormattedTotalTime() {
+ return Formatting.formatNanoDuration(nanoTime);
+ }
+
+ public String getFormattedTimestamp() {
+ return Formatting.formatTimestamp(timestamp);
+ }
+
+ public String getFormattedEndTimestamp() {
+ return Formatting.formatTimestamp(timestamp + (nanoTime / 1000000L));
+ }
+
public String getSql() {
StringBuilder result = new StringBuilder();
+ boolean first = true;
for (JdbcLogger.LogEntry entry : queries) {
+ if (first) {
+ first = false;
+ } else {
+ result.append("\n\n");
+ }
+
result.append(entry.getSql());
- result.append("\n\n");
}
return result.toString();