aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2008-12-09 00:08:35 +0000
committerstuconnolly <stuart02@gmail.com>2008-12-09 00:08:35 +0000
commita6c17dfdaa46f413ee8aee6d39904eb89454f813 (patch)
tree4dc1b40656543e2e40ebc7ed33acec2203ef98a5
parentd7892ee21760a09fcedaa46e8a2f544146bd9a29 (diff)
downloadsequelpro-a6c17dfdaa46f413ee8aee6d39904eb89454f813.tar.gz
sequelpro-a6c17dfdaa46f413ee8aee6d39904eb89454f813.tar.bz2
sequelpro-a6c17dfdaa46f413ee8aee6d39904eb89454f813.zip
- Partial fix for issue #109 by making the option to 'Autodetect' character encoding specific to each table
- Added the selected table's character encoding to the table information pane and removed the table's name
-rw-r--r--SPTableInfo.m4
-rw-r--r--TableDocument.h6
-rw-r--r--TableDocument.m45
-rw-r--r--TablesList.h4
-rw-r--r--TablesList.m14
5 files changed, 49 insertions, 24 deletions
diff --git a/SPTableInfo.m b/SPTableInfo.m
index 5e777429..5f395c59 100644
--- a/SPTableInfo.m
+++ b/SPTableInfo.m
@@ -114,9 +114,6 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
// Process result
theRow = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject];
- // Add the table name to the infoTable
- [info addObject:[NSString stringWithFormat:@"name: %@", [tableListInstance table]]];
-
// Check for "Create_time" == NULL
if (![[theRow objectForKey:@"Create_time"] isNSNull]) {
// Setup our data formatter
@@ -135,6 +132,7 @@ objectValueForTableColumn:(NSTableColumn *)aTableColumn
[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
diff --git a/TableDocument.h b/TableDocument.h
index ac20b335..62798b2d 100644
--- a/TableDocument.h
+++ b/TableDocument.h
@@ -134,7 +134,8 @@
//encoding methods
- (void)setEncoding:(NSString *)encoding;
-- (void)detectEncoding;
+- (void)detectDatabaseEncoding;
+- (void)detectTableEncodingForTable:(NSString *)table;
- (IBAction)chooseEncoding:(id)sender;
- (BOOL)supportsEncoding;
- (void)updateEncodingMenuWithSelectedEncoding:(NSString *)encoding;
@@ -214,9 +215,6 @@
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex;
-//for freeing up memory
-- (void)dealloc;
-
@end
extern NSString *TableDocumentFavoritesControllerSelectionIndexDidChange;
diff --git a/TableDocument.m b/TableDocument.m
index e88a62ad..8ca7b0ae 100644
--- a/TableDocument.m
+++ b/TableDocument.m
@@ -182,7 +182,7 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa
// set encoding
NSString *encodingName = [prefs objectForKey:@"encoding"];
if ( [encodingName isEqualToString:@"Autodetect"] ) {
- [self detectEncoding];
+ [self detectDatabaseEncoding];
} else {
[self setEncoding:[self mysqlEncodingFromDisplayEncoding:encodingName]];
}
@@ -632,14 +632,15 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa
{
// set encoding of connection and client
[mySQLConnection queryString:[NSString stringWithFormat:@"SET NAMES '%@'", mysqlEncoding]];
+
if ( [[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) {
[mySQLConnection setEncoding:[CMMCPConnection encodingForMySQLEncoding:[mysqlEncoding UTF8String]]];
[_encoding autorelease];
_encoding = [mysqlEncoding retain];
} else {
- [self detectEncoding];
+ [self detectDatabaseEncoding];
}
-
+
// update the selected menu item
[self updateEncodingMenuWithSelectedEncoding:[self encodingNameFromMySQLEncoding:mysqlEncoding]];
@@ -742,9 +743,9 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa
/**
* Autodetect the connection encoding and select the relevant encoding menu item in Database -> Database Encoding
*/
-- (void)detectEncoding
+- (void)detectDatabaseEncoding
{
- // mysql > 4.0
+ // MySQL > 4.0
id mysqlEncoding = [[[mySQLConnection queryString:@"SHOW VARIABLES LIKE 'character_set_connection'"] fetchRowAsDictionary] objectForKey:@"Value"];
_supportsEncoding = (mysqlEncoding != nil);
@@ -755,9 +756,10 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa
mysqlEncoding = [[[mySQLConnection queryString:@"SHOW VARIABLES LIKE 'character_set'"] fetchRowAsDictionary] objectForKey:@"Value"];
}
if ( !mysqlEncoding ) { // older version? -> set encoding to mysql default encoding latin1
- NSLog(@"error: no character encoding found, mysql version is %@", [self mySQLVersion]);
+ NSLog(@"Error: no character encoding found, mysql version is %@", [self mySQLVersion]);
mysqlEncoding = @"latin1";
}
+
[mySQLConnection setEncoding:[CMMCPConnection encodingForMySQLEncoding:[mysqlEncoding cString]]];
// save the encoding
@@ -769,7 +771,36 @@ NSString *TableDocumentFavoritesControllerFavoritesDidChange = @"TableDocumentFa
}
/**
- * when sent by an NSMenuItem, will set the encoding based on the title of the menu item
+ * Detects and sets the character set encoding of the supplied table name.
+ */
+- (void)detectTableEncodingForTable:(NSString *)table;
+{
+ NSString *tableCollation = [[[mySQLConnection queryString:[NSString stringWithFormat:@"SHOW TABLE STATUS WHERE NAME = '%@'", table]] fetchRowAsDictionary] objectForKey:@"Collation"];
+
+ if (tableCollation != nil) {
+ // Split up the collation string so we can get the encoding
+ NSArray *encodingComponents = [tableCollation componentsSeparatedByString:@"_"];
+
+ if ([encodingComponents count] > 0) {
+ NSString *tableEncoding = [encodingComponents objectAtIndex:0];
+
+ [mySQLConnection setEncoding:[CMMCPConnection encodingForMySQLEncoding:[tableEncoding UTF8String]]];
+
+ // Save the encoding
+ [_encoding autorelease];
+ _encoding = [tableEncoding retain];
+
+ // update the selected menu item
+ [self updateEncodingMenuWithSelectedEncoding:[self encodingNameFromMySQLEncoding:tableEncoding]];
+ }
+ }
+ else {
+ NSLog(@"Error: unable to determine table collation and thus character encoding for table '%@'", table);
+ }
+}
+
+/**
+ * When sent by an NSMenuItem, will set the encoding based on the title of the menu item
*/
- (IBAction)chooseEncoding:(id)sender
{
diff --git a/TablesList.h b/TablesList.h
index d7d37d2e..7270219b 100644
--- a/TablesList.h
+++ b/TablesList.h
@@ -92,8 +92,4 @@
- (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTableView;
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification;
-//last but not least
-- (id)init;
-- (void)dealloc;
-
@end
diff --git a/TablesList.m b/TablesList.m
index 500ac349..40ea87c5 100644
--- a/TablesList.m
+++ b/TablesList.m
@@ -543,12 +543,12 @@ traps enter and esc and edit/cancel without entering next row
}
}
-/*
-loads a table in content or source view (if tab selected)
-*/
+/**
+ * Loads a table in content or source view (if tab selected)
+ */
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
- if ( [tablesListView numberOfSelectedRows] == 1 ) {
+ if ( [tablesListView numberOfSelectedRows] == 1 ) {
if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == 0 ) {
[tableSourceInstance loadTable:[tables objectAtIndex:[tablesListView selectedRow]]];
structureLoaded = YES;
@@ -575,6 +575,10 @@ loads a table in content or source view (if tab selected)
[tableWindow setTitle:[NSString stringWithFormat:@"(MySQL %@) %@@%@/%@/%@", [tableDocumentInstance mySQLVersion], [tableDocumentInstance user],
[tableDocumentInstance host], [tableDocumentInstance database], [tables objectAtIndex:[tablesListView selectedRow]]]];
+ // Update connection characater set encoding based on the table's encoding if required
+ if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"encoding"] isEqualToString:@"Autodetect"]) {
+ [tableDocumentInstance detectTableEncodingForTable:[tables objectAtIndex:[tablesListView selectedRow]]];
+ }
} else {
[tableSourceInstance loadTable:nil];
[tableContentInstance loadTable:nil];
@@ -589,8 +593,6 @@ loads a table in content or source view (if tab selected)
}
}
-
-
- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(int)rowIndex
{
return (rowIndex != 0);