mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
make oracle and mysql specific
This commit is contained in:
107
extra/jheidi/indexDialog$mysql.ajl
Executable file
107
extra/jheidi/indexDialog$mysql.ajl
Executable file
@@ -0,0 +1,107 @@
|
||||
import javax.swing.*;
|
||||
|
||||
WindowContext parentContext = argObj("windowContext");
|
||||
|
||||
Dialog dlg = new Dialog((Frame)parentContext.get("/"), "indexDialog", "Manage Indexes");
|
||||
WindowContext context = dlg.getWindowContext();
|
||||
context.put("db", parentContext.get("db"));
|
||||
context.put("currentDB", parentContext.get("currentDB"));
|
||||
context.put("currentTable", parentContext.get("currentTable"));
|
||||
|
||||
dlg.events("indexEventsMySQL")
|
||||
.insets(10,10)
|
||||
.tabLayout()
|
||||
.icon("images/manageindexes.gif")
|
||||
.text("Index Name:", 89)
|
||||
.setTab()
|
||||
.combo("indexes", new String[] {"", "Hi"}, 243)
|
||||
.setTab()
|
||||
.nextRow()
|
||||
.tab(2)
|
||||
.button("Add Primary", LF.isLeopard?101:100)
|
||||
.button("Add", 65)
|
||||
.button("Delete", 65)
|
||||
.nextRow()
|
||||
.vspace(5)
|
||||
.tab(1)
|
||||
.checkbox("unique", "Unique", false, true)
|
||||
.tab(2)
|
||||
.checkbox("fullText", "FullText", false, true)
|
||||
.nextRow()
|
||||
.tab(1)
|
||||
.text("Columns:", 183)
|
||||
.setTab()
|
||||
.text("Columns In Index:", 150)
|
||||
.setTab()
|
||||
.nextRow()
|
||||
.tab(1)
|
||||
.listbox("fields", new String[] {}, 150, 200 )
|
||||
.vspace(50)
|
||||
.space(-1)
|
||||
.imageButton("right", "images/right.gif", 28)
|
||||
.vspace(0)
|
||||
.space(-35)
|
||||
.vspace(90)
|
||||
.imageButton("left", "images/left.gif", 28)
|
||||
.vspace(0)
|
||||
.tab(4)
|
||||
.listbox("indexFields", new String[] {}, 150, 200 )
|
||||
.nextRow()
|
||||
.vspace(205)
|
||||
.space(45)
|
||||
.button("Update Indexes", LF.isMac?LF.isLeopard?123:122:120)
|
||||
.space(5)
|
||||
.button("Cancel", 110);
|
||||
|
||||
DB db = context.get("db");
|
||||
|
||||
String dbName = context.get("currentDB");
|
||||
String tbName = context.get("currentTable");
|
||||
|
||||
DB.Result result = db.executeNonCached("show keys from `" + dbName + "`.`" + tbName + "`");
|
||||
DB.Result allColumns = db.executeNonCached("show columns from `" + dbName + "`.`" + tbName + "`");
|
||||
|
||||
Combo indexes = context.get("/indexes");
|
||||
HashObject indexMap = new HashObject();
|
||||
for (HashObject index: result)
|
||||
{
|
||||
if ( indexMap.getObject(index.get("key_name")) == null )
|
||||
{
|
||||
indexMap.put(index.get("key_name"), new HashObject());
|
||||
}
|
||||
((HashObject)indexMap.getObject(index.get("key_name"))).put(index.get("column_name"), index);
|
||||
}
|
||||
|
||||
String[] allCols = new String[allColumns.size()];
|
||||
for (int i=0; i < allColumns.size(); i++)
|
||||
{
|
||||
allCols[i] = ((HashObject)allColumns.get(i)).get("field");
|
||||
}
|
||||
|
||||
Object[] keys = indexMap.keySet().toArray();
|
||||
|
||||
indexes.setModel(new DefaultComboBoxModel(keys));
|
||||
indexes.setProperty("indexMap", indexMap);
|
||||
indexes.setProperty("allColumns", allCols);
|
||||
indexes.setProperty("storedValues", new HashObject());
|
||||
|
||||
if ( keys.length > 0 )
|
||||
{
|
||||
indexes.select((String)keys[0]);
|
||||
}
|
||||
|
||||
if ( indexMap.getObject("PRIMARY") != null )
|
||||
{
|
||||
((Button)context.get("/Add Primary")).setEnabled(false);
|
||||
}
|
||||
|
||||
if ( indexMap.size() == 0 )
|
||||
{
|
||||
((Button)context.get("/Delete")).setEnabled(false);
|
||||
}
|
||||
|
||||
dlg.visible();
|
||||
|
||||
return context.get("dlgResult");
|
||||
|
||||
|
||||
108
extra/jheidi/indexDialog$oracle.ajl
Normal file
108
extra/jheidi/indexDialog$oracle.ajl
Normal file
@@ -0,0 +1,108 @@
|
||||
import javax.swing.*;
|
||||
|
||||
WindowContext parentContext = argObj("windowContext");
|
||||
|
||||
Dialog dlg = new Dialog((Frame)parentContext.get("/"), "indexDialog", "Manage Indexes");
|
||||
WindowContext context = dlg.getWindowContext();
|
||||
context.put("db", parentContext.get("db"));
|
||||
context.put("currentDB", parentContext.get("currentDB"));
|
||||
context.put("currentTable", parentContext.get("currentTable"));
|
||||
|
||||
dlg.events("indexEventsOracle")
|
||||
.insets(10,10)
|
||||
.tabLayout()
|
||||
.icon("images/manageindexes.gif")
|
||||
.text("Index Name:", 89)
|
||||
.setTab()
|
||||
.combo("indexes", new String[] {"", "Hi"}, 243)
|
||||
.setTab()
|
||||
.nextRow()
|
||||
.tab(2)
|
||||
.space(87)
|
||||
.button("Add", 75)
|
||||
.button("Delete", 75)
|
||||
.nextRow()
|
||||
.vspace(5)
|
||||
.tab(1)
|
||||
.checkbox("primary", "Primary", false, true)
|
||||
.tab(2)
|
||||
.checkbox("unique", "Unique", false, true)
|
||||
.nextRow()
|
||||
.tab(1)
|
||||
.text("Columns:", 183)
|
||||
.setTab()
|
||||
.text("Columns In Index:", 150)
|
||||
.setTab()
|
||||
.nextRow()
|
||||
.tab(1)
|
||||
.listbox("fields", new String[] {}, 150, 200 )
|
||||
.vspace(50)
|
||||
.space(-1)
|
||||
.imageButton("right", "images/right.gif", 28)
|
||||
.vspace(0)
|
||||
.space(-35)
|
||||
.vspace(90)
|
||||
.imageButton("left", "images/left.gif", 28)
|
||||
.vspace(0)
|
||||
.tab(4)
|
||||
.listbox("indexFields", new String[] {}, 150, 200 )
|
||||
.nextRow()
|
||||
.vspace(205)
|
||||
.space(45)
|
||||
.button("Update Indexes", LF.isMac?LF.isLeopard?123:122:120)
|
||||
.space(5)
|
||||
.button("Cancel", 110);
|
||||
|
||||
DB db = context.get("db");
|
||||
|
||||
String dbName = context.get("currentDB");
|
||||
String tbName = context.get("currentTable");
|
||||
|
||||
|
||||
DB.Result result = db.executeNonCached("select lower(a.index_name) key_name, a.column_position seq_in_index, lower(a.column_name) column_name, b.constraint_type constraint_type" +
|
||||
" from all_ind_columns a, all_constraints b where a.table_owner=upper('%s') and a.table_name=upper('%s') " +
|
||||
" and b.owner=a.table_owner and b.table_name=a.table_name and b.index_name=a.index_name order by key_name, seq_in_index",
|
||||
dbName, tbName);
|
||||
Table tableColumns = parentContext.get("/mainTabs/Table/table");
|
||||
DB.Result allColumns = ((ResultTableModel)tableColumns.getModel()).getResult();
|
||||
|
||||
Combo indexes = context.get("/indexes");
|
||||
HashObject indexMap = new HashObject();
|
||||
for (HashObject index: result)
|
||||
{
|
||||
if ( indexMap.getObject(index.get("key_name")) == null )
|
||||
{
|
||||
indexMap.put(index.get("key_name"), new HashObject());
|
||||
}
|
||||
((HashObject)indexMap.getObject(index.get("key_name"))).put(index.get("column_name"), index);
|
||||
}
|
||||
|
||||
String[] allCols = new String[allColumns.size()];
|
||||
for (int i=0; i < allColumns.size(); i++)
|
||||
{
|
||||
allCols[i] = ((HashObject)allColumns.get(i)).get("column_name");
|
||||
System.out.println("adding col: " + allCols[i]);
|
||||
}
|
||||
|
||||
Object[] keys = indexMap.keySet().toArray();
|
||||
|
||||
indexes.setModel(new DefaultComboBoxModel(keys));
|
||||
indexes.setProperty("indexMap", indexMap);
|
||||
indexes.setProperty("allColumns", allCols);
|
||||
indexes.setProperty("storedValues", new HashObject());
|
||||
|
||||
if ( keys.length > 0 )
|
||||
{
|
||||
indexes.select((String)keys[0]);
|
||||
}
|
||||
|
||||
if ( indexMap.size() == 0 )
|
||||
{
|
||||
((Button)context.get("/Delete")).setEnabled(false);
|
||||
}
|
||||
|
||||
dlg.visible();
|
||||
|
||||
return context.get("dlgResult");
|
||||
|
||||
|
||||
355
extra/jheidi/indexEventsMySQL.ajl
Executable file
355
extra/jheidi/indexEventsMySQL.ajl
Executable file
@@ -0,0 +1,355 @@
|
||||
import javax.swing.*;
|
||||
import java.util.*;
|
||||
|
||||
String who = arg("source");
|
||||
WindowContext context = argObj("windowContext");
|
||||
log.debug("event received: " + who);
|
||||
|
||||
ListBox indexFields = context.get("/indexFields");
|
||||
ListBox fields = context.get("/fields");
|
||||
Combo indexes = context.get("/indexes");
|
||||
|
||||
|
||||
if ("unique".equals(who))
|
||||
{
|
||||
((CheckBox)context.get("/fullText")).setSelected(false);
|
||||
}
|
||||
else if ("fullText".equals(who))
|
||||
{
|
||||
((CheckBox)context.get("/unique")).setSelected(false);
|
||||
}
|
||||
else if ("Add Primary".equals(who))
|
||||
{
|
||||
DefaultComboBoxModel model = (DefaultComboBoxModel)indexes.getModel();
|
||||
model.addElement("PRIMARY");
|
||||
model.setSelectedItem("PRIMARY");
|
||||
((Button)context.get("/Delete")).setEnabled(true);
|
||||
((Button)context.get("/Add Primary")).setEnabled(false);
|
||||
}
|
||||
else if ("Add".equals(who))
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else if ("Delete".equals(who))
|
||||
{
|
||||
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);
|
||||
}
|
||||
if ( "PRIMARY".equals(indexToDelete) )
|
||||
{
|
||||
((Button)context.get("/Add Primary")).setEnabled(true);
|
||||
}
|
||||
|
||||
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 ("Update Indexes".equals(who))
|
||||
{
|
||||
String indexName = indexes.getText();
|
||||
List<String> deletes = new ArrayList<String>();
|
||||
List<String> adds = new ArrayList<String>();
|
||||
HashObject indexMap = indexes.getProperty("indexMap");
|
||||
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("fullText", new Boolean(((CheckBox)context.get("/fullText")).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 = "0".equals(((HashObject)index.get(0)).get("non_unique"));
|
||||
boolean isFullText = "FULLTEXT".equals(((HashObject)index.get(0)).get("index_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("fullText")).equals(Boolean.valueOf(isFullText)) )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
log.debug("changes were made - generating statement");
|
||||
//ALTER TABLE `tablename` DROP INDEX `NewIndex`, ADD FULLTEXT `NewIndex` (`another`, `FieldName`, `whoever`)
|
||||
StringBuilder buffer = new StringBuilder(500);
|
||||
buffer.append("alter table `").append(context.get("currentDB")).append("`.`").append(context.get("currentTable")).append("`");
|
||||
|
||||
String sep=" ";
|
||||
for (String ndx : deletes)
|
||||
{
|
||||
if ( "PRIMARY".equals(ndx) )
|
||||
{
|
||||
buffer.append(sep).append("drop primary key");
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer.append(sep).append("drop index ").append(ndx);
|
||||
}
|
||||
sep=", ";
|
||||
}
|
||||
for (String ndx : adds)
|
||||
{
|
||||
log.debug("iterating adds: added: " + ndx);
|
||||
HashObject storedIndex = (HashObject)storedVals.getObject(ndx);
|
||||
ListDataModel listModel = storedIndex.getObject("indexListModel");
|
||||
|
||||
buffer.append(sep).append("add ");
|
||||
if ("PRIMARY".equals(ndx))
|
||||
{
|
||||
buffer.append("primary key ");
|
||||
}
|
||||
else if (Boolean.TRUE.equals((Boolean)storedIndex.getObject("unique")))
|
||||
{
|
||||
buffer.append("unique ").append(ndx);
|
||||
}
|
||||
else if (Boolean.TRUE.equals((Boolean)storedIndex.getObject("fullText")))
|
||||
{
|
||||
buffer.append("fulltext ").append(ndx);
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer.append("index ").append(ndx);
|
||||
}
|
||||
buffer.append(" (");
|
||||
|
||||
String sep2="";
|
||||
for (String colName : listModel)
|
||||
{
|
||||
buffer.append(sep2).append(colName);
|
||||
sep2=", ";
|
||||
}
|
||||
buffer.append(")");
|
||||
sep=", ";
|
||||
}
|
||||
log.debug("The sql is: " + buffer.toString());
|
||||
|
||||
DB db = context.get("db");
|
||||
db.execute(buffer.toString());
|
||||
db.end();
|
||||
|
||||
context.put("dlgResult", Boolean.TRUE);
|
||||
|
||||
}
|
||||
((Dialog)context.get("/")).dispose();
|
||||
|
||||
}
|
||||
else if ( "indexes".equals(who) )
|
||||
{
|
||||
//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("fullText", new Boolean(((CheckBox)context.get("/fullText")).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"));
|
||||
((CheckBox)context.get("/fullText")).setSelected((Boolean)h.getObject("fullText"));
|
||||
}
|
||||
else
|
||||
{
|
||||
String[] allCols = indexes.getProperty("allColumns");
|
||||
|
||||
List cols = new ArrayList();
|
||||
List indexCols = new ArrayList();
|
||||
|
||||
boolean isUnique = index != null && "0".equals(((HashObject)index.get(0)).get("non_unique"));
|
||||
boolean isFullText = index != null && "FULLTEXT".equals(((HashObject)index.get(0)).get("index_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()));
|
||||
((CheckBox)context.get("/unique")).setSelected(isUnique);
|
||||
((CheckBox)context.get("/fullText")).setSelected(isFullText);
|
||||
}
|
||||
|
||||
boolean enableChecks = !"PRIMARY".equals(indexes.getText());
|
||||
((CheckBox)context.get("/unique")).setEnabled(enableChecks);
|
||||
((CheckBox)context.get("/fullText")).setEnabled(enableChecks);
|
||||
|
||||
context.put("lastIndex", indexes.getText());
|
||||
}
|
||||
|
||||
}
|
||||
else if ("fields".equals(who) )
|
||||
{
|
||||
if ( fields.getSelectedIndex() > -1 )
|
||||
{
|
||||
indexFields.clearSelection();
|
||||
}
|
||||
}
|
||||
else if ("indexFields".equals(who) )
|
||||
{
|
||||
if ( indexFields.getSelectedIndex() > -1 )
|
||||
{
|
||||
fields.clearSelection();
|
||||
}
|
||||
}
|
||||
else if ("left".equals(who) )
|
||||
{
|
||||
if ( indexFields.getSelectedValue() != null)
|
||||
{
|
||||
((ListDataModel)fields.getModel()).add(indexFields.getSelectedValue());
|
||||
((ListDataModel)indexFields.getModel()).remove(indexFields.getSelectedIndex());
|
||||
}
|
||||
}
|
||||
else if ("right".equals(who) )
|
||||
{
|
||||
if ( fields.getSelectedValue() != null)
|
||||
{
|
||||
((ListDataModel)indexFields.getModel()).add(fields.getSelectedValue());
|
||||
((ListDataModel)fields.getModel()).remove(fields.getSelectedIndex());
|
||||
}
|
||||
}
|
||||
else if ( "Cancel".equals(who) )
|
||||
{
|
||||
Dialog d = context.get("/");
|
||||
d.dispose();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
363
extra/jheidi/indexEventsOracle.ajl
Normal file
363
extra/jheidi/indexEventsOracle.ajl
Normal file
@@ -0,0 +1,363 @@
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user