--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/AbstractFormatter.java Mon Dec 23 12:16:22 2013 +0100
@@ -202,6 +202,17 @@
}
}
+ /**
+ * @param value from ResultSet
+ * @return String representation of given value
+ */
+ protected String toString(Object value) {
+ /**
+ * TODO: basic formatting: boolean, null, date, numbers…
+ */
+ return String.valueOf(value);
+ }
+
@Override
public void writeStartUpdatesResult() {
pushState(State.UPDATES_RESULT, EnumSet.of(State.DATABASE));
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnDescriptor.java Mon Dec 23 12:16:22 2013 +0100
@@ -29,6 +29,7 @@
private String typeName;
private boolean firstColumn;
private boolean lastColumn;
+ private int columnNumber;
/**
* @return column name
@@ -84,4 +85,15 @@
public void setLastColumn(boolean lastColumn) {
this.lastColumn = lastColumn;
}
+
+ /**
+ * @return number of this column, 1 = first
+ */
+ public int getColumnNumber() {
+ return columnNumber;
+ }
+
+ public void setColumnNumber(int columnNumber) {
+ this.columnNumber = columnNumber;
+ }
}
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/ColumnsHeader.java Mon Dec 23 12:16:22 2013 +0100
@@ -27,13 +27,13 @@
* @author Ing. František Kučera (frantovo.cz)
*/
public class ColumnsHeader {
-
+
private ResultSetMetaData metaData;
-
+
public ColumnsHeader(ResultSetMetaData metaData) {
this.metaData = metaData;
}
-
+
public int getColumnCount() {
try {
return metaData.getColumnCount();
@@ -41,16 +41,19 @@
throw new IllegalStateException("Error during getting column count.", e);
}
}
-
+
public List<ColumnDescriptor> getColumnDescriptors() {
try {
int count = metaData.getColumnCount();
List<ColumnDescriptor> list = new ArrayList<>(count);
-
+
for (int i = 1; i <= count; i++) {
ColumnDescriptor cd = new ColumnDescriptor();
+
cd.setFirstColumn(i == 1);
cd.setLastColumn(i == count);
+ cd.setColumnNumber(i);
+
cd.setLabel(metaData.getColumnLabel(i));
cd.setName(metaData.getColumnName(i));
cd.setType(metaData.getColumnType(i));
@@ -58,7 +61,7 @@
/** TODO: more properties */
list.add(cd);
}
-
+
return list;
} catch (SQLException e) {
throw new IllegalStateException("Error during building column descriptors.", e);
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Mon Dec 23 11:52:49 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/TabularFormatter.java Mon Dec 23 12:16:22 2013 +0100
@@ -19,6 +19,8 @@
import info.globalcode.sql.dk.ColorfulPrintWriter;
import static info.globalcode.sql.dk.ColorfulPrintWriter.*;
+import static info.globalcode.sql.dk.Functions.lpad;
+import static info.globalcode.sql.dk.Functions.rpad;
/**
*
@@ -27,8 +29,11 @@
public class TabularFormatter extends AbstractFormatter {
public static final String NAME = "tabular";
+ private static final String HEADER_TYPE_PREFIX = " (";
+ private static final String HEADER_TYPE_SUFFIX = ")";
private ColorfulPrintWriter out;
private boolean firstResult = true;
+ private int[] columnWidth;
public TabularFormatter(FormatterContext formatterContext) {
super(formatterContext);
@@ -45,14 +50,18 @@
public void writeColumnsHeader(ColumnsHeader header) {
super.writeColumnsHeader(header);
+ columnWidth = new int[header.getColumnCount()];
+
for (ColumnDescriptor cd : header.getColumnDescriptors()) {
out.print(TerminalStyle.Bright, cd.getLabel());
- out.print(" (");
+ out.print(HEADER_TYPE_PREFIX);
out.print(cd.getTypeName());
- out.print(")");
+ out.print(HEADER_TYPE_SUFFIX);
if (!cd.isLastColumn()) {
out.print(TerminalColor.Green, " | ");
}
+
+ setColumnWidth(cd.getColumnNumber(), cd.getLabel().length() + cd.getTypeName().length() + HEADER_TYPE_PREFIX.length() + HEADER_TYPE_SUFFIX.length());
}
out.println();
out.flush();
@@ -66,7 +75,31 @@
out.print(TerminalColor.Green, " | ");
}
- out.print(TerminalColor.Cyan, String.valueOf(value));
+ out.print(TerminalColor.Cyan, toString(value));
+ }
+
+ private int getColumnWidth(int columnNumber) {
+ return columnWidth[columnNumber - 1];
+ }
+
+ private void setColumnWidth(int columnNumber, int width) {
+ columnWidth[columnNumber - 1] = width;
+ }
+
+ private void updateColumnWidth(int columnNumber, int width) {
+ int oldWidth = getColumnWidth(columnNumber);
+ setColumnWidth(columnNumber, Math.max(width, oldWidth));
+
+ }
+
+ @Override
+ protected String toString(Object value) {
+ final int width = getColumnWidth(getCurrentColumnsCount());
+ if (value instanceof Number) {
+ return lpad(super.toString(value), width);
+ } else {
+ return rpad(super.toString(value), width);
+ }
}
@Override