# HG changeset patch # User František Kučera # Date 1389128099 -3600 # Node ID da1e38386d84096c277000e25c490ac9c386e0ec # Parent ecd17aad11781b873883c4ab680b5b61a886e715 Formatters: structural change – new level „statement“ → query and parameters are no more duplicated into each result set or updates result diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java --- a/java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java Tue Jan 07 21:54:59 2014 +0100 @@ -66,7 +66,11 @@ public void executeQuery(SQLCommand sqlCommand, Formatter formatter) throws SQLException { formatter.writeStartBatch(); formatter.writeStartDatabase(databaseDefinition); + formatter.writeStartStatement(); + formatter.writeQuery(sqlCommand.getQuery()); + formatter.writeParameters(sqlCommand.getParameters()); processCommand(sqlCommand, formatter); + formatter.writeEndStatement(); formatter.writeEndDatabase(); formatter.writeEndBatch(); } @@ -75,7 +79,12 @@ formatter.writeStartBatch(); formatter.writeStartDatabase(databaseDefinition); while (batch.hasNext()) { - processCommand(batch.next(), formatter); + SQLCommand sqlCommand = batch.next(); + formatter.writeStartStatement(); + formatter.writeQuery(sqlCommand.getQuery()); + formatter.writeParameters(sqlCommand.getParameters()); + processCommand(sqlCommand, formatter); + formatter.writeEndStatement(); } formatter.writeEndDatabase(); formatter.writeEndBatch(); @@ -90,19 +99,19 @@ log.log(Level.FINE, "Statement executed"); if (isRS) { try (ResultSet rs = ps.getResultSet()) { - processResultSet(sqlCommand, rs, formatter); + processResultSet(rs, formatter); } } else { - processUpdateResult(sqlCommand, ps, formatter); + processUpdateResult(ps, formatter); } logWarnings(ps); while (ps.getMoreResults() || ps.getUpdateCount() > -1) { ResultSet rs = ps.getResultSet(); if (rs == null) { - processUpdateResult(sqlCommand, ps, formatter); + processUpdateResult(ps, formatter); } else { - processResultSet(sqlCommand, rs, formatter); + processResultSet(rs, formatter); rs.close(); } logWarnings(ps); @@ -110,26 +119,13 @@ } } - private void processUpdateResult(SQLCommand sqlCommand, PreparedStatement ps, Formatter formatter) throws SQLException { - formatter.writeStartUpdatesResult(); - formatter.writeQuery(sqlCommand.getQuery()); - formatter.writeParameters(sqlCommand.getParameters()); - formatter.writeUpdatedRowsCount(ps.getUpdateCount()); - formatter.writeEndUpdatesResult(); + private void processUpdateResult(PreparedStatement ps, Formatter formatter) throws SQLException { + formatter.writeUpdatesResult(ps.getUpdateCount()); } - private void processResultSet(SQLCommand sqlCommand, ResultSet rs, Formatter formatter) throws SQLException { - formatter.writeStartResultSet(); - formatter.writeQuery(sqlCommand.getQuery()); - formatter.writeParameters(sqlCommand.getParameters()); + private void processResultSet(ResultSet rs, Formatter formatter) throws SQLException { + formatter.writeStartResultSet(new ColumnsHeader(rs.getMetaData())); - processResultSetRows(rs, formatter); - - formatter.writeEndResultSet(); - } - - private void processResultSetRows(ResultSet rs, Formatter formatter) throws SQLException { - formatter.writeColumnsHeader(new ColumnsHeader(rs.getMetaData())); int columnCount = rs.getMetaData().getColumnCount(); while (rs.next()) { @@ -142,6 +138,7 @@ formatter.writeEndRow(); } + formatter.writeEndResultSet(); } private void logWarnings(PreparedStatement ps) throws SQLException { diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java --- a/java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java Tue Jan 07 21:54:59 2014 +0100 @@ -77,7 +77,9 @@ formatter = f; formatter.writeStartBatch(); formatter.writeStartDatabase(new DatabaseDefinition()); + formatter.writeStartStatement(); showInfos(commands); + formatter.writeEndStatement(); formatter.writeEndDatabase(); formatter.writeEndBatch(); formatter.close(); @@ -201,8 +203,7 @@ } private void printTable(Formatter formatter, ColumnsHeader header, List data) throws ConfigurationException, FormatterException { - formatter.writeStartResultSet(); - formatter.writeColumnsHeader(header); + formatter.writeStartResultSet(header); for (Object[] row : data) { formatter.writeStartRow(); diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -46,25 +46,22 @@ * root * .batch * ..database - * ...resultSet + * ...statement * ....@query * ....@parameters - * ....@columnsHeader - * ....row - * .....@columnValue - * ...updatesResult - * ....@query - * ....@parameters - * ....@updatedRowsCount + * ....resultSet + * .....row + * ......@columnValue + * ....@updatesResult */ protected enum State { ROOT, BATCH, DATABASE, + STATEMENT, RESULT_SET, - ROW, - UPDATES_RESULT + ROW } /** @@ -142,20 +139,31 @@ } @Override - public void writeStartResultSet() { - pushState(State.RESULT_SET, EnumSet.of(State.DATABASE)); + public void writeStartStatement() { + pushState(State.STATEMENT, EnumSet.of(State.DATABASE)); + } + + @Override + public void writeEndStatement() { + popState(EnumSet.of(State.DATABASE)); + } + + @Override + public void writeStartResultSet(ColumnsHeader header) { + pushState(State.RESULT_SET, EnumSet.of(State.STATEMENT)); currentRowCount = 0; + currentColumnsHeader = header; } @Override public void writeEndResultSet() { - popState(EnumSet.of(State.DATABASE)); + popState(EnumSet.of(State.STATEMENT)); currentColumnsHeader = null; } @Override public void writeQuery(String sql) { - peekState(EnumSet.of(State.RESULT_SET, State.UPDATES_RESULT)); + peekState(EnumSet.of(State.STATEMENT)); if (currentColumnsHeader == null) { currentQuery = sql; @@ -166,7 +174,7 @@ @Override public void writeParameters(List parameters) { - peekState(EnumSet.of(State.RESULT_SET, State.UPDATES_RESULT)); + peekState(EnumSet.of(State.STATEMENT)); if (currentColumnsHeader != null) { throw new IllegalStateException("Parameters '" + parameters + "' must be set before columns header – was already set: " + currentColumnsHeader); @@ -178,17 +186,6 @@ } @Override - public void writeColumnsHeader(ColumnsHeader header) { - peekState(EnumSet.of(State.RESULT_SET)); - - if (currentColumnsHeader == null) { - currentColumnsHeader = header; - } else { - throw new IllegalStateException("Columns header can be set only once per result set – was already set: " + currentColumnsHeader); - } - } - - @Override public void writeStartRow() { pushState(State.ROW, EnumSet.of(State.RESULT_SET)); currentColumnsCount = 0; @@ -212,19 +209,8 @@ } @Override - public void writeStartUpdatesResult() { - pushState(State.UPDATES_RESULT, EnumSet.of(State.DATABASE)); - } - - @Override - public void writeEndUpdatesResult() { - popState(EnumSet.of(State.DATABASE)); - currentColumnsHeader = null; - } - - @Override - public void writeUpdatedRowsCount(int updatedRowsCount) { - peekState(EnumSet.of(State.UPDATES_RESULT)); + public void writeUpdatesResult(int updatedRowsCount) { + peekState(EnumSet.of(State.STATEMENT)); } @Override diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/Formatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/Formatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/Formatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -33,15 +33,17 @@ void writeEndDatabase(); - void writeStartResultSet(); + void writeStartStatement(); - void writeEndResultSet(); + void writeEndStatement(); void writeQuery(String sql); void writeParameters(List parameters); - void writeColumnsHeader(ColumnsHeader header); + void writeStartResultSet(ColumnsHeader header); + + void writeEndResultSet(); void writeStartRow(); @@ -49,11 +51,7 @@ void writeEndRow(); - void writeStartUpdatesResult(); - - void writeUpdatedRowsCount(int updatedRowsCount); - - void writeEndUpdatesResult(); + void writeUpdatesResult(int updatedRowsCount); void writeEndBatch(); diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/SingleValueFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/SingleValueFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/SingleValueFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -44,8 +44,8 @@ } @Override - public void writeUpdatedRowsCount(int updatedRowsCount) { - super.writeUpdatedRowsCount(updatedRowsCount); + public void writeUpdatesResult(int updatedRowsCount) { + super.writeUpdatesResult(updatedRowsCount); out.print(updatedRowsCount); out.flush(); } diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -57,14 +57,9 @@ } @Override - public void writeStartResultSet() { - super.writeStartResultSet(); + public void writeStartResultSet(ColumnsHeader header) { + super.writeStartResultSet(header); printResultSeparator(); - } - - @Override - public void writeColumnsHeader(ColumnsHeader header) { - super.writeColumnsHeader(header); initColumnWidths(header.getColumnCount()); @@ -227,14 +222,9 @@ } @Override - public void writeStartUpdatesResult() { - super.writeStartUpdatesResult(); + public void writeUpdatesResult(int updatedRowsCount) { + super.writeUpdatesResult(updatedRowsCount); printResultSeparator(); - } - - @Override - public void writeUpdatedRowsCount(int updatedRowsCount) { - super.writeUpdatedRowsCount(updatedRowsCount); out.print(TerminalColor.Red, "Updated records: "); out.println(updatedRowsCount); out.bell(); diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularPrefetchingFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularPrefetchingFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularPrefetchingFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -17,7 +17,6 @@ */ package info.globalcode.sql.dk.formatting; -import info.globalcode.sql.dk.Parameter; import java.util.ArrayList; import java.util.List; @@ -32,8 +31,6 @@ public class TabularPrefetchingFormatter extends TabularFormatter { public static final String NAME = "tabular-prefetching"; // bash-completion:formatter - private String currentSql; - private List currentParameters; private ColumnsHeader currentHeader; private List currentResultSet; private Object[] currentRow; @@ -54,22 +51,8 @@ } @Override - public void writeStartResultSet() { + public void writeStartResultSet(ColumnsHeader header) { currentResultSet = new ArrayList<>(); - } - - @Override - public void writeQuery(String sql) { - currentSql = sql; - } - - @Override - public void writeParameters(List parameters) { - currentParameters = parameters; - } - - @Override - public void writeColumnsHeader(ColumnsHeader header) { currentHeader = header; initColumnWidths(header.getColumnCount()); } @@ -99,10 +82,7 @@ public void writeEndResultSet() { prefetchDone = true; - super.writeStartResultSet(); - super.writeQuery(currentSql); - super.writeParameters(currentParameters); - super.writeColumnsHeader(currentHeader); + super.writeStartResultSet(currentHeader); for (Object[] row : currentResultSet) { super.writeStartRow(); @@ -113,8 +93,6 @@ } currentColumnsCount = 0; - currentSql = null; - currentParameters = null; currentHeader = null; currentRow = null; currentResultSet = null; diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -38,8 +38,8 @@ } @Override - public void writeColumnsHeader(ColumnsHeader header) { - super.writeColumnsHeader(header); + public void writeStartResultSet(ColumnsHeader header) { + super.writeStartResultSet(header); currentRow = new ArrayList<>(header.getColumnCount()); } @@ -48,7 +48,7 @@ boolean rightAlign = value instanceof Number || value instanceof Boolean; String valueString = String.valueOf(value); int columnWidth = getColumnWidth(getCurrentColumnsCount()) - 1; // -1 = space for new line symbol - currentRow.add(split(valueString, columnWidth, rightAlign)); + currentRow.add(wrapLines(valueString, columnWidth, rightAlign)); } @Override @@ -99,7 +99,7 @@ // already done – wrapped row ends } - private static String[] split(String s, int width, boolean rightAlign) { + private static String[] wrapLines(String s, int width, boolean rightAlign) { String[] array = new String[(s.length() - 1) / width + 1]; for (int i = 0; i < array.length; i++) { if (i == array.length - 1) { diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -46,6 +46,7 @@ public static final String NAME = "xhtml"; // bash-completion:formatter private static final String DOCTYPE = "html PUBLIC \"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN\" \"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd\""; private static final String CSS_FILE = "info/globalcode/sql/dk/formatter/XhtmlFormatter.css"; + private int statementCounter = 0; private int resultSetCounter = 0; private int updatesResultCounter = 0; @@ -115,7 +116,6 @@ @Override public void writeQuery(String sql) { super.writeQuery(sql); - printTextElement(qname("h3"), null, "SQL:"); printTextElement(qname("pre"), null, sql); } @@ -199,9 +199,11 @@ } @Override - public void writeColumnsHeader(ColumnsHeader header) { - super.writeColumnsHeader(header); - printTextElement(qname("h3"), null, "Data:"); + public void writeStartResultSet(ColumnsHeader header) { + super.writeStartResultSet(header); + resultSetCounter++; + printEmptyElement(qname("hr"), null); + printTextElement(qname("h3"), null, "Result set #" + resultSetCounter); printStartElement(qname("table")); printStartElement(qname("thead")); printStartElement(qname("tr")); @@ -216,6 +218,14 @@ } @Override + public void writeEndResultSet() { + super.writeEndResultSet(); + printEndElement(); + printEndElement(); + printTextElement(qname("p"), null, "Record count: " + getCurrentRowCount()); + } + + @Override public void writeStartRow() { super.writeStartRow(); printStartElement(qname("tr")); @@ -234,33 +244,21 @@ } @Override - public void writeStartResultSet() { - super.writeStartResultSet(); - resultSetCounter++; + public void writeStartStatement() { + super.writeStartStatement(); + statementCounter++; printEmptyElement(qname("hr"), null); - printTextElement(qname("h2"), null, "Result set #" + resultSetCounter); + printTextElement(qname("h2"), null, "SQL statement #" + statementCounter); + resultSetCounter = 0; + updatesResultCounter = 0; } @Override - public void writeEndResultSet() { - super.writeEndResultSet(); - printEndElement(); - printEndElement(); - - printTextElement(qname("p"), null, "Record count: " + getCurrentRowCount()); - } - - @Override - public void writeStartUpdatesResult() { - super.writeStartUpdatesResult(); + public void writeUpdatesResult(int updatedRowsCount) { + super.writeUpdatesResult(updatedRowsCount); updatesResultCounter++; printEmptyElement(qname("hr"), null); - printTextElement(qname("h2"), null, "Updates result #" + updatesResultCounter); - } - - @Override - public void writeUpdatedRowsCount(int updatedRowsCount) { - super.writeUpdatedRowsCount(updatedRowsCount); + printTextElement(qname("h3"), null, "Updates result #" + updatesResultCounter); printTextElement(qname("p"), null, "Updated rows: " + updatedRowsCount); } } diff -r ecd17aad1178 -r da1e38386d84 java/sql-dk/src/info/globalcode/sql/dk/formatting/XmlFormatter.java --- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/XmlFormatter.java Tue Jan 07 21:53:24 2014 +0100 +++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/XmlFormatter.java Tue Jan 07 21:54:59 2014 +0100 @@ -71,14 +71,14 @@ } @Override - public void writeStartResultSet() { - super.writeStartResultSet(); - printStartElement(qname("resultSet")); + public void writeStartStatement() { + super.writeStartStatement(); + printStartElement(qname("statement")); } @Override - public void writeEndResultSet() { - super.writeEndResultSet(); + public void writeEndStatement() { + super.writeEndStatement(); printEndElement(); } @@ -106,8 +106,9 @@ } @Override - public void writeColumnsHeader(ColumnsHeader header) { - super.writeColumnsHeader(header); + public void writeStartResultSet(ColumnsHeader header) { + super.writeStartResultSet(header); + printStartElement(qname("resultSet")); for (ColumnDescriptor cd : header.getColumnDescriptors()) { Map attributes = new LinkedHashMap<>(4); @@ -120,6 +121,12 @@ } @Override + public void writeEndResultSet() { + super.writeEndResultSet(); + printEndElement(); + } + + @Override public void writeStartRow() { super.writeStartRow(); printStartElement(qname("row")); @@ -145,23 +152,11 @@ } @Override - public void writeStartUpdatesResult() { - super.writeStartUpdatesResult(); - printStartElement(qname("updatesResult")); - } - - @Override - public void writeUpdatedRowsCount(int updatedRowsCount) { - super.writeUpdatedRowsCount(updatedRowsCount); + public void writeUpdatesResult(int updatedRowsCount) { + super.writeUpdatesResult(updatedRowsCount); printTextElement(qname("updatedRows"), null, String.valueOf(updatedRowsCount)); } - @Override - public void writeEndUpdatesResult() { - super.writeEndUpdatesResult(); - printEndElement(); - } - protected String toString(Object value) { return String.valueOf(value); }