088181a50662c1015d0f1a936a29730e2bbfe531
[squelch.git] / src / main / java / net / jaekl / squelch / stmt / Select.java
1 package net.jaekl.squelch.stmt;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.sql.Connection;
6 import java.sql.PreparedStatement;
7 import java.sql.ResultSet;
8 import java.sql.ResultSetMetaData;
9 import java.sql.SQLException;
10 import java.util.Locale;
11
12 import net.jaekl.squelch.sql.Column;
13
14 public class Select extends Query {
15
16         @Override
17         public boolean handles(String line) {
18                 if (null == line) {
19                         return false;
20                 }
21                 
22                 String s = line.trim().toUpperCase(Locale.CANADA);
23                 return (s.startsWith("SELECT "));
24         }
25
26         @Override
27         public int exec(Connection conn, PrintWriter pw, String line) throws IOException, SQLException 
28         {
29                 int rowCount = 0;
30                 
31                 try (PreparedStatement ps = conn.prepareStatement(line)) 
32                 {
33                         try (ResultSet rs = ps.executeQuery()) 
34                         {
35                                 rowCount = printFormatted(pw, rs);
36                                 
37                         }
38                 }
39                 return rowCount;
40         }
41
42         private Column[] getColumns(ResultSetMetaData metaData) 
43                         throws SQLException, ClassNotFoundException 
44         {
45                 int colCount = metaData.getColumnCount();
46                 
47                 Column cols[] = new Column[colCount];
48                 for (int idx = 1; idx <= colCount; ++idx) {
49                         String label = metaData.getColumnLabel(idx);
50                         Class<?> clazz = Class.forName(metaData.getColumnTypeName(idx));
51                         int width = metaData.getColumnDisplaySize(idx);
52                         cols[idx] = new Column(label, clazz, width);
53                 }
54                 
55                 return cols;
56         }
57
58         private int printFormatted(PrintWriter pw, ResultSet rs) throws IOException, SQLException
59         {
60                 try {
61                         ResultSetMetaData metaData = rs.getMetaData();
62                         int rowCount = 0;
63                         Column[] cols = getColumns(metaData);
64                         StringBuilder sb = new StringBuilder();
65                         sb.append("----------------------------------\n");
66                         for (int idx = 1; idx <= cols.length; ++idx) {
67                                 sb.append("|" + cols[idx - 1].getLabel());
68                         }
69                         sb.append("|\n");
70                         String header = sb.toString();
71                         
72                         while (rs.next()) {
73                                 if (null != header) {
74                                         pw.print(header);
75                                         header = null;
76                                 }
77                                 
78                                 for (int idx = 1; idx <= cols.length; ++idx) {
79                                         pw.print("|" + rs.getObject(idx));
80                                 }
81                                 pw.println("|");
82                         }
83                         if (rowCount > 0) {
84                                 pw.println("----------------------------------");
85                         }
86                         pw.println("" + rowCount + " row(s) returned.");
87                         
88                         return rowCount;
89                 }
90                 catch (ClassNotFoundException exc) {
91                         throw new SQLException(exc);
92                 }
93         }
94 }