OSDN Git Service

new repository
[stew/Stew4.git] / src / net / argius / stew / command / Find.java
1 package net.argius.stew.command;
2
3 import java.sql.*;
4 import java.util.*;
5
6 import net.argius.stew.*;
7
8 /**
9  * The Find command used to search table names.
10  * @see DatabaseMetaData#getTables(String, String, String, String[])
11  */
12 public final class Find extends Command {
13
14     private static final Logger log = Logger.getLogger(Find.class);
15
16     @Override
17     public void execute(Connection conn, Parameter parameter) throws CommandException {
18         try {
19             ResultSetReference ref = getResult(conn, parameter);
20             try {
21                 output(ref);
22                 outputMessage("i.selected", ref.getRecordCount());
23             } finally {
24                 ref.getResultSet().close();
25             }
26         } catch (SQLException ex) {
27             throw new CommandException(ex);
28         }
29     }
30
31     ResultSetReference getResult(Connection conn, Parameter p) throws SQLException {
32         if (!p.has(1)) {
33             throw new UsageException(getUsage());
34         }
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);
52         }
53         ResultSet rs = dbmeta.getTables(catalogNamePattern,
54                                         schemaNamePattern,
55                                         tableNamePattern,
56                                         tableTypes);
57         try {
58             ResultSetReference ref = new ResultSetReference(rs, p.asString());
59             if (!isFull) {
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"));
65             }
66             return ref;
67         } catch (Throwable th) {
68             rs.close();
69             if (th instanceof SQLException) {
70                 throw (SQLException)th;
71             } else if (th instanceof RuntimeException) {
72                 throw (RuntimeException)th;
73             }
74             throw new CommandException(th);
75         }
76     }
77
78     @Override
79     public boolean isReadOnly() {
80         return true;
81     }
82
83     private static String getColumnName(String key) {
84         return getMessage("Find.label." + key);
85     }
86
87     private static String[] editTableType(String pattern) {
88         if (pattern == null || pattern.trim().length() == 0 || pattern.equals("*")) {
89             return null;
90         }
91         return pattern.toUpperCase().split(",");
92     }
93
94     private String editNamePattern(String pattern) throws SQLException {
95         if (pattern == null || pattern.trim().length() == 0) {
96             return null;
97         } else if (pattern.equals("''") || pattern.equals("\"\"")) {
98             return "";
99         }
100         final String edited = convertPattern(pattern);
101         if (log.isDebugEnabled()) {
102             log.debug("table-name-condition : " + edited);
103         }
104         return edited;
105     }
106
107 }