/*
* Copyright 2007 - 2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.jailer.ui.databrowser;
import java.awt.Color;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import net.sf.jailer.database.Session;
import net.sf.jailer.ui.UIUtil;
import net.sf.jailer.util.SqlScriptExecutor;
/**
* Editor for SQL/DML statements.
*
* @author Ralf Wisser
*/
public class SQLDMLPanel extends javax.swing.JPanel {
private static final long serialVersionUID = 1747749941444843829L;
/**
* The DB session.
*/
private final Session session;
/**
* To be done after execution of the script.
*/
private final Runnable afterExecution;
/** Creates new form SQLPanel
* @param sql */
public SQLDMLPanel(String sql, Session session, Runnable afterExecution) {
this.session = session;
this.afterExecution = afterExecution;
initComponents();
// SyntaxSupport instance = SyntaxSupport.getInstance();
// instance.highlightCurrent(false);
// instance.addSupport(SyntaxSupport.SQL_LEXER, sqlTextArea3);
statusLabel.setText("");
if (sql.length() < 30000) {
sqlTextArea.setContentType("text/sql");
}
sqlTextArea.setText(sql);
sqlTextArea.select(0, 0);
mlmTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
appendMLM(mlmTextField.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
appendMLM(mlmTextField.getText());
}
@Override
public void removeUpdate(DocumentEvent e) {
appendMLM(mlmTextField.getText());
}
});
}
private String mlm = "";
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
clipboardSingleLineButton = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
saveButton = new javax.swing.JButton();
clipboardButton = new javax.swing.JButton();
executeButton = new javax.swing.JButton();
statusLabel = new javax.swing.JLabel();
jPanel4 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
mlmTextField = new javax.swing.JTextField();
singleLineCheckBox = new javax.swing.JCheckBox();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
sqlTextArea = new javax.swing.JEditorPane();
jPanel3 = new javax.swing.JPanel();
clipboardSingleLineButton.setText(" Copy as Single Line ");
clipboardSingleLineButton.setToolTipText(" Copy the SQL statement as a single line to the clipboard");
clipboardSingleLineButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clipboardSingleLineButtonActionPerformed(evt);
}
});
setLayout(new java.awt.GridBagLayout());
jPanel2.setLayout(new java.awt.GridBagLayout());
saveButton.setText(" Save ");
saveButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
jPanel2.add(saveButton, gridBagConstraints);
clipboardButton.setText(" Copy to Clipboard ");
clipboardButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
clipboardButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 2;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
jPanel2.add(clipboardButton, gridBagConstraints);
executeButton.setText(" Execute ");
executeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
executeButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
jPanel2.add(executeButton, gridBagConstraints);
statusLabel.setText("jLabel1");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 8, 0, 0);
jPanel2.add(statusLabel, gridBagConstraints);
jPanel4.setLayout(new java.awt.GridBagLayout());
jLabel1.setText("multi-line continuation ");
jLabel1.setToolTipText("multi-line continuation character");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel4.add(jLabel1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 16;
jPanel4.add(mlmTextField, gridBagConstraints);
singleLineCheckBox.setText("single line ");
singleLineCheckBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
singleLineCheckBoxItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 2;
gridBagConstraints.insets = new java.awt.Insets(0, 20, 0, 0);
jPanel4.add(singleLineCheckBox, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
jPanel2.add(jPanel4, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1.0;
add(jPanel2, gridBagConstraints);
jPanel1.setLayout(new java.awt.GridBagLayout());
jScrollPane1.setViewportView(sqlTextArea);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel1.add(jScrollPane1, gridBagConstraints);
jPanel3.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
jPanel1.add(jPanel3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jPanel1, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed
String fn = UIUtil.choseFile(null, ".", "Save SQL Query", "", this, false, false);
if (fn != null) {
try {
PrintWriter out = new PrintWriter(new FileWriter(fn));
out.print(sqlTextArea.getText());
out.close();
} catch (Exception e) {
UIUtil.showException(this, "Error saving query", e, session);
}
}
}//GEN-LAST:event_saveButtonActionPerformed
private void clipboardButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clipboardButtonActionPerformed
sqlTextArea.selectAll();
sqlTextArea.copy();
sqlTextArea.select(0, 0);
}//GEN-LAST:event_clipboardButtonActionPerformed
private void clipboardSingleLineButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clipboardSingleLineButtonActionPerformed
String orig = sqlTextArea.getText();
sqlTextArea.setText(orig.replaceAll(" *(\n|\r)+ *", " "));
sqlTextArea.selectAll();
sqlTextArea.copy();
sqlTextArea.setText(orig);
sqlTextArea.select(0, 0);
}//GEN-LAST:event_clipboardSingleLineButtonActionPerformed
private String lastMultiLineSQL = "";
private void singleLineCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_singleLineCheckBoxItemStateChanged
String mlm = this.mlm;
if (singleLineCheckBox.isSelected()) {
String lf = System.getProperty("line.separator", "\n");
appendMLM("");
lastMultiLineSQL = sqlTextArea.getText();
String EOL = "EOL498503458430EOL";
sqlTextArea.setText(lastMultiLineSQL.replaceAll(";(\n|\r)", EOL).replaceAll(" *(\n|\r)+ *", " ").replaceAll(EOL + " *", ";" + lf));
appendMLM(mlm);
} else {
sqlTextArea.setText(lastMultiLineSQL);
this.mlm = "";
appendMLM(mlm);
}
sqlTextArea.setCaretPosition(0);
}//GEN-LAST:event_singleLineCheckBoxItemStateChanged
private void appendMLM(String mlm) {
mlm = mlm.trim();
if (mlm.length() > 1) {
mlm = mlm.substring(0, 1);
}
if (this.mlm.equals(mlm)) {
return;
}
if (this.mlm.length() > 0) {
String omlm = this.mlm;
if ("\\|[]()^-$".indexOf(omlm) >= 0) {
omlm = "\\" + omlm;
}
sqlTextArea.setText(sqlTextArea.getText().replaceAll(" " + omlm + "([\n\r])", "$1"));
sqlTextArea.select(0, 0);
}
this.mlm = mlm;
if (mlm.length() > 0) {
if ("\\".equals(mlm) || "$".equals(mlm)) {
mlm = "\\" + mlm;
}
sqlTextArea.setText(sqlTextArea.getText().replaceAll("([^\n\r;])([\n\r])", "$1 " + mlm + "$2"));
sqlTextArea.select(0, 0);
}
}
private void executeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_executeButtonActionPerformed
if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, "Execute Statements?", "Execute", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)) {
String sqlFile;
try {
String sqlFileBase = "temp_" + System.currentTimeMillis();
for (int i = 0; ; ++i) {
sqlFile = sqlFileBase + i + ".sql";
if (!new File(sqlFile).exists()) {
break;
}
}
PrintWriter out = new PrintWriter(new File(sqlFile));
out.println(sqlTextArea.getText());
out.close();
} catch (Exception e) {
UIUtil.showException(this, "Error", e, session);
return;
}
List<String> args = new ArrayList<String>();
args.add("import");
args.add(sqlFile);
args.addAll(session.getCliArguments());
args.add("-transactional");
if (UIUtil.runJailer(SwingUtilities.getWindowAncestor(this), args, false, true, false, true, null, session.getPassword(), null, null, false, false, true)) {
statusLabel.setText("Executed " + SqlScriptExecutor.getLastStatementCount().a + " statements. " +
SqlScriptExecutor.getLastStatementCount().b + " rows affected");
statusLabel.setForeground(new Color(0, 100, 0));
afterExecution.run();
// JOptionPane.showMessageDialog(this, "Successfully executed " + SqlScriptExecutor.getLastStatementCount().a + " statements.\n" + SqlScriptExecutor.getLastStatementCount().b + " rows affected.", "SQL/DML", JOptionPane.INFORMATION_MESSAGE);
} else {
statusLabel.setText("Error, rolled back");
statusLabel.setForeground(new Color(115, 0, 0));
}
new File(sqlFile).delete();
}
}//GEN-LAST:event_executeButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton clipboardButton;
private javax.swing.JButton clipboardSingleLineButton;
private javax.swing.JButton executeButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField mlmTextField;
private javax.swing.JButton saveButton;
private javax.swing.JCheckBox singleLineCheckBox;
private javax.swing.JEditorPane sqlTextArea;
private javax.swing.JLabel statusLabel;
// End of variables declaration//GEN-END:variables
}