diff options
6 files changed, 37 insertions, 35 deletions
diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h b/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h index 99daca77..8fdf4e7e 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h +++ b/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h @@ -47,7 +47,6 @@ - (void)_disconnect; - (void)_updateConnectionVariables; - (void)_restoreConnectionVariables; -- (BOOL)_checkConnectionIfNecessary; - (void)_validateThreadSetup; + (void)_removeThreadVariables:(NSNotification *)aNotification; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m index d96ebe52..594756be 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m @@ -79,7 +79,7 @@ // Ensure per-thread variables are set up [self _validateThreadSetup]; - if (![self _checkConnectionIfNecessary]) return nil; + if (![self checkConnectionIfNecessary]) return nil; // Perform a lossy conversion to bytes, using NSData to do the hard work. Preserves // nul characters correctly. @@ -259,7 +259,7 @@ [self _validateThreadSetup]; // Check the connection if necessary, returning nil if the state couldn't be validated - if (![self _checkConnectionIfNecessary]) return nil; + if (![self checkConnectionIfNecessary]) return nil; // Determine whether a maximum query size needs to be restored from a previous query if (queryActionShouldRestoreMaxQuerySize != NSNotFound) { diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m index db846929..d8d87931 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m @@ -107,7 +107,7 @@ if (state != SPMySQLConnected) return nil; // Check the connection if appropriate - if (![self _checkConnectionIfNecessary]) return nil; + if (![self checkConnectionIfNecessary]) return nil; // Lock the connection before using it [self _lockConnection]; @@ -153,7 +153,7 @@ - (BOOL)serverShutdown { - if([self _checkConnectionIfNecessary]) { + if([self checkConnectionIfNecessary]) { [self _lockConnection]; // Ensure per-thread variables are set up [self _validateThreadSetup]; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h index 15b809f1..343d0d36 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h @@ -188,6 +188,7 @@ - (BOOL)isConnected; - (BOOL)isConnectedViaSSL; - (BOOL)checkConnection; +- (BOOL)checkConnectionIfNecessary; - (double)timeConnected; - (BOOL)userTriggeredDisconnect; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m index ce980af8..e8692895 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m @@ -336,6 +336,8 @@ const char *SPMySQLSSLPermissibleCiphers = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RS * * WARNING: This method may return NO if the current thread is cancelled! * You MUST check the isCancelled flag before using the result! + * + * NOTE: In general -checkConnectionIfNecessary should be used instead! */ - (BOOL)checkConnection { @@ -375,6 +377,35 @@ const char *SPMySQLSSLPermissibleCiphers = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RS } /** + * If thirty seconds have passed since the last time the connection was + * used, check the connection. + * This minimises the impact of continuous additional connection checks - + * each of which requires a round trip to the server - but handles most + * network issues. + * Returns whether the connection is considered still valid. + * + * WARNING: This method may return NO if the current thread is cancelled! + * You MUST check the isCancelled flag before using the result! + */ +- (BOOL)checkConnectionIfNecessary +{ + + // If the connection has been dropped in the background, trigger a + // reconnect and return the success state here + if (state == SPMySQLConnectionLostInBackground) { + return [self _reconnectAllowingRetries:YES]; + } + + // If the connection was recently used, return success + if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 30) { + return YES; + } + + // Otherwise check the connection + return [self checkConnection]; +} + +/** * Retrieve the time elapsed since the connection was established, in seconds. * This time is retrieved in a monotonically increasing fashion and is high * precision; it is used internally for query timing, and is reset on reconnections. @@ -1043,35 +1074,6 @@ static uint64_t _elapsedMicroSecondsSinceAbsoluteTime(uint64_t comparisonTime) } /** - * If thirty seconds have passed since the last time the connection was - * used, check the connection. - * This minimises the impact of continuous additional connection checks - - * each of which requires a round trip to the server - but handles most - * network issues. - * Returns whether the connection is considered still valid. - * - * WARNING: This method may return NO if the current thread is cancelled! - * You MUST check the isCancelled flag before using the result! - */ -- (BOOL)_checkConnectionIfNecessary -{ - - // If the connection has been dropped in the background, trigger a - // reconnect and return the success state here - if (state == SPMySQLConnectionLostInBackground) { - return [self _reconnectAllowingRetries:YES]; - } - - // If the connection was recently used, return success - if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 30) { - return YES; - } - - // Otherwise check the connection - return [self checkConnection]; -} - -/** * Ensure that the thread this method is called on has been registered for * use with MySQL. MySQL requires thread-specific variables for safe * execution. diff --git a/Source/SPDatabaseStructure.m b/Source/SPDatabaseStructure.m index 8eed2607..fdb78916 100644 --- a/Source/SPDatabaseStructure.m +++ b/Source/SPDatabaseStructure.m @@ -551,7 +551,7 @@ cleanup_thread_and_pool: if (!mySQLConnection || !delegate) return NO; // Check the connection state - if ([mySQLConnection isConnected] && [mySQLConnection checkConnection]) return YES; + if ([mySQLConnection isConnected] && [mySQLConnection checkConnectionIfNecessary]) return YES; // the result of checkConnection may be meaningless if the thread was cancelled during execution. (issue #2353) if([[NSThread currentThread] isCancelled]) return NO; |