diff --git a/extra/jheidi/indexDialog$mysql.ajl b/extra/jheidi/indexDialog$mysql.ajl new file mode 100755 index 00000000..727318ea --- /dev/null +++ b/extra/jheidi/indexDialog$mysql.ajl @@ -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"); + + diff --git a/extra/jheidi/indexDialog$oracle.ajl b/extra/jheidi/indexDialog$oracle.ajl new file mode 100644 index 00000000..ef518ba4 --- /dev/null +++ b/extra/jheidi/indexDialog$oracle.ajl @@ -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"); + + diff --git a/extra/jheidi/indexEventsMySQL.ajl b/extra/jheidi/indexEventsMySQL.ajl new file mode 100755 index 00000000..f0afad64 --- /dev/null +++ b/extra/jheidi/indexEventsMySQL.ajl @@ -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 deletes = new ArrayList(); + List adds = new ArrayList(); + 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)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)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)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(); + } + + + + + + + + diff --git a/extra/jheidi/indexEventsOracle.ajl b/extra/jheidi/indexEventsOracle.ajl new file mode 100644 index 00000000..8706456f --- /dev/null +++ b/extra/jheidi/indexEventsOracle.ajl @@ -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 deletes = new ArrayList(); + final List adds = new ArrayList(); + 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)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)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)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(); + } + + + + + + + +