// Purpose. Retrieve and format query results and column labels and widths // Source. Flanagan97b, pp329-330 static void printResultsTable( ResultSet rs, OutputStream output ) throws SQLException { ResultSetMetaData metadata = rs.getMetaData(); PrintWriter out = new PrintWriter( new OutputStreamWriter(output) ); int numcols = metadata.getColumnCount(); // how many columns String[] labels = new String[numcols]; // the column labels int[] colwidths = new int[numcols]; // the width of each int[] colpos = new int[numcols]; // start position of each int linewidth; // total width of table linewidth = 1; // for the initial '|' for (int i = 0; i < numcols; i++) { // for each column colpos[i] = linewidth; // save its position labels[i] = metadata.getColumnLabel(i+1); // get its label int size = metadata.getColumnDisplaySize(i+1); if (size == -1) size = 30; // some drivers return -1 int labelsize = labels[i].length(); // get the label's length if (labelsize > size) size = labelsize; // remember the largest length colwidths[i] = size + 1; // save the column size linewidth += colwidths[i] + 2; // increment total size } StringBuffer divider = new StringBuffer( linewidth ); StringBuffer blankline = new StringBuffer( linewidth ); for (int i = 0; i < linewidth; i++) { divider.insert( i, '-' ); blankline.insert( i, " " ); } for (int i=0; i < numcols; i++) divider.setCharAt( colpos[i]-1, '+' ); divider.setCharAt( linewidth-1, '+' ); out.println( divider ); StringBuffer line = new StringBuffer( blankline.toString() ); line.setCharAt(0, '|'); for (int i = 0; i < numcols; i++) { int pos = colpos[i] + 1 + (colwidths[i]-labels[i].length()) / 2; overwrite( line, pos, labels[i] ); overwrite( line, colpos[i] + colwidths[i], " |" ); } out.println( line ); out.println( divider ); while (rs.next()) { line = new StringBuffer( blankline.toString() ); line.setCharAt( 0, '|' ); for (int i = 0; i < numcols; i++) { Object value = rs.getObject( i+1 ); overwrite( line, colpos[i] + 1, value.toString().trim() ); overwrite( line, colpos[i] + colwidths[i], " |" ); } out.println( line ); } out.println( divider ); out.flush(); } static void overwrite( StringBuffer b, int pos, String s ) { int len = s.length(); for (int i = 0; i < len; i++) b.setCharAt( pos+i, s.charAt(i) ); }