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/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/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/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/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/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/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} 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} 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)} - + - {eachend} + {/each}
{if(q.stackTrace)}{endif}{if(q.stackTrace)}{/if} {q.formattedTimestamp} {q.threadId} {q.type.description} {q.total}
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} 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)} - + - {eachend} + {/each}
{if(q.stackTrace)}{endif}{if(q.stackTrace)}{/if} {q.formattedTimestamp} {q.threadId} {q.type.description} {q.total}
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} +
Clear @@ -18,9 +18,9 @@
@@ -34,14 +34,16 @@ - {foreach(queries as q)} + {each(queries as q)} + {escape(none)} + {/escape} - {eachend} + {/each}
{q.total} {q.formattedNano} {q.count}
{q.sql}
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}
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)} - + - {eachend} + {/each}
{if(q.stackTrace)}{endif}{if(q.stackTrace)}{/if} {q.formattedTimestamp} {q.threadId} {q.type.description} {q.total}
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} +
Clear @@ -18,9 +18,9 @@
@@ -34,14 +34,16 @@ - {foreach(queries as q)} + {each(queries as q)} + {escape(none)} + {/escape} - {eachend} + {/each}
{q.total} {q.formattedNano} {q.count}
{q.sql}
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}
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)} - + - {eachend} + {/each}
{if(q.stackTrace)}{endif}{if(q.stackTrace)}{/if} {q.formattedTimestamp} {q.threadId} {q.type.description} {q.total}
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} +
Clear @@ -18,9 +18,9 @@
@@ -34,14 +34,16 @@ - {foreach(queries as q)} + {each(queries as q)} + {escape(none)} + {/escape} - {eachend} + {/each}
{q.total} {q.formattedNano} {q.count}
{q.sql}
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}
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)} - + - {eachend} + {/each}
{if(q.stackTrace)}{endif}{if(q.stackTrace)}{/if} {q.formattedTimestamp} {q.threadId} {q.type.description} {q.total}
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} +
Clear @@ -18,9 +18,9 @@
@@ -34,14 +34,16 @@ - {foreach(queries as q)} + {each(queries as q)} + {escape(none)} + {/escape} - {eachend} + {/each}
{q.total} {q.formattedNano} {q.count}
{q.sql}
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} +
Clear @@ -18,9 +18,9 @@
@@ -36,16 +36,18 @@ - {foreach(transactions as t)} + {each(transactions as t)} - - + + + {escape(none)} + {/escape} - {eachend} + {/each}
{t.totalTime}{t.avgTime}{t.formattedTotalTime}{t.formattedAvgTime} {t.count}
{t.sql}
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}
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)} - + - {eachend} + {/each}
{if(q.stackTrace)}{endif}{if(q.stackTrace)}{/if} {q.formattedTimestamp} {q.threadId} {q.type.description} {q.total}
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} +
Clear @@ -18,9 +18,9 @@
@@ -34,14 +34,16 @@ - {foreach(queries as q)} + {each(queries as q)} + {escape(none)} + {/escape} - {eachend} + {/each}
{q.total} {q.formattedNano} {q.count}
{q.sql}
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} +
Clear @@ -18,9 +18,9 @@
@@ -36,16 +36,18 @@ - {foreach(transactions as t)} + {each(transactions as t)} - - + + + {escape(none)} + {/escape} - {eachend} + {/each}
{t.totalTime}{t.avgTime}{t.formattedTotalTime}{t.formattedAvgTime} {t.count}
{t.sql}
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();