diff options
Diffstat (limited to 'Source/SPTableInfo.m')
-rw-r--r-- | Source/SPTableInfo.m | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/Source/SPTableInfo.m b/Source/SPTableInfo.m new file mode 100644 index 00000000..b2b81c05 --- /dev/null +++ b/Source/SPTableInfo.m @@ -0,0 +1,190 @@ +// +// SPTableInfo.m +// sequel-pro +// +// Created by Ben Perry on 6/05/08. +// Copyright 2008 Ben Perry. All rights reserved. +// + +#import "SPTableInfo.h" +#import "ImageAndTextCell.h" +#import <MCPKit_bundled/MCPKit_bundled.h> +#import "CMMCPConnection.h" +#import "CMMCPResult.h" +#import "TableDocument.h" + +@implementation SPTableInfo + +- (id)init +{ + self = [super init]; + info = [[NSMutableArray alloc] init]; + return self; +} + +- (void)awakeFromNib +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(tableChanged:) + name:NSTableViewSelectionDidChangeNotification + object:tableList]; + [info addObject:NSLocalizedString(@"TABLE INFORMATION",@"header for table info pane")]; + [infoTable reloadData]; +} + + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [info release]; + + [super dealloc]; +} + +- (int)numberOfRowsInTableView:(NSTableView *)aTableView +{ + return [info count]; +} + +- (id)tableView:(NSTableView *)aTableView +objectValueForTableColumn:(NSTableColumn *)aTableColumn + row:(int)rowIndex +{ + return [info objectAtIndex:rowIndex]; +} + +- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex +{ + // row 1 and 6 should be editable - ie be able to rename the table and change the auto_increment value. + return NO;//(rowIndex == 1 || rowIndex == 6 ); +} + + +- (BOOL)tableView:(NSTableView *)aTableView isGroupRow:(int)row +{ + // This makes the top row (TABLE INFORMATION) have the diff styling + return (row == 0); +} + +- (void)tableView:(NSTableView *)aTableView + willDisplayCell:(id)aCell + forTableColumn:(NSTableColumn *)aTableColumn + row:(int)rowIndex +{ + if ((rowIndex > 0) && [[aTableColumn identifier] isEqualToString:@"info"]) { + [(ImageAndTextCell*)aCell setImage:[NSImage imageNamed:@"CodeAssistantProtocol"]]; + [(ImageAndTextCell*)aCell setIndentationLevel:1]; + } else { + [(ImageAndTextCell*)aCell setImage:nil]; + [(ImageAndTextCell*)aCell setIndentationLevel:0]; + } +} + +- (void)tableChanged:(NSNotification *)notification +{ + NSString *query; + CMMCPResult *theResult; + NSDictionary *theRow; + + [info removeAllObjects]; + [info addObject:@"TABLE INFORMATION"]; + + if ([tableListInstance table]) + { + if ([(NSString *)[tableListInstance table] isEqualToString:@""]) { + [info addObject:@"multiple tables"]; + + } else { + // Notify that we are about to perform a query + [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryWillBePerformed" object:self]; + + // Create the query and get results + query = [NSString stringWithFormat:@"SHOW TABLE STATUS LIKE '%@'", [tableListInstance table]]; + + // This line triggers a bug when opening a new window. but only after having closed a window + theResult = [[tableDocumentInstance sharedConnection] queryString:query]; + + // Check for errors + if (![[[tableDocumentInstance sharedConnection] getLastErrorMessage] isEqualToString:@""]) { + [info addObject:@"error occurred"]; + return; + } + + // Process result + theRow = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject]; + + // Check for "Create_time" == NULL + if (![[theRow objectForKey:@"Create_time"] isNSNull]) { + // Setup our data formatter + NSDateFormatter *createDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + [createDateFormatter setDateStyle:NSDateFormatterShortStyle]; + [createDateFormatter setTimeStyle:NSDateFormatterNoStyle]; + + // Convert our string date from the result to an NSDate. + NSDate *create_date = [NSDate dateWithNaturalLanguageString:[theRow objectForKey:@"Create_time"]]; + + // Add the creation date to the infoTable + [info addObject:[NSString stringWithFormat:@"created: %@", [createDateFormatter stringFromDate:create_date]]]; + } + + // Check for "Update_time" == NULL - InnoDB tables don't have an update time + if (![[theRow objectForKey:@"Update_time"] isNSNull]) { + // Setup our data formatter + NSDateFormatter *updateDateFormatter = [[[NSDateFormatter alloc] init] autorelease]; + [updateDateFormatter setDateStyle:NSDateFormatterShortStyle]; + [updateDateFormatter setTimeStyle:NSDateFormatterNoStyle]; + + // Convert our string date from the result to an NSDate. + NSDate *update_date = [NSDate dateWithNaturalLanguageString:[theRow objectForKey:@"Update_time"]]; + + // Add the update date to the infoTable + [info addObject:[NSString stringWithFormat:@"updated: %@", [updateDateFormatter stringFromDate:update_date]]]; + } + + [info addObject:[NSString stringWithFormat:@"rows: %@", [theRow objectForKey:@"Rows"]]]; + [info addObject:[NSString stringWithFormat:@"size: %@", [self sizeFromBytes:[[theRow objectForKey:@"Data_length"] intValue]]]]; + [info addObject:[NSString stringWithFormat:@"encoding: %@", [[[theRow objectForKey:@"Collation"] componentsSeparatedByString:@"_"] objectAtIndex:0]]]; + [info addObject:[NSString stringWithFormat:@"auto_increment: %@", [theRow objectForKey:@"Auto_increment"]]]; + + // Notify that we've finished performing the query + [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:self]; + } + } + + [infoTable reloadData]; +} + +- (NSString *)sizeFromBytes:(int)theSize +{ + NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease]; + float floatSize = theSize; + + [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; + + if (theSize < 1023) { + [numberFormatter setFormat:@"#,##0 B"]; + return [numberFormatter stringFromNumber:[NSNumber numberWithInt:theSize]]; + } + + floatSize = floatSize / 1024; + + if (floatSize < 1023) { + [numberFormatter setFormat:@"#,##0.0 KB"]; + return [numberFormatter stringFromNumber:[NSNumber numberWithFloat:floatSize]]; + } + + floatSize = floatSize / 1024; + + if (floatSize < 1023) { + [numberFormatter setFormat:@"#,##0.0 MB"]; + return [numberFormatter stringFromNumber:[NSNumber numberWithFloat:floatSize]]; + } + + floatSize = floatSize / 1024; + + [numberFormatter setFormat:@"#,##0.0 GB"]; + return [numberFormatter stringFromNumber:[NSNumber numberWithFloat:floatSize]]; +} + +@end |