Formatters: structural change – new level „statement“ → query and parameters are no more duplicated into each result set or updates result v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 07 Jan 2014 21:54:59 +0100
branchv_0
changeset 142 da1e38386d84
parent 141 ecd17aad1178
child 143 1336bb9a4499
Formatters: structural change – new level „statement“ → query and parameters are no more duplicated into each result set or updates result
java/sql-dk/src/info/globalcode/sql/dk/DatabaseConnection.java
java/sql-dk/src/info/globalcode/sql/dk/InfoLister.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/Formatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/SingleValueFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularPrefetchingFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularWrappingFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java
java/sql-dk/src/info/globalcode/sql/dk/formatting/XmlFormatter.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 {
--- 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<Object[]> data) throws ConfigurationException, FormatterException {
-		formatter.writeStartResultSet();
-		formatter.writeColumnsHeader(header);
+		formatter.writeStartResultSet(header);
 
 		for (Object[] row : data) {
 			formatter.writeStartRow();
--- 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<? extends Parameter> 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
--- 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<? extends Parameter> 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();
 
--- 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();
 	}
--- 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();
--- 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<? extends Parameter> currentParameters;
 	private ColumnsHeader currentHeader;
 	private List<Object[]> 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<? extends Parameter> 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;
--- 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) {
--- 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);
 	}
 }
--- 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<QName, String> 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);
 	}