aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPDatabaseData.h5
-rw-r--r--Source/SPDatabaseData.m89
-rw-r--r--Source/SPServerSupport.h8
-rw-r--r--Source/SPServerSupport.m8
4 files changed, 76 insertions, 34 deletions
diff --git a/Source/SPDatabaseData.h b/Source/SPDatabaseData.h
index 9eb4551c..abd3a27b 100644
--- a/Source/SPDatabaseData.h
+++ b/Source/SPDatabaseData.h
@@ -46,6 +46,8 @@
NSString *characterSetEncoding;
NSString *defaultCharacterSetEncoding;
NSString *defaultCollation;
+ NSString *serverDefaultCharacterSetEncoding;
+ NSString *serverDefaultCollation;
NSString *defaultStorageEngine;
NSMutableArray *collations;
@@ -79,4 +81,7 @@
- (NSString *)getDatabaseDefaultCollation;
- (NSString *)getDatabaseDefaultStorageEngine;
+- (NSString *)getServerDefaultCharacterSet;
+- (NSString *)getServerDefaultCollation;
+
@end
diff --git a/Source/SPDatabaseData.m b/Source/SPDatabaseData.m
index 835c7328..787f5e1e 100644
--- a/Source/SPDatabaseData.m
+++ b/Source/SPDatabaseData.m
@@ -38,6 +38,7 @@
@interface SPDatabaseData ()
+- (NSString *)_getSingleVariableValue:(NSString *)variable;
- (NSArray *)_getDatabaseDataForQuery:(NSString *)query;
+ (NSArray *)_relabelCollationResult:(NSArray *)data;
@@ -61,6 +62,8 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
characterSetEncoding = nil;
defaultCollation = nil;
defaultCharacterSetEncoding = nil;
+ serverDefaultCollation = nil;
+ serverDefaultCharacterSetEncoding = nil;
collations = [[NSMutableArray alloc] init];
characterSetCollations = [[NSMutableArray alloc] init];
@@ -84,6 +87,8 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
if (characterSetEncoding != nil) [characterSetEncoding release], characterSetEncoding = nil;
if (defaultCollation != nil) [defaultCollation release], defaultCollation = nil;
if (defaultCharacterSetEncoding != nil) [defaultCharacterSetEncoding release], defaultCharacterSetEncoding = nil;
+ if (serverDefaultCharacterSetEncoding) [serverDefaultCharacterSetEncoding release], serverDefaultCharacterSetEncoding = nil;
+ if (serverDefaultCollation) [serverDefaultCollation release], serverDefaultCollation = nil;
[collations removeAllObjects];
[characterSetCollations removeAllObjects];
@@ -191,15 +196,10 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
[storageEngines addObject:[NSDictionary dictionaryWithObject:@"MyISAM" forKey:@"Engine"]];
// Check if InnoDB support is enabled
- SPMySQLResult *result = [connection queryString:@"SHOW VARIABLES LIKE 'have_innodb'"];
+ NSString *result = [self _getSingleVariableValue:@"have_innodb"];
- [result setReturnDataAsStrings:YES];
-
- if ([result numberOfRows] == 1) {
- if ([[[result getRowAsDictionary] objectForKey:@"Value"] isEqualToString:@"YES"]) {
- [storageEngines addObject:[NSDictionary dictionaryWithObject:@"InnoDB" forKey:@"Engine"]];
- }
- }
+ if(result && [result isEqualToString:@"YES"])
+ [storageEngines addObject:[NSDictionary dictionaryWithObject:@"InnoDB" forKey:@"Engine"]];
// Before MySQL 4.1 the MEMORY engine was known as HEAP and the ISAM engine was included
if ([serverSupport supportsPre41StorageEngines]) {
@@ -319,13 +319,9 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
if (!defaultCharacterSetEncoding) {
[defaultCharacterSetEncoding release];
- NSString *variable = [serverSupport supportsCharacterSetDatabaseVar] ? @"character_set_database" : @"character_set";
-
- SPMySQLResult *result = [connection queryString:[NSString stringWithFormat:@"SHOW VARIABLES LIKE %@", [variable tickQuotedString]]];
-
- [result setReturnDataAsStrings:YES];
+ NSString *variable = [serverSupport supportsCharacterSetAndCollationVars] ? @"character_set_database" : @"character_set";
- defaultCharacterSetEncoding = [[[result getRowAsDictionary] objectForKey:@"Value"] retain];
+ defaultCharacterSetEncoding = [[self _getSingleVariableValue:variable] retain];
}
return defaultCharacterSetEncoding;
@@ -341,14 +337,44 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
if (!defaultCollation) {
[defaultCollation release];
- SPMySQLResult *result = [connection queryString:@"SHOW VARIABLES LIKE 'collation_database'"];
+ defaultCollation = [[self _getSingleVariableValue:@"collation_database"] retain];
+ }
+
+ return defaultCollation;
+}
+
+/**
+ * Returns the server's default character set encoding.
+ *
+ * @return The default encoding as a string
+ */
+- (NSString *)getServerDefaultCharacterSet
+{
+ if (!serverDefaultCharacterSetEncoding) {
+ [serverDefaultCharacterSetEncoding release];
- [result setReturnDataAsStrings:YES];
+ NSString *variable = [serverSupport supportsCharacterSetAndCollationVars] ? @"character_set_server" : @"character_set";
- defaultCollation = [[[result getRowAsDictionary] objectForKey:@"Value"] retain];
+ serverDefaultCharacterSetEncoding = [[self _getSingleVariableValue:variable] retain];
}
+
+ return serverDefaultCharacterSetEncoding;
+}
+
+/**
+ * Returns the server's default collation.
+ *
+ * @return The default collation as a string (nil on MySQL 3 databases)
+ */
+- (NSString *)getServerDefaultCollation
+{
+ if (!serverDefaultCollation) {
+ [serverDefaultCollation release];
- return defaultCollation;
+ serverDefaultCollation = [[self _getSingleVariableValue:@"collation_server"] retain];
+ }
+
+ return serverDefaultCollation;
}
/**
@@ -375,11 +401,7 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
}
// Retrieve the corresponding value for the determined key, ensuring return as a string
- SPMySQLResult *result = [connection queryString:[NSString stringWithFormat:@"SHOW VARIABLES LIKE %@", [storageEngineKey tickQuotedString]]];;
-
- [result setReturnDataAsStrings:YES];
-
- defaultStorageEngine = [[[result getRowAsDictionary] objectForKey:@"Value"] retain];
+ defaultStorageEngine = [[self _getSingleVariableValue:storageEngineKey] retain];
}
return defaultStorageEngine;
@@ -389,6 +411,23 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
#pragma mark Private API
/**
+ * Look up the value of a single server variable
+ * @param variable The name of a server variable. Must not contain wildcards
+ * @return The value as string or nil if no such variable exists or the result is ambigious
+ */
+- (NSString *)_getSingleVariableValue:(NSString *)variable
+{
+ SPMySQLResult *result = [connection queryString:[NSString stringWithFormat:@"SHOW VARIABLES LIKE %@", [variable tickQuotedString]]];;
+
+ [result setReturnDataAsStrings:YES];
+
+ if ([result numberOfRows] != 1)
+ return nil;
+
+ return [[result getRowAsDictionary] objectForKey:@"Value"];
+}
+
+/**
* Executes the supplied query against the current connection and returns the result as an array of
* NSDictionarys, one for each row.
*/
@@ -455,9 +494,7 @@ NSInteger _sortStorageEngineEntry(NSDictionary *itemOne, NSDictionary *itemTwo,
- (void)dealloc
{
- if (characterSetEncoding) [characterSetEncoding release], characterSetEncoding = nil;
- if (defaultCharacterSetEncoding) [defaultCharacterSetEncoding release], defaultCharacterSetEncoding = nil;
- if (defaultCollation) [defaultCollation release], defaultCollation = nil;
+ [self resetAllData];
[collations release], collations = nil;
[characterSetCollations release], characterSetCollations = nil;
diff --git a/Source/SPServerSupport.h b/Source/SPServerSupport.h
index 2f562177..4cb68726 100644
--- a/Source/SPServerSupport.h
+++ b/Source/SPServerSupport.h
@@ -62,7 +62,7 @@
// Encoding
BOOL supportsShowCharacterSet;
BOOL supportsShowCollation;
- BOOL supportsCharacterSetDatabaseVar;
+ BOOL supportsCharacterSetAndCollationVars;
BOOL supportsPost41CharacterSetHandling;
// User account related
@@ -150,10 +150,10 @@
@property (readonly) BOOL supportsShowCollation;
/**
- * @property supportsCharacterSetDatabaseVar Indicates if the server supports the 'character_set_database'
- * variable.
+ * @property supportsCharacterSetAndCollationVars Indicates if the server supports the 'character_set_*' and 'collation_*'
+ * variables.
*/
-@property (readonly) BOOL supportsCharacterSetDatabaseVar;
+@property (readonly) BOOL supportsCharacterSetAndCollationVars;
/**
* @property supportsPost41CharacterSetHandling Indicates whether the server supports post 4.1 character set
diff --git a/Source/SPServerSupport.m b/Source/SPServerSupport.m
index b32a9dc2..78a2b287 100644
--- a/Source/SPServerSupport.m
+++ b/Source/SPServerSupport.m
@@ -56,7 +56,7 @@
@synthesize supportsSpatialExtensions;
@synthesize supportsShowCharacterSet;
@synthesize supportsShowCollation;
-@synthesize supportsCharacterSetDatabaseVar;
+@synthesize supportsCharacterSetAndCollationVars;
@synthesize supportsPost41CharacterSetHandling;
@synthesize supportsCreateUser;
@synthesize supportsRenameUser;
@@ -142,8 +142,8 @@
// The SHOW COLLATION statement wasn't added until MySQL 4.1.0
supportsShowCollation = [self isEqualToOrGreaterThanMajorVersion:4 minor:1 release:0];
- // The variable 'character_set_database' wasn't added until MySQL 4.1.1
- supportsCharacterSetDatabaseVar = [self isEqualToOrGreaterThanMajorVersion:4 minor:1 release:1];
+ // The variables 'character_set_*' and 'collation_*' weren't added until MySQL 4.1.1
+ supportsCharacterSetAndCollationVars = [self isEqualToOrGreaterThanMajorVersion:4 minor:1 release:1];
// As of MySQL 4.1 encoding support was greatly improved
supportsPost41CharacterSetHandling = [self isEqualToOrGreaterThanMajorVersion:4 minor:1 release:0];
@@ -263,7 +263,7 @@
supportsSpatialExtensions = NO;
supportsShowCharacterSet = NO;
supportsShowCollation = NO;
- supportsCharacterSetDatabaseVar = NO;
+ supportsCharacterSetAndCollationVars = NO;
supportsPost41CharacterSetHandling = NO;
supportsCreateUser = NO;
supportsRenameUser = NO;