Files
HeidiSQL/extra/jheidi/indexEventsOracle.ajl
2008-12-29 20:01:51 +00:00

364 lines
12 KiB
Plaintext

import javax.swing.*;
import java.util.*;
String event = arg("source");
final WindowContext context = argObj("windowContext");
log.debug("event received: " + event);
ListBox indexFields = context.get("/indexFields");
ListBox fields = context.get("/fields");
Combo indexes = context.get("/indexes");
if ( event=="primary" )
{
boolean flip = !((CheckBox)context.get("/primary")).isSelected();
((CheckBox)context.get("/unique")).setSelected(false);
((CheckBox)context.get("/unique")).setEnabled(flip);
}
else if ( event=="unique" )
{
boolean flip = !((CheckBox)context.get("/unique")).isSelected();
((CheckBox)context.get("/primary")).setSelected(false);
((CheckBox)context.get("/primary")).setEnabled(flip);
}
else if (event.startsWith("Add"))
{
Dialog d = context.get("/");
String newIndex = d.popupQuestion("Add Index", "Enter a name for the new index:");
if ( newIndex != null && newIndex.trim().length() > 0)
{
DefaultComboBoxModel model = (DefaultComboBoxModel)indexes.getModel();
newIndex = newIndex.trim().toLowerCase();
if ( model.getIndexOf( newIndex ) != -1 )
{
d.popupMessage("Invalid Index Name", "That index name already exists.");
}
else
{
model.addElement(newIndex);
model.setSelectedItem(newIndex);
((Button)context.get("/Delete")).setEnabled(true);
((CheckBox)context.get("/unique")).setSelected(false);
((CheckBox)context.get("/unique")).setEnabled(true);
((CheckBox)context.get("/primary")).setSelected(false);
((CheckBox)context.get("/primary")).setEnabled(true);
}
}
}
else if (event == "Delete")
{
Dialog d = context.get("/");
String indexToDelete = indexes.getText();
if (d.popupConfirm("Confirm Delete!", "Are you sure you want to delete index '" + indexToDelete + "'?"))
{
((DefaultComboBoxModel)indexes.getModel()).removeElement(indexToDelete);
if ( ((DefaultComboBoxModel)indexes.getModel()).getSize() == 0 )
{
((Button)context.get("/Delete")).setEnabled(false);
}
HashObject storedVals = indexes.getProperty("storedValues");
HashObject indexMap = indexes.getProperty("indexMap");
if ( indexMap.getObject(indexToDelete) != null )
{
storedVals.remove(storedVals.getObject(indexToDelete));
storedVals.keySet().remove(indexToDelete);
context.put("lastIndex", null);
}
}
}
else if (event == "Update Indexes")
{
String indexName = indexes.getText();
final List<String> deletes = new ArrayList<String>();
final List<String> adds = new ArrayList<String>();
HashObject indexMap = indexes.getProperty("indexMap");
final HashObject storedVals = indexes.getProperty("storedValues");
//flush the view to storage
if ( indexName != null )
{
log.debug("index selected in combo: storing to hash");
HashObject h = storedVals.getObject(indexName) == null ?
(HashObject)new HashObject() : (HashObject)storedVals.getObject(indexName);
h.put("indexListModel", indexFields.getModel());
h.put("fieldListModel", fields.getModel());
h.put("unique", new Boolean(((CheckBox)context.get("/unique")).isSelected()));
h.put("primary", new Boolean(((CheckBox)context.get("/primary")).isSelected()));
storedVals.put(indexName, h);
}
log.debug("iterating indexes combo count: " + indexes.getItemCount());
for ( int i=0; i < indexes.getItemCount(); i++ )
{
indexName = (String)indexes.getItemAt(i);
HashObject index = (HashObject)indexMap.getObject(indexName);
HashObject storedIndex = (HashObject)storedVals.getObject(indexName);
if ( index == null )
{
log.debug("added index: " + indexName);
//storedIndex cannot be null for adds
ListDataModel listModel = storedIndex.getObject("indexListModel");
if ( listModel.size() > 0 )
{
adds.add(indexName);
}
else
{
log.debug("skipping index with no cols: " + indexName);
}
}
else if ( storedIndex != null )
{
log.debug("diffing: " + indexName);
boolean isUnique = "U".equals(((HashObject)index.get(0)).get("constraint_type"));
boolean isPrimary = "P".equals(((HashObject)index.get(0)).get("constraint_type"));
ListDataModel listModel = storedIndex.getObject("indexListModel");
if ( listModel.size() == 0 )
{
log.debug("skipping index with no cols: " + indexName);
continue;
}
if ( listModel.size() != index.size() ||
!((Boolean)storedIndex.getObject("unique")).equals(Boolean.valueOf(isUnique)) ||
!((Boolean)storedIndex.getObject("primary")).equals(Boolean.valueOf(isPrimary)) )
{
deletes.add(indexName);
adds.add(indexName);
break;
}
else
{
int count = 0;
for (HashObject col : (List<HashObject>)index )
{
if ( !col.get("column_name").equals( listModel.get(count) ) )
{
deletes.add(indexName);
adds.add(indexName);
break;
}
}
}
log.debug("no changes to: " + indexName);
}
}
for ( String key: (Set<String>)indexMap.keySet() )
{
if ( ((DefaultComboBoxModel)indexes.getModel()).getIndexOf(key) == -1 )
{
log.debug("deleted: " + key);
deletes.add( key );
}
}
if ( deletes.size() > 0 || adds.size() > 0 )
{
final DB db = context.get("db");
DB.AutoCleanupTX tx = new DB.AutoCleanupTX() {
public void execute() throws Exception {
for ( String ndx: deletes )
{
DB.Result r = db.execute("select constraint_name from all_constraints where owner=upper('%s') and table_name=upper('%s') and index_name=upper('%s')",
context.get("currentDB"), context.get("currentTable"), ndx);
String c = r.first().get("constraint_name");
db.execute("alter table %s.%s drop constraint %s", context.get("currentDB"), context.get("currentTable"), c);
try
{
//was the index deleted automatically? sometimes is sometimes not
r = db.execute("select * from all_indexes where owner=upper('%s') and index_name=upper('%s')", context.get("currentDB"), ndx);
if ( !r.isEmpty() )
db.execute("drop index %s.%s", context.get("currentDB"), ndx);
} catch (Exception e) { log.debug("index: " + ndx + " could not be dropped"); }
}
String sep="";
for (String ndx: adds)
{
HashObject storedIndex = (HashObject)storedVals.getObject(ndx);
ListDataModel listModel = storedIndex.getObject("indexListModel");
//dont really know how to create a non unique index
String indexType = "unique";
if (Boolean.TRUE.equals((Boolean)storedIndex.getObject("primary")))
{
indexType = "primary key";
}
Formatter f = new Formatter();
f.format("alter table %s.%s add %s(", context.get("currentDB"), context.get("currentTable"), indexType);
for (String col: listModel)
{
f.format("%s%s", sep, col);
sep=", ";
}
f.format(") using index (create index %s on %s.%s(",ndx, context.get("currentDB"), context.get("currentTable") );
sep="";
for (String col: listModel)
{
f.format("%s%s", sep, col);
sep=", ";
}
f.format("))", null);
db.execute(f.toString());
}
}
};
db.execute(tx);
}
context.put("dlgResult", Boolean.TRUE);
((Dialog)context.get("/")).dispose();
}
else if ( event == "indexes" )
{
//this must diff the avail cols with the cols in index
//keeping both in order shifitng in and out as the user changes sel
if ( indexes.getText() == null )
{
//user deleted all indexes?
indexFields.setModel(new ListDataModel(new String[0]));
fields.setModel(new ListDataModel(new String[0]));
return;
}
if ( !indexes.getText().equals(context.get("lastIndex")))
{
HashObject indexMap = indexes.getProperty("indexMap");
HashObject storedVals = indexes.getProperty("storedValues");
if ( context.get("lastIndex") != null )
{
String indexName = context.get("lastIndex");
//store the last indexes properties
HashObject h = storedVals.getObject(indexName) == null ? (HashObject)new HashObject() : (HashObject)storedVals.getObject(indexName);
h.put("indexListModel", indexFields.getModel());
h.put("fieldListModel", fields.getModel());
h.put("unique", new Boolean(((CheckBox)context.get("/unique")).isSelected()));
h.put("primary", new Boolean(((CheckBox)context.get("/primary")).isSelected()));
storedVals.put(indexName, h);
}
HashObject index = (HashObject)indexMap.getObject(indexes.getText());
if ( storedVals.getObject(indexes.getText()) != null )
{
HashObject h = storedVals.getObject(indexes.getText());
indexFields.setModel((ListDataModel)h.getObject("indexListModel"));
fields.setModel((ListDataModel)h.getObject("fieldListModel"));
((CheckBox)context.get("/unique")).setSelected((Boolean)h.getObject("unique"));
}
else
{
String[] allCols = indexes.getProperty("allColumns");
List cols = new ArrayList();
List indexCols = new ArrayList();
boolean isUnique = index != null && "U".equals(((HashObject)index.get(0)).get("constraint_type"));
boolean isPrimary = index != null && "P".equals(((HashObject)index.get(0)).get("constraint_type"));
for (String col: allCols)
{
if ( index==null || index.getObject(col) == null )
{
cols.add(col);
}
}
if ( index != null )
{
for (HashObject h : (List<HashObject>)index)
indexCols.add(h.get("column_name"));
}
fields.setModel(new ListDataModel(cols.toArray()));
indexFields.setModel(new ListDataModel(indexCols.toArray()));
if ( isUnique )
{
((CheckBox)context.get("/unique")).setSelected(true);
((CheckBox)context.get("/unique")).setEnabled(true);
}
else if ( isPrimary )
{
((CheckBox)context.get("/primary")).setSelected(true);
((CheckBox)context.get("/primary")).setEnabled(true);
}
else
{
((CheckBox)context.get("/unique")).setEnabled(true);
((CheckBox)context.get("/primary")).setEnabled(true);
}
}
//boolean enableChecks = !"PRIMARY".equals(indexes.getText());
//((CheckBox)context.get("/unique")).setEnabled(enableChecks);
context.put("lastIndex", indexes.getText());
}
}
else if (event == "fields")
{
if ( fields.getSelectedIndex() > -1 )
{
indexFields.clearSelection();
}
}
else if (event == "indexFields")
{
if ( indexFields.getSelectedIndex() > -1 )
{
fields.clearSelection();
}
}
else if (event == "left")
{
if ( indexFields.getSelectedValue() != null)
{
((ListDataModel)fields.getModel()).add(indexFields.getSelectedValue());
((ListDataModel)indexFields.getModel()).remove(indexFields.getSelectedIndex());
}
}
else if (event == "right")
{
if ( fields.getSelectedValue() != null)
{
((ListDataModel)indexFields.getModel()).add(fields.getSelectedValue());
((ListDataModel)fields.getModel()).remove(fields.getSelectedIndex());
}
}
else if ( event == "Cancel" )
{
Dialog d = context.get("/");
d.dispose();
}