From b26a4c45cbafedefe0247971c1ae9961abfe24c3 Mon Sep 17 00:00:00 2001 From: stuconnolly Date: Wed, 3 Aug 2011 19:40:45 +0000 Subject: Bring outline view up to date with trunk (r3307:r3375). --- Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m | 25 ++++++++--- .../MCPKit/MCPFoundationKit/MCPStringAdditions.h | 3 ++ .../MCPKit/MCPFoundationKit/MCPStringAdditions.m | 50 ++++++++++++++++++++++ 3 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m (limited to 'Frameworks/MCPKit/MCPFoundationKit') 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 #include #include -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 + + + +@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 -- cgit v1.2.3