Add "Describe" command, with support for describing both (a) specific table(s) and...
[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.SQLException;
9 import java.util.Locale;
10
11 import net.jaekl.squelch.db.DbDriver;
12
13 public class Select extends Query {
14
15         @Override
16         public boolean handles(String line) {
17                 if (null == line) {
18                         return false;
19                 }
20                 
21                 String s = line.trim().toUpperCase(Locale.CANADA);
22                 return (s.startsWith("SELECT "));
23         }
24
25         @Override
26         public int exec(DbDriver driver, Connection conn, PrintWriter pw, String line) throws IOException, SQLException 
27         {
28                 int rowCount = 0;
29                 
30                 // If there's a ';' on the end of this line, remove it.
31                 String trimmed = line.trim();
32                 if (trimmed.endsWith(";")) {
33                         trimmed = trimmed.substring(0, trimmed.length() - 1);
34                 }
35                 
36                 try (PreparedStatement ps = conn.prepareStatement(trimmed)) 
37                 {
38                         try (ResultSet rs = ps.executeQuery()) 
39                         {
40                                 rowCount = printFormatted(pw, rs);              
41                         }
42                 }
43                 return rowCount;
44         }
45         
46         private int printFormatted(PrintWriter pw, ResultSet rs) throws IOException, SQLException
47         {
48                 TabularResultSet trs = new TabularResultSet(rs);
49                 // TODO:  StringTable i18n
50                 int rowCount = trs.printTable(pw, "No rows returned.");
51                 pw.flush();
52                 
53                 return rowCount;
54         }
55 }