1 14 package org.compiere.apps.form; 15 16 import java.awt.*; 17 import java.awt.event.*; 18 19 import javax.swing.*; 20 import java.sql.*; 21 import java.util.StringTokenizer ; 22 23 import org.compiere.apps.*; 24 import org.compiere.grid.ed.*; 25 import org.compiere.swing.*; 26 import org.compiere.util.*; 27 28 34 public class VSQLProcess extends JPanel 35 implements FormPanel, ActionListener 36 { 37 40 public VSQLProcess() 41 { 42 } 44 49 public void init (int WindowNo, FormFrame frame) 50 { 51 Log.trace(Log.l1_User, "VSQLProcess.init"); 52 m_WindowNo = WindowNo; 53 m_frame = frame; 54 try 55 { 56 jbInit(); 57 frame.getContentPane().add(this, BorderLayout.CENTER); 58 } 60 catch(Exception e) 61 { 62 Log.error("VSQLProcess.init", e); 63 } 64 } 66 67 private int m_WindowNo = 0; 68 69 private FormFrame m_frame; 70 71 72 private static Logger s_log = Logger.getCLogger(VSQLProcess.class); 73 74 75 private static final String [] DML_KEYWORDS = new String []{ 76 "SELECT", "UPDATE", "DELETE", "TRUNCATE" 77 }; 78 79 private BorderLayout mainLayout = new BorderLayout(); 80 private CPanel northPanel = new CPanel(); 81 private CLabel sqlLabel = new CLabel("SQL"); 82 private VText sqlField = new VText("SQL", false, false, true, 3000, 9000); 83 private JPanel centerPanel = new JPanel(); 84 private BorderLayout centerLayout = new BorderLayout(); 85 private BorderLayout northLayout = new BorderLayout(); 86 private CText resultField = new CText(20,60); 87 private CButton sqlButton = ConfirmPanel.createProcessButton(true); 88 89 93 void jbInit() throws Exception 94 { 95 this.setLayout(mainLayout); 96 mainLayout.setHgap(5); 97 mainLayout.setVgap(5); 98 this.add(northPanel, BorderLayout.NORTH); 100 northLayout.setHgap(5); 101 northLayout.setVgap(5); 102 northPanel.setLayout(northLayout); 103 sqlLabel.setText("SQL"); 104 northPanel.add(sqlLabel, BorderLayout.WEST); 105 northPanel.add(sqlField, BorderLayout.CENTER); 107 sqlButton.addActionListener(this); 108 northPanel.add(sqlButton, BorderLayout.EAST); 109 this.add(centerPanel, BorderLayout.CENTER); 111 centerPanel.setLayout(centerLayout); 112 centerLayout.setHgap(0); 113 resultField.setReadWrite(false); 114 centerPanel.add(resultField, BorderLayout.CENTER); 115 } 117 121 public void actionPerformed(ActionEvent e) 122 { 123 resultField.setText(processStatements (sqlField.getText(), false)); 124 } 126 132 public static String processStatements (String sqlStatements, boolean allowDML) 133 { 134 if (sqlStatements == null || sqlStatements.length() == 0) 135 return ""; 136 StringBuffer result = new StringBuffer (); 137 StringTokenizer st = new StringTokenizer (sqlStatements, ";", false); 139 while (st.hasMoreTokens()) 140 { 141 result.append(processStatement(st.nextToken(), allowDML)); 142 result.append(Env.NL); 143 } 144 return result.toString(); 146 } 148 154 public static String processStatement (String sqlStatement, boolean allowDML) 155 { 156 if (sqlStatement == null) 157 return ""; 158 StringBuffer sb = new StringBuffer (); 159 char[] chars = sqlStatement.toCharArray(); 160 for (int i = 0; i < chars.length; i++) 161 { 162 char c = chars[i]; 163 if (Character.isWhitespace(c)) 164 sb.append(' '); 165 else 166 sb.append(c); 167 } 168 String sql = sb.toString().trim(); 169 if (sql.length() == 0) 170 return ""; 171 StringBuffer result = new StringBuffer ("SQL> ") 173 .append(sql) 174 .append(Env.NL); 175 if (!allowDML) 176 { 177 boolean error = false; 178 String SQL = sql.toUpperCase(); 179 for (int i = 0; i < DML_KEYWORDS.length; i++) 180 { 181 if (SQL.startsWith(DML_KEYWORDS[i] + " ") 182 || SQL.indexOf(" " + DML_KEYWORDS[i] + " ") != -1 183 || SQL.indexOf("(" + DML_KEYWORDS[i] + " ") != -1) 184 { 185 result.append("===> ERROR: Not Allowed Keyword ") 186 .append(DML_KEYWORDS[i]) 187 .append(Env.NL); 188 error = true; 189 } 190 } 191 if (error) 192 return result.toString(); 193 } 195 Connection conn = DB.createConnection(true, Connection.TRANSACTION_READ_COMMITTED); 197 Statement stmt = null; 198 try 199 { 200 stmt = conn.createStatement(); 201 boolean OK = stmt.execute(sql); 202 int count = stmt.getUpdateCount(); 203 if (count == -1) 204 { 205 result.append("---> ResultSet"); 206 } 207 else 208 result.append("---> Result=").append(count); 209 } 210 catch (SQLException e) 211 { 212 s_log.error("process statement: " + sql + " - " + e.toString()); 213 result.append("===> ").append(e.toString()); 214 } 215 216 try 218 { 219 stmt.close(); 220 } 221 catch (SQLException e1) 222 { 223 s_log.error("processStatement - close statement", e1); 224 } 225 stmt = null; 226 try 227 { 228 conn.close(); 229 } 230 catch (SQLException e2) 231 { 232 s_log.error("processStatement - close connection", e2); 233 } 234 conn = null; 235 result.append(Env.NL); 237 return result.toString(); 238 } 240 } | Popular Tags |