1 package net.argius.stew.command;
6 import net.argius.stew.*;
9 * The Find command used to search table names.
10 * @see DatabaseMetaData#getTables(String, String, String, String[])
12 public final class Find extends Command {
14 private static final Logger log = Logger.getLogger(Find.class);
17 public void execute(Connection conn, Parameter parameter) throws CommandException {
19 ResultSetReference ref = getResult(conn, parameter);
22 outputMessage("i.selected", ref.getRecordCount());
24 ref.getResultSet().close();
26 } catch (SQLException ex) {
27 throw new CommandException(ex);
31 ResultSetReference getResult(Connection conn, Parameter p) throws SQLException {
33 throw new UsageException(getUsage());
35 final String p1 = p.at(1);
36 final String p2 = p.at(2);
37 final String p3 = p.at(3);
38 final String p4 = p.at(4);
39 final String p5 = p.at(5);
40 DatabaseMetaData dbmeta = conn.getMetaData();
41 final String tableNamePattern = editNamePattern(p1);
42 final String[] tableTypes = editTableType(p2);
43 final String schemaNamePattern = editNamePattern(p3);
44 final String catalogNamePattern = editNamePattern(p4);
45 final boolean isFull = p5.equalsIgnoreCase("FULL");
46 if (log.isDebugEnabled()) {
47 log.debug("name : " + tableNamePattern);
48 log.debug("types : " + (tableTypes == null ? null : Arrays.asList(tableTypes)));
49 log.debug("schema : " + schemaNamePattern);
50 log.debug("catalog: " + catalogNamePattern);
51 log.debug("full? : " + isFull);
53 ResultSet rs = dbmeta.getTables(catalogNamePattern,
58 ResultSetReference ref = new ResultSetReference(rs, p.asString());
60 ColumnOrder order = ref.getOrder();
61 order.addOrder(3, getColumnName("name"));
62 order.addOrder(4, getColumnName("type"));
63 order.addOrder(2, getColumnName("schema"));
64 order.addOrder(1, getColumnName("catalog"));
67 } catch (Throwable th) {
69 if (th instanceof SQLException) {
70 throw (SQLException)th;
71 } else if (th instanceof RuntimeException) {
72 throw (RuntimeException)th;
74 throw new CommandException(th);
79 public boolean isReadOnly() {
83 private static String getColumnName(String key) {
84 return getMessage("Find.label." + key);
87 private static String[] editTableType(String pattern) {
88 if (pattern == null || pattern.trim().length() == 0 || pattern.equals("*")) {
91 return pattern.toUpperCase().split(",");
94 private String editNamePattern(String pattern) throws SQLException {
95 if (pattern == null || pattern.trim().length() == 0) {
97 } else if (pattern.equals("''") || pattern.equals("\"\"")) {
100 final String edited = convertPattern(pattern);
101 if (log.isDebugEnabled()) {
102 log.debug("table-name-condition : " + edited);