1 24 25 package com.mckoi.tools; 26 27 import com.mckoi.jfccontrols.ResultSetTableModel; 28 import com.mckoi.jfccontrols.QueryAgent; 29 import com.mckoi.jfccontrols.Query; 30 import com.mckoi.util.CommandLine; 31 import java.sql.*; 32 import java.awt.*; 33 import java.awt.event.*; 34 import javax.swing.*; 35 import javax.swing.border.*; 36 37 43 44 public class JDBCQueryTool extends JComponent { 45 46 49 private QueryAgent query_agent; 50 51 54 private JTextArea query_text_area; 55 56 59 private JTable result_table; 60 61 64 private ResultSetTableModel table_model; 65 66 69 private JLabel status_text; 70 71 74 protected JCheckBoxMenuItem auto_resize_result_table; 75 76 79 private int total_row_count; 80 81 84 private int query_time = -1; 85 86 89 public JDBCQueryTool(QueryAgent in_query_agent) { 90 this.query_agent = in_query_agent; 91 92 94 96 auto_resize_result_table = new JCheckBoxMenuItem("Auto Resize Columns"); 97 auto_resize_result_table.setSelected(true); 98 auto_resize_result_table.addActionListener(new ActionListener() { 99 public void actionPerformed(ActionEvent evt) { 100 if (auto_resize_result_table.isSelected()) { 101 result_table.setAutoResizeMode( 102 JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); 103 } 104 else { 105 result_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 106 } 107 } 108 }); 109 110 112 setLayout(new BorderLayout()); 113 setBorder(new EmptyBorder(2, 2, 2, 2)); 114 115 JPanel query_area = new JPanel(); 116 query_area.setLayout(new BorderLayout()); 117 118 Font mono_font = new Font("MonoSpaced", Font.PLAIN, 12); 120 121 query_text_area = new JTextArea(7, 80); 123 query_text_area.setFont(mono_font); 124 125 final JButton execute = new JButton("Run Query"); 127 final JButton stop = new JButton("Stop Query"); 128 stop.setEnabled(false); 129 JPanel button_bar = new JPanel(); 130 button_bar.setLayout(new FlowLayout()); 131 button_bar.add(execute); 132 button_bar.add(stop); 133 134 query_area.add(new JScrollPane(query_text_area), BorderLayout.CENTER); 136 query_area.add(button_bar, BorderLayout.SOUTH); 137 138 table_model = new ResultSetTableModel(); 139 table_model.setPreserveTableStructure(true); 140 result_table = new JTable(table_model); 141 JScrollPane scrolly_result_table = new JScrollPane(result_table); 142 scrolly_result_table.setPreferredSize(new Dimension(650, 450)); 143 144 status_text = new JLabel(" "); 146 status_text.setFont(mono_font); 147 status_text.setBorder(new BevelBorder(BevelBorder.LOWERED)); 148 149 JSplitPane split_pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); 151 split_pane.setTopComponent(query_area); 152 split_pane.setBottomComponent(scrolly_result_table); 153 154 add(split_pane, BorderLayout.CENTER); 155 156 add(status_text, BorderLayout.SOUTH); 157 158 160 execute.addActionListener(new ActionListener() { 161 public void actionPerformed(ActionEvent evt) { 162 try { 163 164 stop.setEnabled(true); 165 execute.setEnabled(false); 166 167 Query query = new Query(query_text_area.getText()); 168 long time_start = System.currentTimeMillis(); 169 ResultSet result_set = query_agent.executeQuery(query); 170 query_time = (int) (System.currentTimeMillis() - time_start); 171 172 result_table.scrollRectToVisible(new Rectangle(0, 0, 1, 1)); 174 table_model.updateResultSet(result_set); 175 176 total_row_count = 0; 177 if (result_set.last()) { 178 total_row_count = result_set.getRow(); 179 } 180 updateStatus(); 181 182 } 183 catch (SQLException e) { 184 JOptionPane.showMessageDialog(JDBCQueryTool.this, 185 e.getMessage(), "SQL Error", JOptionPane.ERROR_MESSAGE); 186 e.printStackTrace(); 187 } 188 catch (InterruptedException e) { 189 System.err.println("Query cancelled."); 190 } 191 stop.setEnabled(false); 192 execute.setEnabled(true); 193 } 194 }); 195 196 stop.addActionListener(new ActionListener() { 197 public void actionPerformed(ActionEvent evt) { 198 query_agent.cancelQuery(); 199 } 200 }); 201 202 203 } 204 205 208 public JDBCQueryTool(Connection connection) { 209 this(new QueryAgent(connection)); 210 } 211 212 215 private void updateStatus() { 216 StringBuffer buf = new StringBuffer (); 217 buf.append("Query Time: "); 218 buf.append((double) query_time / 1000.0); 219 buf.append(" seconds. Row Count: "); 220 buf.append(total_row_count); 221 status_text.setText(new String (buf)); 222 } 223 224 226 229 private static int query_window_count = 0; 230 231 241 public static void createNewWindow(final Connection connection, 242 final boolean close_connection_on_close, 243 final boolean system_exit_on_close) { 244 ++query_window_count; 246 247 final QueryAgent query_agent = new QueryAgent(connection); 249 250 final JFrame frame = new JFrame("Mckoi JDBC Query Tool"); 252 253 final Action close_action = new AbstractAction("Exit") { 255 public void actionPerformed(ActionEvent evt) { 256 frame.dispose(); 257 --query_window_count; 259 if (query_window_count == 0) { 262 if (close_connection_on_close) { 263 try { 264 connection.close(); 265 } 266 catch (SQLException e) { 267 System.err.println("SQL Exception on close: " + 268 e.getMessage()); 269 } 270 } 271 if (system_exit_on_close) { 272 System.exit(0); 273 } 274 } 275 } 276 }; 277 278 final Action clone_action = new AbstractAction("New Window") { 280 public void actionPerformed(ActionEvent evt) { 281 createNewWindow(connection, 282 close_connection_on_close, system_exit_on_close); 283 } 284 }; 285 286 288 Container c = frame.getContentPane(); 289 c.setLayout(new BorderLayout()); 290 JDBCQueryTool query_tool = new JDBCQueryTool(query_agent); 291 c.add(query_tool, BorderLayout.CENTER); 292 293 JMenuBar menu_bar = new JMenuBar(); 295 JMenu file = new JMenu("File"); 296 file.add(clone_action); 297 file.addSeparator(); 298 file.add(close_action); 299 menu_bar.add(file); 300 301 JMenu options = new JMenu("Options"); 302 options.add(query_tool.auto_resize_result_table); 303 menu_bar.add(options); 304 305 frame.setJMenuBar(menu_bar); 306 307 frame.pack(); 309 frame.show(); 310 311 frame.addWindowListener(new WindowAdapter() { 313 public void windowClosing(WindowEvent evt) { 314 close_action.actionPerformed(null); 315 } 316 }); 317 318 } 319 320 323 private static void printSyntax() { 324 System.out.println("JDBCQueryTool [-jdbc JDBC_Driver_Class] [-url JDBC_URL] -u username -p password"); 325 } 326 327 330 public static void main(String [] args) { 331 CommandLine cl = new CommandLine(args); 332 333 String driver = cl.switchArgument("-jdbc", "com.mckoi.JDBCDriver"); 334 String url = cl.switchArgument("-url", "jdbc:mckoi:"); 335 String username = cl.switchArgument("-u"); 336 String password = cl.switchArgument("-p"); 337 338 if (username == null) { 339 System.out.println("Please provide a username"); 340 System.out.println(); 341 printSyntax(); 342 } 343 else if (password == null) { 344 System.out.println("Please provide a password"); 345 System.out.println(); 346 printSyntax(); 347 } 348 else { 349 350 try { 351 System.out.println("Using JDBC Driver: " + driver); 352 353 Class.forName(driver).newInstance(); 355 356 final Connection connection = 358 DriverManager.getConnection(url, username, password); 359 360 System.out.println("Connection established to: " + url); 361 362 SwingUtilities.invokeLater(new Runnable () { 364 public void run() { 365 createNewWindow(connection, true, true); 366 } 367 }); 368 369 } 370 catch (ClassNotFoundException e) { 371 System.out.println("JDBC Driver not found."); 372 } 373 catch (Exception e) { 374 e.printStackTrace(); 375 } 376 377 } 378 379 } 380 381 } 382 | Popular Tags |