aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/MCPKit/MCPFoundationKit
diff options
context:
space:
mode:
Diffstat (limited to 'Frameworks/MCPKit/MCPFoundationKit')
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m25
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h3
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m50
3 files changed, 71 insertions, 7 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
index 7efe4499..cf66a102 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
@@ -34,15 +34,14 @@
#import "MCPConnectionProxy.h"
#import "MCPConnectionDelegate.h"
#import "MCPStringAdditions.h"
-#import "SPStringAdditions.h"
-#import "RegexKitLite.h"
+#import "RegexKitLite.h" // TODO: Remove along with queryDbStructureWithUserInfo
#import "NSNotificationAdditions.h"
#include <unistd.h>
#include <mach/mach_time.h>
#include <SystemConfiguration/SystemConfiguration.h>
-const NSUInteger kMCPConnectionDefaultOption = CLIENT_COMPRESS | CLIENT_REMEMBER_OPTIONS | CLIENT_MULTI_RESULTS;
+const NSUInteger kMCPConnectionDefaultOption = CLIENT_COMPRESS | CLIENT_REMEMBER_OPTIONS | CLIENT_MULTI_RESULTS | CLIENT_INTERACTIVE;
const char *kMCPConnectionDefaultSocket = MYSQL_UNIX_ADDR;
const char *kMCPSSLCipherList = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RSA-AES128-SHA:AES128-SHA:AES256-RMD:AES128-RMD:DES-CBC3-RMD:DHE-RSA-AES256-RMD:DHE-RSA-AES128-RMD:DHE-RSA-DES-CBC3-RMD:RC4-SHA:RC4-MD5:DES-CBC3-SHA:DES-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC-SHA";
const NSUInteger kMCPConnection_Not_Inited = 1000;
@@ -166,7 +165,8 @@ static BOOL sTruncateLongFieldInLogs = YES;
lastQueryErrorId = 0;
lastQueryErrorMessage = nil;
lastQueryAffectedRows = 0;
- lastPingSuccess = NO;
+ lastPingSuccess = NO;
+ delegate = nil;
delegateSupportsConnectionLostDecisions = NO;
delegateResponseToWillQueryString = NO;
@@ -525,7 +525,9 @@ static BOOL sTruncateLongFieldInLogs = YES;
} while (![self tryLockConnection]);
[self unlockConnection];
- if (mConnection->net.vio && mConnection->net.buff) mysql_close(mConnection);
+ // Only close the connection if it appears to still be active, and not reading or
+ // writing. This may result in a leak, but minimises crashes.
+ if (!mConnection->net.reading_or_writing && mConnection->net.vio && mConnection->net.buff) mysql_close(mConnection);
mConnection = NULL;
}
@@ -580,6 +582,7 @@ static BOOL sTruncateLongFieldInLogs = YES;
// Close the connection if it exists.
if (mConnected) {
+ mConnected = NO;
// Allow any pings or query cleanups to complete - within a time limit.
uint64_t startTime_t, currentTime_t;
@@ -594,11 +597,12 @@ static BOOL sTruncateLongFieldInLogs = YES;
} while (![self tryLockConnection]);
[self unlockConnection];
- if (mConnection->net.vio && mConnection->net.buff) mysql_close(mConnection);
+ // Only close the connection if it's not reading or writing - this may result
+ // in leaks, but minimises crashes.
+ if (!mConnection->net.reading_or_writing) mysql_close(mConnection);
mConnection = NULL;
}
- mConnected = NO;
isDisconnecting = NO;
[self lockConnection];
@@ -2014,6 +2018,13 @@ void pingThreadCleanup(void *pingDetails)
NSLog(@"Task cancelletion MySQL init failed.");
}
+ // As the attempt may have taken up to the connection timeout, check lock status
+ // again, returning if nothing is required.
+ if ([self tryLockConnection]) {
+ [self unlockConnection];
+ return;
+ }
+
// Reset the connection
[self unlockConnection];
if (!isDisconnecting) [self reconnect];
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h b/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h
index 36693703..bf57b789 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h
@@ -40,4 +40,7 @@ static inline NSData *NSStringDataUsingLossyEncoding(NSString *self, NSInteger e
@interface NSString (MCPStringAdditions)
+- (NSString *)backtickQuotedString;
+- (NSString *)tickQuotedString;
+
@end
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m
new file mode 100644
index 00000000..bd5b06cd
--- /dev/null
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m
@@ -0,0 +1,50 @@
+//
+// $Id$
+//
+// MCPStringAdditions.m
+// sequel-pro
+//
+// Created by Stuart Connolly (stuconnolly.com) on March 25, 2010
+// Copyright (c) 2010 Stuart Connolly. All rights reserved.
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// More info at <http://code.google.com/p/sequel-pro/>
+
+
+
+@implementation NSString (MCPStringAdditions)
+
+/**
+ * Returns the string quoted with backticks as required for MySQL identifiers
+ * eg.: tablename => `tablename`
+ * my`table => `my``table`
+ */
+- (NSString *)backtickQuotedString
+{
+ return [NSString stringWithFormat: @"`%@`", [self stringByReplacingOccurrencesOfString:@"`" withString:@"``"]];
+}
+
+/**
+ * Returns the string quoted with ticks as required for MySQL identifiers
+ * eg.: tablename => 'tablename'
+ * my'table => 'my''table'
+ */
+- (NSString *)tickQuotedString
+{
+ return [NSString stringWithFormat: @"'%@'", [self stringByReplacingOccurrencesOfString:@"'" withString:@"''"]];
+}
+
+@end