aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPIndexesController.m
diff options
context:
space:
mode:
authorBibiko <bibiko@eva.mpg.de>2010-09-09 13:48:26 +0000
committerBibiko <bibiko@eva.mpg.de>2010-09-09 13:48:26 +0000
commit0e7ab97ce059e054886288401100586e59188ad3 (patch)
treec8c99fba4787fb5f44e91bc2a053a9defa6253ba /Source/SPIndexesController.m
parentcc99469638a22d68a01650bf36adc3b99ae817d1 (diff)
downloadsequelpro-0e7ab97ce059e054886288401100586e59188ad3.tar.gz
sequelpro-0e7ab97ce059e054886288401100586e59188ad3.tar.bz2
sequelpro-0e7ab97ce059e054886288401100586e59188ad3.zip
• TableStructure
- changed: field information are retrieved via [SPTableData columns]; mainly to get all infos like comment, encoding, and collation - added the chance to edit encoding, collation, and comment for each field Note: This is work is progress - not yet optimized but fully workable. Due to GUI I simply added these three columns - improvements will follow
Diffstat (limited to 'Source/SPIndexesController.m')
-rw-r--r--Source/SPIndexesController.m206
1 files changed, 103 insertions, 103 deletions
diff --git a/Source/SPIndexesController.m b/Source/SPIndexesController.m
index d7a509bd..fdd5b886 100644
--- a/Source/SPIndexesController.m
+++ b/Source/SPIndexesController.m
@@ -47,15 +47,15 @@
- (id)init
{
if ((self = [super initWithWindowNibName:@"IndexesView"])) {
-
+
table = @"";
-
+
fields = [[NSMutableArray alloc] init];
indexes = [[NSMutableArray alloc] init];
-
+
prefs = [NSUserDefaults standardUserDefaults];
}
-
+
return self;
}
@@ -63,18 +63,18 @@
* Nib awakening.
*/
- (void)awakeFromNib
-{
+{
// Set the index tables view's vertical gridlines if required
[indexesTableView setGridStyleMask:([prefs boolForKey:SPDisplayTableViewVerticalGridlines]) ? NSTableViewSolidVerticalGridLineMask : NSTableViewGridNone];
-
+
// Set the strutcture and index view's font
BOOL useMonospacedFont = [prefs boolForKey:SPUseMonospacedFonts];
-
+
for (NSTableColumn *indexColumn in [indexesTableView tableColumns])
{
[[indexColumn dataCell] setFont:(useMonospacedFont) ? [NSFont fontWithName:SPDefaultMonospacedFontName size:[NSFont smallSystemFontSize]] : [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
}
-
+
[prefs addObserver:self forKeyPath:SPDisplayTableViewVerticalGridlines options:NSKeyValueObservingOptionNew context:NULL];
}
@@ -85,50 +85,50 @@
* Opens the add new index sheet.
*/
- (IBAction)addIndex:(id)sender
-{
+{
// Check whether a save of the current field row is required.
if (![tableStructure saveRowOnDeselect]) return;
-
+
// Set sheet defaults - key type PRIMARY, key name PRIMARY and disabled
[indexTypePopUpButton selectItemAtIndex:0];
[indexNameTextField setEnabled:NO];
[indexNameTextField setStringValue:@"PRIMARY"];
-
+
[[self window] makeFirstResponder:indexedColumnsComboBox];
-
+
// Check to see whether a primary key already exists for the table, and if so select an INDEX instead
- for (NSDictionary *field in fields)
+ for (NSDictionary *field in fields)
{
if ([[field objectForKey:@"Key"] isEqualToString:@"PRI"]) {
[indexTypePopUpButton selectItemAtIndex:1];
[indexNameTextField setEnabled:YES];
[indexNameTextField setStringValue:@""];
-
+
[[self window] makeFirstResponder:indexNameTextField];
-
+
break;
}
}
-
+
// Update the default values array and the indexed column fields control
[indexedColumnsComboBox removeAllItems];
-
- for (NSDictionary *field in fields)
+
+ for (NSDictionary *field in fields)
{
- [indexedColumnsComboBox addItemWithObjectValue:[field objectForKey:@"Field"]];
+ [indexedColumnsComboBox addItemWithObjectValue:[field objectForKey:@"name"]];
}
-
+
// Only show up to ten items in the indexed column fields combo box
[indexedColumnsComboBox setNumberOfVisibleItems:([fields count] < 10) ? [fields count] : 10];
-
+
// Select the first column
[indexedColumnsComboBox selectItemAtIndex:0];
-
+
// Begin the sheet
[NSApp beginSheet:[self window]
- modalForWindow:[dbDocument parentWindow]
+ modalForWindow:[dbDocument parentWindow]
modalDelegate:self
- didEndSelector:@selector(addIndexSheetDidEnd:returnCode:contextInfo:)
+ didEndSelector:@selector(addIndexSheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];
}
@@ -138,20 +138,20 @@
- (IBAction)removeIndex:(id)sender
{
if (![indexesTableView numberOfSelectedRows]) return;
-
+
// Check whether a save of the current fields row is required.
if (![tableStructure saveRowOnDeselect]) return;
-
+
NSInteger index = [indexesTableView selectedRow];
-
+
if ((index == -1) || (index > ([indexes count] - 1))) return;
-
+
NSString *keyName = [[indexes objectAtIndex:index] objectForKey:@"Key_name"];
NSString *columnName = [[indexes objectAtIndex:index] objectForKey:@"Column_name"];
-
+
BOOL hasForeignKey = NO;
NSString *constraintName = @"";
-
+
// Check to see whether the user is attempting to remove an index that a foreign key constraint depends on
// thus would result in an error if not dropped before removing the index.
for (NSDictionary *constraint in [tableData getConstraints])
@@ -165,22 +165,22 @@
}
}
}
-
+
NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Delete index '%@'?", @"delete index message"), keyName]
defaultButton:NSLocalizedString(@"Delete", @"delete button")
alternateButton:NSLocalizedString(@"Cancel", @"cancel button")
- otherButton:nil
+ otherButton:nil
informativeTextWithFormat:(hasForeignKey) ? [NSString stringWithFormat:NSLocalizedString(@"The foreign key relationship '%@' has a dependency on this index. This relationship must be removed before the index can be deleted.\n\nAre you sure you want to continue to delete the relationship and the index? This action cannot be undone.", @"delete index and foreign key informative message"), constraintName] : [NSString stringWithFormat:NSLocalizedString(@"Are you sure you want to delete the index '%@'? This action cannot be undone.", @"delete index informative message"), keyName]];
-
+
[alert setAlertStyle:NSCriticalAlertStyle];
-
+
NSArray *buttons = [alert buttons];
-
+
// Change the alert's cancel button to have the key equivalent of return
[[buttons objectAtIndex:0] setKeyEquivalent:@"d"];
[[buttons objectAtIndex:0] setKeyEquivalentModifierMask:NSCommandKeyMask];
[[buttons objectAtIndex:1] setKeyEquivalent:@"\r"];
-
+
[alert beginSheetModalForWindow:[dbDocument parentWindow] modalDelegate:self didEndSelector:@selector(removeIndexSheetDidEnd:returnCode:contextInfo:) contextInfo:(hasForeignKey) ? @"removeIndexAndForeignKey" : @"removeIndex"];
}
@@ -192,10 +192,10 @@
if ([[indexTypePopUpButton titleOfSelectedItem] isEqualToString:@"PRIMARY KEY"] ) {
[indexNameTextField setEnabled:NO];
[indexNameTextField setStringValue:@"PRIMARY"];
- }
+ }
else {
[indexNameTextField setEnabled:YES];
-
+
if ([[indexNameTextField stringValue] isEqualToString:@"PRIMARY"]) {
[indexNameTextField setStringValue:@""];
}
@@ -221,7 +221,7 @@
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex
{
- return [[indexes objectAtIndex:rowIndex] objectForKey:[tableColumn identifier]];
+ return [[indexes objectAtIndex:rowIndex] objectForKey:[tableColumn identifier]];
}
#pragma mark -
@@ -233,11 +233,11 @@
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
if ([notification object] == indexesTableView) {
-
+
// Check if there is currently an index selected and change button state accordingly
[removeIndexButton setEnabled:([indexesTableView numberOfSelectedRows] > 0 && [tablesList tableType] == SPTableTypeTable)];
}
-
+
}
#pragma mark -
@@ -247,9 +247,9 @@
* Only enable the add button if there is at least one indexed column.
*/
- (void)controlTextDidChange:(NSNotification *)notification
-{
+{
if ([notification object] == indexedColumnsComboBox) {
- [addIndexButton setEnabled:([[[indexedColumnsComboBox stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] > 0)];
+ [addIndexButton setEnabled:([[[indexedColumnsComboBox stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] > 0)];
}
}
@@ -262,7 +262,7 @@
- (void)setFields:(NSArray *)tableFields
{
[fields removeAllObjects];
-
+
[fields setArray:tableFields];
}
@@ -272,7 +272,7 @@
- (void)setIndexes:(NSArray *)tableIndexes
{
[indexes removeAllObjects];
-
+
[indexes setArray:tableIndexes];
}
@@ -282,21 +282,21 @@
- (void)addIndexSheetDidEnd:(NSWindow *)theSheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
[theSheet orderOut:nil];
-
+
if (returnCode == NSOKButton) {
[dbDocument startTaskWithDescription:NSLocalizedString(@"Adding index...", @"adding index task status message")];
-
+
NSMutableDictionary *indexDetails = [NSMutableDictionary dictionary];
-
+
[indexDetails setObject:[[indexedColumnsComboBox stringValue] componentsSeparatedByString:@","] forKey:@"IndexedColumns"];
[indexDetails setObject:[indexNameTextField stringValue] forKey:@"IndexName"];
[indexDetails setObject:[indexTypePopUpButton titleOfSelectedItem] forKey:@"IndexType"];
-
+
if ([NSThread isMainThread]) {
[NSThread detachNewThreadSelector:@selector(_addIndexUsingDetails:) toTarget:self withObject:indexDetails];
-
- [dbDocument enableTaskCancellationWithTitle:NSLocalizedString(@"Cancel", @"cancel button") callbackObject:self callbackFunction:NULL];
- }
+
+ [dbDocument enableTaskCancellationWithTitle:NSLocalizedString(@"Cancel", @"cancel button") callbackObject:self callbackFunction:NULL];
+ }
else {
[self _addIndexUsingDetails:indexDetails];
}
@@ -311,20 +311,20 @@
{
// Order out current sheet to suppress overlapping of sheets
[[alert window] orderOut:nil];
-
+
if (returnCode == NSAlertDefaultReturn) {
[dbDocument startTaskWithDescription:NSLocalizedString(@"Removing index...", @"removing index task status message")];
-
+
NSMutableDictionary *indexDetails = [NSMutableDictionary dictionary];
-
+
[indexDetails setObject:[indexes objectAtIndex:[indexesTableView selectedRow]] forKey:@"Index"];
[indexDetails setObject:[NSNumber numberWithBool:[contextInfo hasSuffix:@"AndForeignKey"]] forKey:@"RemoveForeignKey"];
-
+
if ([NSThread isMainThread]) {
[NSThread detachNewThreadSelector:@selector(_removeIndexUsingDeatails:) toTarget:self withObject:indexDetails];
-
+
[dbDocument enableTaskCancellationWithTitle:NSLocalizedString(@"Cancel", @"cancel button") callbackObject:self callbackFunction:NULL];
- }
+ }
else {
[self _removeIndexUsingDeatails:indexDetails];
}
@@ -335,21 +335,21 @@
* This method is called as part of Key Value Observing which is used to watch for preference changes which effect the interface.
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
-{
+{
// Display table veiew vertical gridlines preference changed
if ([keyPath isEqualToString:SPDisplayTableViewVerticalGridlines]) {
[indexesTableView setGridStyleMask:([[change objectForKey:NSKeyValueChangeNewKey] boolValue]) ? NSTableViewSolidVerticalGridLineMask : NSTableViewGridNone];
}
// Use monospaced fonts preference changed
else if ([keyPath isEqualToString:SPUseMonospacedFonts]) {
-
+
BOOL useMonospacedFont = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];
-
+
for (NSTableColumn *indexColumn in [indexesTableView tableColumns])
{
[[indexColumn dataCell] setFont:(useMonospacedFont) ? [NSFont fontWithName:SPDefaultMonospacedFontName size:[NSFont smallSystemFontSize]] : [NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
}
-
+
[indexesTableView reloadData];
}
}
@@ -358,19 +358,19 @@
* Menu validation
*/
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
-{
+{
// Remove index
if ([menuItem action] == @selector(removeIndex:)) {
return ([indexesTableView numberOfSelectedRows] == 1);
}
-
+
// Reset AUTO_INCREMENT
- if ([menuItem action] == @selector(resetAutoIncrement:)) {
- return ([indexesTableView numberOfSelectedRows] == 1
- && [[indexes objectAtIndex:[indexesTableView selectedRow]] objectForKey:@"Key_name"]
+ if ([menuItem action] == @selector(resetAutoIncrement:)) {
+ return ([indexesTableView numberOfSelectedRows] == 1
+ && [[indexes objectAtIndex:[indexesTableView selectedRow]] objectForKey:@"Key_name"]
&& [[[indexes objectAtIndex:[indexesTableView selectedRow]] objectForKey:@"Key_name"] isEqualToString:@"PRIMARY"]);
}
-
+
return YES;
}
@@ -383,52 +383,52 @@
- (void)_addIndexUsingDetails:(NSDictionary *)indexDetails
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
+
// Check whether a save of the current fields row is required.
if (![[tableStructure onMainThread] saveRowOnDeselect]) return;
-
+
NSString *indexName = [indexDetails objectForKey:@"IndexName"];
NSString *indexType = [indexDetails objectForKey:@"IndexType"];
NSArray *indexedColumns = [indexDetails objectForKey:@"IndexedColumns"];
-
+
// Interface validation should prevent this
if ([indexedColumns count] > 0) {
-
+
NSMutableArray *tempIndexedColumns = [[NSMutableArray alloc] init];
-
+
if ([indexName isEqualToString:@"PRIMARY"]) {
indexName = @"";
- }
+ }
else {
indexName = ([indexName isEqualToString:@""]) ? @"" : [indexName backtickQuotedString];
}
-
+
// For each column strip leading and trailing whitespace and add it to the temp array
for (NSString *column in indexedColumns)
- {
+ {
[tempIndexedColumns addObject:[column stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
}
-
+
// Execute the query
[connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ ADD %@ %@ (%@)", [table backtickQuotedString], indexType, indexName, [tempIndexedColumns componentsJoinedAndBacktickQuoted]]];
-
+
[tempIndexedColumns release];
-
+
// Check for errors, but only if the query wasn't cancelled
if ([connection queryErrored] && ![connection queryCancelled]) {
- SPBeginAlertSheet(NSLocalizedString(@"Unable to add index", @"add index error message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [dbDocument parentWindow], self, nil, nil,
+ SPBeginAlertSheet(NSLocalizedString(@"Unable to add index", @"add index error message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [dbDocument parentWindow], self, nil, nil,
[NSString stringWithFormat:NSLocalizedString(@"An error occured while trying to add the index.\n\nMySQL said: %@", @"add index error informative message"), [connection getLastErrorMessage]]);
}
else {
[tableData resetAllData];
[tablesList setStatusRequiresReload:YES];
-
+
[tableStructure loadTable:table];
}
}
-
+
[dbDocument endTask];
-
+
[pool drain];
}
@@ -438,17 +438,17 @@
- (void)_removeIndexUsingDeatails:(NSDictionary *)indexDetails
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
+
NSDictionary *index = [indexDetails objectForKey:@"Index"];
BOOL removeForeignKey = [[indexDetails objectForKey:@"RemoveForeignKey"] boolValue];
-
+
// Remove the foreign key dependency before the index if required
if (removeForeignKey) {
-
+
NSString *columnName = [index objectForKey:@"Column_name"];
-
+
NSString *constraintName = @"";
-
+
// Check to see whether the user is attempting to remove an index that a foreign key constraint depends on
// thus would result in an error if not dropped before removing the index.
for (NSDictionary *constraint in [tableData getConstraints])
@@ -461,20 +461,20 @@
}
}
}
-
+
[connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ DROP FOREIGN KEY %@", [table backtickQuotedString], [constraintName backtickQuotedString]]];
-
+
// Check for errors, but only if the query wasn't cancelled
if ([connection queryErrored] && ![connection queryCancelled]) {
NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary];
-
+
[errorDictionary setObject:NSLocalizedString(@"Unable to delete relation", @"error deleting relation message") forKey:@"title"];
[errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to delete the relation '%@'.\n\nMySQL said: %@", @"error deleting relation informative message"), constraintName, [connection getLastErrorMessage]] forKey:@"message"];
-
+
[[tableStructure onMainThread] showErrorSheetWith:errorDictionary];
- }
+ }
}
-
+
if ([[index objectForKey:@"Key_name"] isEqualToString:@"PRIMARY"]) {
[connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ DROP PRIMARY KEY", [table backtickQuotedString]]];
}
@@ -482,25 +482,25 @@
[connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ DROP INDEX %@",
[table backtickQuotedString], [[index objectForKey:@"Key_name"] backtickQuotedString]]];
}
-
+
// Check for errors, but only if the query wasn't cancelled
if ([connection queryErrored] && ![connection queryCancelled]) {
NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary];
-
+
[errorDictionary setObject:NSLocalizedString(@"Unable to delete index", @"error deleting index message") forKey:@"title"];
[errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occured while trying to delete the index.\n\nMySQL said: %@", @"error deleting index informative message"), [connection getLastErrorMessage]] forKey:@"message"];
-
+
[[tableStructure onMainThread] showErrorSheetWith:errorDictionary];
- }
+ }
else {
[tableData resetAllData];
[tablesList setStatusRequiresReload:YES];
-
+
[tableStructure loadTable:table];
}
-
+
[dbDocument endTask];
-
+
[pool drain];
}
@@ -510,11 +510,11 @@
* Dealloc.
*/
- (void)dealloc
-{
+{
[table release];
[indexes release];
[fields release];
-
+
[super dealloc];
}