6d89af5c293c6dbf237e3f8dadf7b170013c7bb7
[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                         
65                         pw.println("----------------------------------");
66                         for (int idx = 1; idx <= cols.length; ++idx) {
67                                 pw.print("|" + cols[idx - 1].getLabel());
68                         }
69                         pw.println("|");
70                         
71                         while (rs.next()) {
72                                 for (int idx = 1; idx <= cols.length; ++idx) {
73                                         pw.print("|" + rs.getObject(idx));
74                                 }
75                                 pw.println("|");
76                         }
77                         pw.println("----------------------------------");
78                         pw.println("" + rowCount + " row(s) returned.");
79                         
80                         return rowCount;
81                 }
82                 catch (ClassNotFoundException exc) {
83                         throw new SQLException(exc);
84                 }
85         }
86 }