diff options
author | Bibiko <bibiko@eva.mpg.de> | 2010-08-30 12:08:56 +0000 |
---|---|---|
committer | Bibiko <bibiko@eva.mpg.de> | 2010-08-30 12:08:56 +0000 |
commit | 78c98ee22535c1f8f6c0d999b03c529b9e250d97 (patch) | |
tree | 5b6daf5b8b48f2a623af68c1258fe32f842460dc /Source/SPExtendedTableInfo.m | |
parent | cdb4b4adda734c94bbef94b92a9479a733858c33 (diff) | |
download | sequelpro-78c98ee22535c1f8f6c0d999b03c529b9e250d97.tar.gz sequelpro-78c98ee22535c1f8f6c0d999b03c529b9e250d97.tar.bz2 sequelpro-78c98ee22535c1f8f6c0d999b03c529b9e250d97.zip |
• added some basic VIEW INFORMATION coming from information.schema.VIEWS
Diffstat (limited to 'Source/SPExtendedTableInfo.m')
-rw-r--r-- | Source/SPExtendedTableInfo.m | 180 |
1 files changed, 92 insertions, 88 deletions
diff --git a/Source/SPExtendedTableInfo.m b/Source/SPExtendedTableInfo.m index f9e0bdb8..186c4c25 100644 --- a/Source/SPExtendedTableInfo.m +++ b/Source/SPExtendedTableInfo.m @@ -50,11 +50,11 @@ - (void)awakeFromNib { [tableCreateSyntaxTextView setAllowsDocumentBackgroundColorChange:YES]; - + NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary]; - + [bindingOptions setObject:NSUnarchiveFromDataTransformerName forKey:@"NSValueTransformerName"]; - + [tableCreateSyntaxTextView bind:@"backgroundColor" toObject:[NSUserDefaultsController sharedUserDefaultsController] withKeyPath:@"values.CustomQueryEditorBackgroundColor" @@ -81,7 +81,7 @@ { // Reset the table data's cache [tableDataInstance resetAllData]; - + // Load the new table info [self loadTable:selectedTable]; } @@ -98,18 +98,18 @@ if ([currentType isEqualToString:newType]) { return; } - + // Alter table's storage type [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ TYPE = %@", [selectedTable backtickQuotedString], newType]]; - + if ([connection getLastErrorID] == 0) { // Reload the table's data [tablesListInstance updateSelectionWithTaskString:NSLocalizedString(@"Reloading data...", @"Reloading data task description")]; } else { [sender selectItemWithTitle:currentType]; - - SPBeginAlertSheet(NSLocalizedString(@"Error changing table type", @"error changing table type message"), + + SPBeginAlertSheet(NSLocalizedString(@"Error changing table type", @"error changing table type message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table type to '%@'.\n\nMySQL said: %@", @"error changing table type informative message"), newType, [connection getLastErrorMessage]]); } @@ -122,21 +122,21 @@ { NSString *currentEncoding = [tableDataInstance tableEncoding]; NSString *newEncoding = [[sender titleOfSelectedItem] stringByMatching:@"^.+\\((.+)\\)$" capture:1L]; - + // Check if the user selected the same encoding if ([currentEncoding isEqualToString:newEncoding]) return; - + // Alter table's character set encoding [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ CHARACTER SET = %@", [selectedTable backtickQuotedString], newEncoding]]; - + if ([connection getLastErrorID] == 0) { // Reload the table's data [self reloadTable:self]; } else { [sender selectItemWithTitle:currentEncoding]; - - SPBeginAlertSheet(NSLocalizedString(@"Error changing table encoding", @"error changing table encoding message"), + + SPBeginAlertSheet(NSLocalizedString(@"Error changing table encoding", @"error changing table encoding message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table encoding to '%@'.\n\nMySQL said: %@", @"error changing table encoding informative message"), newEncoding, [connection getLastErrorMessage]]); } @@ -149,21 +149,21 @@ { NSString *newCollation = [sender titleOfSelectedItem]; NSString *currentCollation = [tableDataInstance statusValueForKey:@"Collation"]; - + // Check if the user selected the same collation if ([currentCollation isEqualToString:newCollation]) return; - + // Alter table's character set collation [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ COLLATE = %@", [selectedTable backtickQuotedString], newCollation]]; - + if ([connection getLastErrorID] == 0) { // Reload the table's data [self reloadTable:self]; } else { [sender selectItemWithTitle:currentCollation]; - - SPBeginAlertSheet(NSLocalizedString(@"Error changing table collation", @"error changing table collation message"), + + SPBeginAlertSheet(NSLocalizedString(@"Error changing table collation", @"error changing table collation message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table collation to '%@'.\n\nMySQL said: %@", @"error changing table collation informative message"), newCollation, [connection getLastErrorMessage]]); } @@ -174,7 +174,7 @@ if ([sender tag] == 1) { [tableRowAutoIncrement setEditable:YES]; [tableRowAutoIncrement selectText:nil]; - } + } else { [tableRowAutoIncrement setEditable:NO]; [tableSourceInstance resetAutoIncrement:sender]; @@ -187,58 +187,58 @@ [tableSourceInstance setAutoIncrementTo:[[tableRowAutoIncrement stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; } -- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command +- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command { // Listen to ESC to abort editing of auto increment input field if (command == @selector(cancelOperation:) && control == tableRowAutoIncrement) { [tableRowAutoIncrement abortEditing]; return YES; } - + return NO; } #pragma mark - #pragma mark Other - + /** - * Load all the info for the supplied table by querying the table data instance and updaing the interface + * Load all the info for the supplied table by querying the table data instance and updaing the interface * elements accordingly. * Note that interface elements are also toggled in start/endDocumentTaskForTab:, with similar logic. * Due to the large quantity of interface interaction in this function it is not thread-safe. */ - (void)loadTable:(NSString *)table -{ +{ BOOL enableInteraction = ![[tableDocumentInstance selectedToolbarItemIdentifier] isEqualToString:SPMainToolbarTableInfo] || ![tableDocumentInstance isWorking]; [resetAutoIncrementResetButton setHidden:YES]; // Store the table name away for future use selectedTable = table; - + // Retrieve the table status information via the table data cache NSDictionary *statusFields = [tableDataInstance statusValues]; - + [tableTypePopUpButton removeAllItems]; [tableEncodingPopUpButton removeAllItems]; [tableCollationPopUpButton removeAllItems]; - + // No table selected or view selected if ((!table) || [table isEqualToString:@""] || [[statusFields objectForKey:@"Engine"] isEqualToString:@"View"]) { - + [tableTypePopUpButton setEnabled:NO]; [tableEncodingPopUpButton setEnabled:NO]; [tableCollationPopUpButton setEnabled:NO]; - + if ([[statusFields objectForKey:@"Engine"] isEqualToString:@"View"]) { [tableTypePopUpButton addItemWithTitle:@"View"]; // Set create syntax [tableCreateSyntaxTextView setEditable:YES]; [tableCreateSyntaxTextView shouldChangeTextInRange:NSMakeRange(0, [[tableCreateSyntaxTextView string] length]) replacementString:@""]; [tableCreateSyntaxTextView setString:@""]; - + NSString *createViewSyntax = [[[tableDataInstance tableCreateSyntax] createViewSyntaxPrettifier] stringByAppendingString:@";"]; - + if (createViewSyntax) { [tableCreateSyntaxTextView shouldChangeTextInRange:NSMakeRange(0, 0) replacementString:createViewSyntax]; [tableCreateSyntaxTextView insertText:createViewSyntax]; @@ -252,101 +252,105 @@ [tableCreateSyntaxTextView didChangeText]; [tableCreateSyntaxTextView setEditable:NO]; } - + [tableCreatedAt setStringValue:@""]; [tableUpdatedAt setStringValue:@""]; - + // Set row values [tableRowNumber setStringValue:@""]; [tableRowFormat setStringValue:@""]; [tableRowAvgLength setStringValue:@""]; [tableRowAutoIncrement setStringValue:@""]; - + // Set size values [tableDataSize setStringValue:@""]; [tableMaxDataSize setStringValue:@""]; [tableIndexSize setStringValue:@""]; [tableSizeFree setStringValue:@""]; - - // Set comments + + // Set comments [tableCommentsTextView setEditable:NO]; [tableCommentsTextView shouldChangeTextInRange:NSMakeRange(0, [[tableCommentsTextView string] length]) replacementString:@""]; [tableCommentsTextView setString:@""]; [tableCommentsTextView didChangeText]; - + + if([[statusFields objectForKey:@"Engine"] isEqualToString:@"View"] && [statusFields objectForKey:@"CharacterSetClient"] && [statusFields objectForKey:@"Collation"]) { + [tableEncodingPopUpButton addItemWithTitle:[statusFields objectForKey:@"CharacterSetClient"]]; + [tableCollationPopUpButton addItemWithTitle:[statusFields objectForKey:@"Collation"]]; + } return; } - + NSArray *engines = [databaseDataInstance getDatabaseStorageEngines]; NSArray *encodings = [databaseDataInstance getDatabaseCharacterSetEncodings]; NSArray *collations = [databaseDataInstance getDatabaseCollationsForEncoding:[tableDataInstance tableEncoding]]; - + if (([engines count] > 0) && ([statusFields objectForKey:@"Engine"])) { - + // Populate type popup button for (NSDictionary *engine in engines) - { + { [tableTypePopUpButton addItemWithTitle:[engine objectForKey:@"Engine"]]; - } - + } + [tableTypePopUpButton selectItemWithTitle:[statusFields objectForKey:@"Engine"]]; [tableTypePopUpButton setEnabled:enableInteraction]; } else { [tableTypePopUpButton addItemWithTitle:NSLocalizedString(@"Not available", @"not available label")]; } - + if (([encodings count] > 0) && ([tableDataInstance tableEncoding])) { NSString *selectedTitle = @""; - + // Populate encoding popup button for (NSDictionary *encoding in encodings) - { + { NSString *menuItemTitle = (![encoding objectForKey:@"DESCRIPTION"]) ? [encoding objectForKey:@"CHARACTER_SET_NAME"] : [NSString stringWithFormat:@"%@ (%@)", [encoding objectForKey:@"DESCRIPTION"], [encoding objectForKey:@"CHARACTER_SET_NAME"]]; - + [tableEncodingPopUpButton addItemWithTitle:menuItemTitle]; - + if ([[tableDataInstance tableEncoding] isEqualToString:[encoding objectForKey:@"CHARACTER_SET_NAME"]]) { selectedTitle = menuItemTitle; } - } - + } + [tableEncodingPopUpButton selectItemWithTitle:selectedTitle]; [tableEncodingPopUpButton setEnabled:enableInteraction]; } else { [tableEncodingPopUpButton addItemWithTitle:NSLocalizedString(@"Not available", @"not available label")]; } - + if (([collations count] > 0) && ([statusFields objectForKey:@"Collation"])) { // Populate collation popup button for (NSDictionary *collation in collations) - { + { [tableCollationPopUpButton addItemWithTitle:[collation objectForKey:@"COLLATION_NAME"]]; - } - + } + [tableCollationPopUpButton selectItemWithTitle:[statusFields objectForKey:@"Collation"]]; [tableCollationPopUpButton setEnabled:enableInteraction]; } else { [tableCollationPopUpButton addItemWithTitle:NSLocalizedString(@"Not available", @"not available label")]; } - + [tableCreatedAt setStringValue:[self _formatValueWithKey:@"Create_time" inDictionary:statusFields]]; [tableUpdatedAt setStringValue:[self _formatValueWithKey:@"Update_time" inDictionary:statusFields]]; - + // Set row values [tableRowNumber setStringValue:[self _formatValueWithKey:@"Rows" inDictionary:statusFields]]; [tableRowFormat setStringValue:[self _formatValueWithKey:@"Row_format" inDictionary:statusFields]]; [tableRowAvgLength setStringValue:[self _formatValueWithKey:@"Avg_row_length" inDictionary:statusFields]]; [tableRowAutoIncrement setStringValue:[self _formatValueWithKey:@"Auto_increment" inDictionary:statusFields]]; - + // Set size values [tableDataSize setStringValue:[self _formatValueWithKey:@"Data_length" inDictionary:statusFields]]; [tableMaxDataSize setStringValue:[self _formatValueWithKey:@"Max_data_length" inDictionary:statusFields]]; [tableIndexSize setStringValue:[self _formatValueWithKey:@"Index_length" inDictionary:statusFields]]; [tableSizeFree setStringValue:[self _formatValueWithKey:@"Data_free" inDictionary:statusFields]]; - + // Set comments NSString *commentText = [statusFields objectForKey:@"Comment"]; if (!commentText) commentText = @""; @@ -355,7 +359,7 @@ [tableCommentsTextView setString:commentText]; [tableCommentsTextView didChangeText]; [tableCommentsTextView setEditable:enableInteraction]; - + // Set create syntax [tableCreateSyntaxTextView setEditable:YES]; [tableCreateSyntaxTextView shouldChangeTextInRange:NSMakeRange(0, [[tableCommentsTextView string] length]) replacementString:@""]; @@ -367,7 +371,7 @@ } [tableCreateSyntaxTextView didChangeText]; [tableCreateSyntaxTextView setEditable:NO]; - + // Validate Reset AUTO_INCREMENT button if ([statusFields objectForKey:@"Auto_increment"] && ![[statusFields objectForKey:@"Auto_increment"] isKindOfClass:[NSNull class]]) { [resetAutoIncrementResetButton setHidden:NO]; @@ -418,8 +422,8 @@ NSError *error = nil; NSArray *HTMLExcludes = [NSArray arrayWithObjects:@"doctype", @"html", @"head", @"body", @"xml", nil]; - - NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:NSHTMLTextDocumentType, + + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:NSHTMLTextDocumentType, NSDocumentTypeDocumentAttribute, HTMLExcludes, NSExcludedElementsDocumentAttribute, nil]; // Set tableCreateSyntaxTextView's font size temporarily to 10pt for printing @@ -429,13 +433,13 @@ [tableCreateSyntaxTextView setFont:[NSFont fontWithName:[oldFont fontName] size:10.0]]; // Convert tableCreateSyntaxTextView to HTML - NSData *HTMLData = [[tableCreateSyntaxTextView textStorage] dataFromRange:NSMakeRange(0, [[tableCreateSyntaxTextView string] length]) + NSData *HTMLData = [[tableCreateSyntaxTextView textStorage] dataFromRange:NSMakeRange(0, [[tableCreateSyntaxTextView string] length]) documentAttributes:attributes error:&error]; // Restore original font settings [tableCreateSyntaxTextView setFont:oldFont]; [tableCreateSyntaxTextView setEditable:editableStatus]; - + if (error != nil) { NSLog(@"Error generating table's create syntax HTML for printing. Excluding from print out. Error was: %@", [error localizedDescription]); @@ -445,7 +449,7 @@ NSString *HTMLString = [[[NSString alloc] initWithData:HTMLData encoding:NSUTF8StringEncoding] autorelease]; [tableInfo setObject:HTMLString forKey:@"createSyntax"]; - + return tableInfo; } @@ -455,24 +459,24 @@ - (void)textDidEndEditing:(NSNotification *)notification { id object = [notification object]; - + if ((object == tableCommentsTextView) && ([object isEditable]) && ([selectedTable length] > 0)) { - + NSString *currentComment = [[tableDataInstance statusValueForKey:@"Comment"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSString *newComment = [[tableCommentsTextView string] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // Check that the user actually changed the tables comment if (![currentComment isEqualToString:newComment]) { - + // Alter table's comment [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ COMMENT = '%@'", [selectedTable backtickQuotedString], [connection prepareString:newComment]]]; - + if ([connection getLastErrorID] == 0) { // Reload the table's data [self reloadTable:self]; } else { - SPBeginAlertSheet(NSLocalizedString(@"Error changing table comment", @"error changing table comment message"), + SPBeginAlertSheet(NSLocalizedString(@"Error changing table comment", @"error changing table comment message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table's comment to '%@'.\n\nMySQL said: %@", @"error changing table comment informative message"), newComment, [connection getLastErrorMessage]]); } @@ -506,13 +510,13 @@ if (![[tableDocumentInstance selectedToolbarItemIdentifier] isEqualToString:SPMainToolbarTableInfo]) return; NSDictionary *statusFields = [tableDataInstance statusValues]; - + if (!selectedTable || ![selectedTable length] || [[statusFields objectForKey:@"Engine"] isEqualToString:@"View"]) return; // If we are viewing tables in the information_schema database, then disable all controls that cause table // changes as these tables are not modifiable by anyone. BOOL isInformationSchemaDb = [[tableDocumentInstance database] isEqualToString:@"information_schema"]; - + if ([[databaseDataInstance getDatabaseStorageEngines] count] && [statusFields objectForKey:@"Engine"]) { [tableTypePopUpButton setEnabled:(!isInformationSchemaDb)]; } @@ -540,7 +544,7 @@ [[NSNotificationCenter defaultCenter] removeObserver:self]; [connection release], connection = nil; - + [super dealloc]; } @@ -549,45 +553,45 @@ @implementation SPExtendedTableInfo (PrivateAPI) /** - * Format and returns the value within the info dictionary with the associated key. + * Format and returns the value within the info dictionary with the associated key. */ - (NSString *)_formatValueWithKey:(NSString *)key inDictionary:(NSDictionary *)infoDict { NSString *value = [infoDict objectForKey:key]; - + if ([value isKindOfClass:[NSNull class]]) { value = @""; - } + } else { // Format size strings - if ([key isEqualToString:@"Data_length"] || - [key isEqualToString:@"Max_data_length"] || - [key isEqualToString:@"Index_length"] || + if ([key isEqualToString:@"Data_length"] || + [key isEqualToString:@"Max_data_length"] || + [key isEqualToString:@"Index_length"] || [key isEqualToString:@"Data_free"]) { - + value = [NSString stringForByteSize:[value longLongValue]]; } // Format date strings to the user's long date format else if ([key isEqualToString:@"Create_time"] || [key isEqualToString:@"Update_time"]) { - + // Create date formatter NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; - + [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; - + [dateFormatter setDateStyle:NSDateFormatterLongStyle]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; - + value = [dateFormatter stringFromDate:[NSDate dateWithNaturalLanguageString:value]]; } // Format numbers else if ([key isEqualToString:@"Rows"] || - [key isEqualToString:@"Avg_row_length"] || + [key isEqualToString:@"Avg_row_length"] || [key isEqualToString:@"Auto_increment"]) { - + NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease]; - + [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; value = [numberFormatter stringFromNumber:[NSNumber numberWithLongLong:[value longLongValue]]]; @@ -598,7 +602,7 @@ } } } - + if ([key isEqualToString:@"Auto_increment"]) { return ([value length] > 0) ? value : NSLocalizedString(@"Not available", @"not available label"); } |