package thaw.plugins; import java.awt.BorderLayout; import java.awt.Font; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import thaw.core.Core; import thaw.core.I18n; import thaw.core.Logger; import thaw.core.Plugin; public class SqlConsole implements Plugin, java.awt.event.ActionListener { public final static int MAX_LINE = 512; private String[] buffer; private String currentLine; /* line in construction (added to buffer when \n is added) */ private int readOffset; private int writeOffset; private Core core; private Hsqldb hsqldb; private JPanel panel; private JTextArea sqlArea; private JScrollPane sqlAreaScrollPane; private JTextField commandField; private JButton sendButton; public SqlConsole() { } public boolean run(final Core core) { buffer = new String[MAX_LINE+1]; currentLine = ""; readOffset = 0; writeOffset = 0; this.core = core; if(core.getPluginManager().getPlugin("thaw.plugins.Hsqldb") == null) { Logger.info(this, "Loading Hsqldb plugin"); if(core.getPluginManager().loadPlugin("thaw.plugins.Hsqldb") == null || !core.getPluginManager().runPlugin("thaw.plugins.Hsqldb")) { Logger.error(this, "Unable to load thaw.plugins.Hsqldb !"); return false; } } hsqldb = (Hsqldb)core.getPluginManager().getPlugin("thaw.plugins.Hsqldb"); hsqldb.registerChild(this); panel = getPanel(); core.getMainWindow().addTab(I18n.getMessage("thaw.plugin.hsqldb.console"), thaw.gui.IconBox.terminal, panel); return true; } public void stop() { core.getMainWindow().removeTab(panel); if (hsqldb != null) hsqldb.unregisterChild(this); } public String getNameForUser() { return I18n.getMessage("thaw.plugin.hsqldb.console"); } protected JPanel getPanel() { JPanel panel; JPanel subPanel; panel = new JPanel(); panel.setLayout(new BorderLayout()); subPanel = new JPanel(); subPanel.setLayout(new BorderLayout()); sqlArea = new JTextArea(""); sqlArea.setEditable(false); sqlArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); commandField = new JTextField(""); commandField.addActionListener(this); sendButton = new JButton(" Ok "); sendButton.addActionListener(this); subPanel.add(commandField, BorderLayout.CENTER); subPanel.add(sendButton, BorderLayout.EAST); sqlAreaScrollPane = new JScrollPane(sqlArea); panel.add(sqlAreaScrollPane, BorderLayout.CENTER); panel.add(subPanel, BorderLayout.SOUTH); return panel; } public void addToConsole(final String txt) { currentLine += txt; if (txt.endsWith("\n")) { buffer[writeOffset] = currentLine; currentLine = ""; writeOffset++; if (writeOffset == MAX_LINE) writeOffset = 0; if (writeOffset == readOffset) { readOffset++; if (readOffset == MAX_LINE) readOffset = 0; } } } public synchronized void refreshDisplay() { int i; String res = ""; for (i = readOffset ; ; i++) { if (buffer[i] != null) res += buffer[i]; if ( (readOffset-1 > 0 && i == readOffset-2) || (readOffset-1 <= 0 && i == MAX_LINE)) break; if (i == MAX_LINE) i = 0; } sqlArea.setText(res); sqlAreaScrollPane.getVerticalScrollBar().setValue(sqlAreaScrollPane.getVerticalScrollBar().getMaximum()); } public synchronized void flushBuffer() { int i; for (i = 0 ; i < MAX_LINE + 1; i++) { buffer[i] = null; } } public void actionPerformed(final java.awt.event.ActionEvent e) { sendCommand(commandField.getText()); commandField.setText(""); refreshDisplay(); } protected void display(String txt, int lng) { if(txt == null) txt = "(null)"; final int txtLength = txt.length(); String fTxt = txt; if(lng > 30) lng = 30; for(int i = 0 ; i + txtLength < lng; i++) { fTxt = fTxt + " "; } addToConsole(fTxt); } protected void printHelp() { addToConsole("Non-SQL commands:\n"); addToConsole(" - 'list_tables' : List all the tables\n"); addToConsole(" - 'drop_tables' : Drop all the known tables\n\n"); addToConsole("Some useful Hsqldb comments:\n"); addToConsole(" - 'checkpoint defrag' : Remove the empty spaces in the db on the disk\n"); } public synchronized void sendCommand(String cmd) { if ("clear".equals(cmd.toLowerCase())) { flushBuffer(); return; } if ("refresh".equals(cmd.toLowerCase())) { refreshDisplay(); } /* A simple reminder :) */ if("list_tables".equals( cmd.toLowerCase() )) cmd = "SELECT * FROM INFORMATION_SCHEMA.SYSTEM_TABLES"; addToConsole("\n"); addToConsole("> "+cmd+"\n"); addToConsole("\n"); try { if ("help".equals(cmd.toLowerCase())) { printHelp(); return; } if("reconnect".equals( cmd.toLowerCase() )) { hsqldb.connect(); addToConsole("Ok\n"); return; } synchronized(hsqldb.dbLock) { final java.sql.Statement st = hsqldb.getConnection().createStatement(); ResultSet result; if(!"drop_tables".equals( cmd.toLowerCase() )) { if(st.execute(cmd)) result = st.getResultSet(); else { addToConsole("Ok\n"); st.close(); return; } } else { thaw.plugins.index.DatabaseManager.dropTables(hsqldb); thaw.plugins.TransferLogs.dropTables(hsqldb); addToConsole("Ok\n"); st.close(); return; } if(result == null) { addToConsole("(null)\n"); st.close(); return; } if(result.getFetchSize() == 0) { addToConsole("(done)\n"); st.close(); return; } java.sql.SQLWarning warning = result.getWarnings(); while(warning != null) { addToConsole("Warning: "+warning.toString()); warning = warning.getNextWarning(); } final ResultSetMetaData metadatas = result.getMetaData(); final int nmbCol = metadatas.getColumnCount(); addToConsole(" "); for(int i = 1; i <= nmbCol ; i++) { display(metadatas.getColumnLabel(i), metadatas.getColumnDisplaySize(i)); addToConsole(" "); } addToConsole("\n"); addToConsole(" "); for(int i = 1; i <= nmbCol ; i++) { display(metadatas.getColumnTypeName(i), metadatas.getColumnDisplaySize(i)); addToConsole(" "); } addToConsole("\n"); addToConsole(" "); for(int i = 1; i <= nmbCol ; i++) { display("----", metadatas.getColumnDisplaySize(i)); addToConsole(" "); } addToConsole("\n"); boolean ret = true; while(ret) { ret = result.next(); if(!ret) break; display(Integer.toString(result.getRow()), 4); addToConsole(" "); for(int i =1; i <= nmbCol ; i++) { display(result.getString(i), metadatas.getColumnDisplaySize(i)); addToConsole(" "); } addToConsole("\n"); } st.close(); } } catch(final java.sql.SQLException e) { addToConsole("SQLException : "+e.toString()+" : "+e.getCause()+"\n"); } } public javax.swing.ImageIcon getIcon() { return thaw.gui.IconBox.terminal; } }