aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/CMMCPConnection.h1
-rw-r--r--Source/CMMCPConnection.m23
2 files changed, 20 insertions, 4 deletions
diff --git a/Source/CMMCPConnection.h b/Source/CMMCPConnection.h
index eece0d3c..bdda78ec 100644
--- a/Source/CMMCPConnection.h
+++ b/Source/CMMCPConnection.h
@@ -30,6 +30,7 @@
- (void)willQueryString:(NSString *)query;
- (void)queryGaveError:(NSString *)error;
+- (BOOL)connectionEncodingViaLatin1;
@end
diff --git a/Source/CMMCPConnection.m b/Source/CMMCPConnection.m
index 41a828e2..9f8c78fa 100644
--- a/Source/CMMCPConnection.m
+++ b/Source/CMMCPConnection.m
@@ -146,8 +146,8 @@ static void forcePingTimeout(int signalNumber);
if (delegate && [delegate valueForKey:@"_encoding"]) {
currentEncoding = [NSString stringWithString:[delegate valueForKey:@"_encoding"]];
}
- if (delegate && [delegate boolForKey:@"_encodingViaLatin1"]) {
- currentEncodingUsesLatin1Transport = [delegate boolForKey:@"_encodingViaLatin1"];
+ if (delegate && [delegate respondsToSelector:@selector(connectionEncodingViaLatin1)]) {
+ currentEncodingUsesLatin1Transport = [delegate connectionEncodingViaLatin1];
}
// Close the connection if it exists.
@@ -178,10 +178,10 @@ static void forcePingTimeout(int signalNumber);
[self selectDB:currentDatabase];
}
if (currentEncoding) {
- [self queryString:[NSString stringWithFormat:@"SET NAMES '%@'", currentEncoding]];
+ [self queryString:[NSString stringWithFormat:@"/*!40101 SET NAMES '%@' */", currentEncoding]];
[self setEncoding:[CMMCPConnection encodingForMySQLEncoding:[currentEncoding UTF8String]]];
if (currentEncodingUsesLatin1Transport) {
- [self queryString:@"SET CHARACTER_SET_RESULTS=latin1"];
+ [self queryString:@"/*!40101 SET CHARACTER_SET_RESULTS=latin1 */"];
}
}
} else if (parentWindow) {
@@ -444,10 +444,15 @@ static void forcePingTimeout(int signalNumber);
*/
- (BOOL)checkConnection
{
+ unsigned long threadid;
+
if (!mConnected) return NO;
BOOL connectionVerified = FALSE;
+ // Get the current thread ID for this connection
+ threadid = mConnection->thread_id;
+
// Check whether the connection is still operational via a wrapped version of MySQL ping.
connectionVerified = [self pingConnection];
@@ -474,6 +479,16 @@ static void forcePingTimeout(int signalNumber);
default:
return [self checkConnection];
}
+
+ // If a connection exists, check whether the thread id differs; if so, the connection has
+ // probably been reestablished and we need to reset the connection encoding
+ } else if (threadid != mConnection->thread_id) {
+ if (delegate && [delegate valueForKey:@"_encoding"]) {
+ [self queryString:[NSString stringWithFormat:@"/*!40101 SET NAMES '%@' */", [NSString stringWithString:[delegate valueForKey:@"_encoding"]]]];
+ if (delegate && [delegate respondsToSelector:@selector(connectionEncodingViaLatin1)]) {
+ if ([delegate connectionEncodingViaLatin1]) [self queryString:@"/*!40101 SET CHARACTER_SET_RESULTS=latin1 */"];
+ }
+ }
}
return connectionVerified;