aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m29
-rw-r--r--Source/SPConnectionDelegate.m4
-rw-r--r--Source/SPSSHTunnel.m3
3 files changed, 22 insertions, 14 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
index 7a3c9c8c..d112189f 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
@@ -103,6 +103,7 @@ static BOOL sTruncateLongFieldInLogs = YES;
lastQueryExecutedAtTime = CGFLOAT_MAX;
queryCancelled = NO;
queryCancelUsedReconnect = NO;
+ serverVersionString = nil;
// Initialize ivar defaults
connectionTimeout = 10;
@@ -372,20 +373,13 @@ static BOOL sTruncateLongFieldInLogs = YES;
}
mConnected = NO;
-
+
if (connectionProxy) {
[connectionProxy disconnect];
}
- if (serverVersionString != nil) {
- [serverVersionString release];
- serverVersionString = nil;
- }
-
- if (theDbStructure != nil) {
- [theDbStructure release];
- theDbStructure = nil;
- }
+ if (serverVersionString) [serverVersionString release], serverVersionString = nil;
+ if (theDbStructure) [theDbStructure release], theDbStructure = nil;
[self stopKeepAliveTimer];
}
@@ -2382,12 +2376,25 @@ void performThreadedKeepAlive(void *ptr)
{
delegate = nil;
+ // Release the query lock, after unlocking it
+ [queryLock tryLock];
+ [queryLock unlock];
+ [queryLock release];
+
+ // Clean up connections if necessary
+ if (mConnected) [self disconnect];
+ if (connectionProxy) {
+ [connectionProxy setConnectionStateChangeSelector:NULL delegate:nil];
+ [connectionProxy disconnect];
+ }
+
if (lastQueryErrorMessage) [lastQueryErrorMessage release];
if (connectionHost) [connectionHost release];
if (connectionLogin) [connectionLogin release];
if (connectionSocket) [connectionSocket release];
if (connectionPassword) [connectionPassword release];
- [queryLock release];
+ if (serverVersionString) [serverVersionString release], serverVersionString = nil;
+ if (theDbStructure) [theDbStructure release], theDbStructure = nil;
[super dealloc];
}
diff --git a/Source/SPConnectionDelegate.m b/Source/SPConnectionDelegate.m
index ff0cca23..fea894b6 100644
--- a/Source/SPConnectionDelegate.m
+++ b/Source/SPConnectionDelegate.m
@@ -118,7 +118,7 @@
// If 'disconnect' was selected, trigger a window close.
if (connectionErrorCode == MCPConnectionCheckDisconnect) {
- [self performSelectorOnMainThread:@selector(closeConnection) withObject:nil waitUntilDone:YES];
+ [self performSelectorOnMainThread:@selector(closeDocumentWindowAndDisconnect:) withObject:nil waitUntilDone:YES];
}
return connectionErrorCode;
@@ -130,7 +130,7 @@
* everything up before it's all deallocated as a result of the close.
* Also sets alpha to fully transparent so accidental dialogs are hidden!
*/
-- (void) closeConnection
+- (void) closeDocumentWindowAndDisconnect
{
_isConnected = NO;
[self windowWillClose:nil];
diff --git a/Source/SPSSHTunnel.m b/Source/SPSSHTunnel.m
index f74804ca..4779e6a1 100644
--- a/Source/SPSSHTunnel.m
+++ b/Source/SPSSHTunnel.m
@@ -59,7 +59,7 @@
// Set up a connection for use by the tunnel process
tunnelConnectionName = [[NSString alloc] initWithFormat:@"SequelPro-%lu", (unsigned long)[[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] hash]];
tunnelConnectionVerifyHash = [[NSString alloc] initWithFormat:@"%lu", (unsigned long)[[NSString stringWithFormat:@"%f-seeded", [[NSDate date] timeIntervalSince1970]] hash]];
- tunnelConnection = [[NSConnection defaultConnection] retain];
+ tunnelConnection = [NSConnection new];
[tunnelConnection runInNewThread];
[tunnelConnection removeRunLoop:[NSRunLoop currentRunLoop]];
[tunnelConnection setRootObject:self];
@@ -593,6 +593,7 @@
[remoteHost release];
[tunnelConnectionName release];
[tunnelConnectionVerifyHash release];
+ [tunnelConnection invalidate];
[tunnelConnection release];
[debugMessages release];
if (password) [password release];