From 2f546950ce820e83693902d83318074d1658834e Mon Sep 17 00:00:00 2001 From: Chrriis Date: Sun, 7 Oct 2012 12:12:10 +0200 Subject: [PATCH 1/2] [#1177] Add SQL Console module to jOOQ - Show sum when selecting time information of multiple rows of same column. --- .../org/jooq/debug/console/LoggerPane.java | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/jOOQ-console/src/main/java/org/jooq/debug/console/LoggerPane.java b/jOOQ-console/src/main/java/org/jooq/debug/console/LoggerPane.java index c3bdaeac67..9bcc3531a8 100644 --- a/jOOQ-console/src/main/java/org/jooq/debug/console/LoggerPane.java +++ b/jOOQ-console/src/main/java/org/jooq/debug/console/LoggerPane.java @@ -96,6 +96,7 @@ import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableModel; import org.jooq.debug.console.misc.InvisibleSplitPane; import org.jooq.debug.console.misc.JTableX; @@ -913,9 +914,38 @@ public class LoggerPane extends JPanel { } else { text = displayedCount + "/" + size + " queries"; } - int count = table.getSelectedRowCount(); - if(count > 0) { - text = text + " - " + count + " selected rows"; + int selectedRowCount = table.getSelectedRowCount(); + if(selectedRowCount > 0) { + text = text + " - " + selectedRowCount + " selected rows"; + if(selectedRowCount > 1) { + int[] selectedColumns = table.getSelectedColumns(); + if(selectedColumns.length == 1) { + int column = table.convertColumnIndexToModel(selectedColumns[0]); + switch(column) { + case COLUMN_EXEC_TIME: + case COLUMN_RS_LIFETIME: + case COLUMN_RS_READ: + case COLUMN_RS_READ_ROWS: + int[] selectedRows = table.getSelectedRows(); + TableModel model = table.getModel(); + long sum = 0; + boolean isValid = true; + for(int row: selectedRows) { + row = table.convertRowIndexToModel(row); + Number number = (Number)model.getValueAt(row, column); + if(number == null) { + isValid = false; + break; + } + sum += number.longValue(); + } + if(isValid) { + text += " - sum: " + sum; + } + break; + } + } + } } loggerStatusLabel.setText(text); } From f4497dca186b51045ce653de4c54aea47384d108 Mon Sep 17 00:00:00 2001 From: Chrriis Date: Sun, 7 Oct 2012 12:12:59 +0200 Subject: [PATCH 2/2] [#1177] Add SQL Console module to jOOQ - Minor bug fixes. --- .../java/org/jooq/debug/console/EditorPane.java | 11 ++++++++--- .../org/jooq/tools/debug/old/QueryExecutor.java | 2 +- .../debug/old/impl/ClientStatementExecutor.java | 4 ++-- .../debug/old/impl/LocalStatementExecutor.java | 16 +++++++++++----- .../tools/debug/old/impl/ServerDebugger.java | 14 ++++++++------ 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/jOOQ-console/src/main/java/org/jooq/debug/console/EditorPane.java b/jOOQ-console/src/main/java/org/jooq/debug/console/EditorPane.java index 4382a0bc69..8a9b8a3cf0 100644 --- a/jOOQ-console/src/main/java/org/jooq/debug/console/EditorPane.java +++ b/jOOQ-console/src/main/java/org/jooq/debug/console/EditorPane.java @@ -250,10 +250,13 @@ public class EditorPane extends JPanel { @Override public void run() { final int maxDisplayedRowCount = ((Number)displayedRowCountField.getValue()).intValue(); + // TODO: For now, if there is no max limit, consider we don't want the rows to be updatable. + // TODO: eventually, we want a distinct choice on the user interface. + final boolean isUpdatable = isUsingMaxRowCount; Thread evaluationThread = new Thread("SQLConsole - Evaluation") { @Override public void run() { - evaluate_unrestricted_nothread(sql, maxDisplayedRowCount); + evaluate_unrestricted_nothread(sql, maxDisplayedRowCount, isUpdatable); } }; evaluationThread.start(); @@ -261,7 +264,7 @@ public class EditorPane extends JPanel { }); } - private void evaluate_unrestricted_nothread(final String sql, final int maxDisplayedRowCount) { + private void evaluate_unrestricted_nothread(final String sql, final int maxDisplayedRowCount, boolean isUpdatable) { closeLastExecution(); SwingUtilities.invokeLater(new Runnable() { @Override @@ -278,7 +281,7 @@ public class EditorPane extends JPanel { } QueryExecution queryExecution; try { - queryExecution = queryExecutor.execute(sql, isUsingMaxRowCount? MAX_ROW_COUNT: Integer.MAX_VALUE, maxDisplayedRowCount); + queryExecution = queryExecutor.execute(sql, isUsingMaxRowCount? MAX_ROW_COUNT: Integer.MAX_VALUE, maxDisplayedRowCount, isUpdatable); } finally { SwingUtilities.invokeLater(new Runnable() { @Override @@ -660,7 +663,9 @@ public class EditorPane extends JPanel { case KeyEvent.VK_DOWN: case KeyEvent.VK_HOME: case KeyEvent.VK_END: + return; case KeyEvent.VK_ESCAPE: + w.setVisible(false); return; case KeyEvent.VK_ENTER: editorTextArea.replaceRange(((CompletionCandidate)jList.getSelectedValue()).toString(), getWordStart(), editorTextArea.getCaretPosition()); diff --git a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/QueryExecutor.java b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/QueryExecutor.java index ac451a4928..44fde2299c 100644 --- a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/QueryExecutor.java +++ b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/QueryExecutor.java @@ -43,7 +43,7 @@ package org.jooq.tools.debug.old; */ public interface QueryExecutor { - public QueryExecution execute(String sql, int maxRSRowsParsing, int retainParsedRSDataRowCountThreshold); + public QueryExecution execute(String sql, int maxRSRowsParsing, int retainParsedRSDataRowCountThreshold, boolean isUpdatable); public void stopExecution(); diff --git a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ClientStatementExecutor.java b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ClientStatementExecutor.java index 2d6bdd578e..d19fc734c5 100644 --- a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ClientStatementExecutor.java +++ b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ClientStatementExecutor.java @@ -66,8 +66,8 @@ class ClientStatementExecutor implements QueryExecutor { } @Override - public QueryExecution execute(String sql, int maxRSRowsParsing, int retainParsedRSDataRowCountThreshold) { - return debugger.getCommunicationInterface().syncSend(new CMS_doStatementExecutorExecution(id, sql, maxRSRowsParsing, retainParsedRSDataRowCountThreshold)); + public QueryExecution execute(String sql, int maxRSRowsParsing, int retainParsedRSDataRowCountThreshold, boolean isUpdatable) { + return debugger.getCommunicationInterface().syncSend(new CMS_doStatementExecutorExecution(id, sql, maxRSRowsParsing, retainParsedRSDataRowCountThreshold, isUpdatable)); } @Override diff --git a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/LocalStatementExecutor.java b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/LocalStatementExecutor.java index 7ec2d571c0..fad90586d0 100644 --- a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/LocalStatementExecutor.java +++ b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/LocalStatementExecutor.java @@ -83,9 +83,11 @@ class LocalStatementExecutor implements QueryExecutor { private volatile Thread evaluationThread; @Override - public QueryExecution execute(String sql, int maxRSRowsParsing, int retainParsedRSDataRowCountThreshold) { + public QueryExecution execute(String sql, int maxRSRowsParsing, int retainParsedRSDataRowCountThreshold, boolean isUpdatable) { + boolean isReadOnly = executorContext.isReadOnly(); + isUpdatable = !isReadOnly && isUpdatable; boolean isAllowed = true; - if(executorContext.isReadOnly()) { + if(isReadOnly) { String simplifiedSql = sql.replaceAll("'[^']*'", ""); switch(QueryType.detectType(simplifiedSql)) { case SELECT: @@ -123,7 +125,11 @@ class LocalStatementExecutor implements QueryExecutor { long start = System.currentTimeMillis(); try { conn = executorContext.getConnection(); - stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); + if(isUpdatable) { + stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); + } else { + stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); + } // If no error, adjust start to beginning of actual execution. start = System.currentTimeMillis(); if(evaluationThread != Thread.currentThread()) { @@ -278,7 +284,7 @@ class LocalStatementExecutor implements QueryExecutor { } } final long resultSetParsingDuration = System.currentTimeMillis() - rsStart; - queryExecutionResult = new LocalStatementExecutionResultSetResult(rs, columnNames, typeInfos, columnClasses, rowDataList.toArray(new Object[0][]), rowCount, resultSetParsingDuration, retainParsedRSDataRowCountThreshold, executorContext.isReadOnly()); + queryExecutionResult = new LocalStatementExecutionResultSetResult(rs, columnNames, typeInfos, columnClasses, rowDataList.toArray(new Object[0][]), rowCount, resultSetParsingDuration, retainParsedRSDataRowCountThreshold, isReadOnly); } else { final int updateCount = stmt.getUpdateCount(); queryExecutionResult = new QueryExecutionMessageResult(Utils.formatDuration(executionDuration) + "> " + updateCount + " row(s) affected.", false); @@ -299,7 +305,7 @@ class LocalStatementExecutor implements QueryExecutor { long executionDuration = System.currentTimeMillis() - start; return new QueryExecution(executionDuration, new QueryExecutionMessageResult(e)); } finally { - if(executorContext.isReadOnly()) { + if(isReadOnly) { closeConnection(); } } diff --git a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ServerDebugger.java b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ServerDebugger.java index abec77433a..ec7decbec2 100644 --- a/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ServerDebugger.java +++ b/jOOQ-console/src/main/java/org/jooq/tools/debug/old/impl/ServerDebugger.java @@ -231,22 +231,24 @@ class ServerDebugger extends LocalDebugger { } static class CMS_doStatementExecutorExecution extends CommandMessage { - private final int id; - private final String sql; - private final int maxRSRowsParsing; - private final int retainParsedRSDataRowCountThreshold; + private final int id; + private final String sql; + private final int maxRSRowsParsing; + private final int retainParsedRSDataRowCountThreshold; + private final boolean isUpdatable; CMS_doStatementExecutorExecution(int id, String sql, int maxRSRowsParsing, - int retainParsedRSDataRowCountThreshold) { + int retainParsedRSDataRowCountThreshold, boolean isUpdatable) { this.id = id; this.sql = sql; this.maxRSRowsParsing = maxRSRowsParsing; this.retainParsedRSDataRowCountThreshold = retainParsedRSDataRowCountThreshold; + this.isUpdatable = isUpdatable; } @Override public QueryExecution run(MessageContext context) { - QueryExecution queryExecution = getServerDebugger(context).getStatementExecutor(id).execute(sql, maxRSRowsParsing, retainParsedRSDataRowCountThreshold); + QueryExecution queryExecution = getServerDebugger(context).getStatementExecutor(id).execute(sql, maxRSRowsParsing, retainParsedRSDataRowCountThreshold, isUpdatable); return new ClientStatementExecution(queryExecution); } }