aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbhi Beckert <abhi@abhibeckert.com>2017-03-10 12:49:14 +1000
committerAbhi Beckert <abhi@abhibeckert.com>2017-03-10 12:49:14 +1000
commit833d8726302d854684dfa52db92e30c6766a8b63 (patch)
tree413e33bb2f9ab97d5e71532585447a7fb928d836
parent9c5357a28e27b74a6df7bfeeb24015073d5993e5 (diff)
parent7c56b11d8bdead768e86643a4b61e3f293820330 (diff)
downloadsequelpro-833d8726302d854684dfa52db92e30c6766a8b63.tar.gz
sequelpro-833d8726302d854684dfa52db92e30c6766a8b63.tar.bz2
sequelpro-833d8726302d854684dfa52db92e30c6766a8b63.zip
Merge remote-tracking branch 'sequelpro/master'
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h1
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h1
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m10
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m4
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m4
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h1
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m60
-rw-r--r--Source/SPDatabaseStructure.m2
-rw-r--r--readme.md2
9 files changed, 46 insertions, 39 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/Ping & KeepAlive.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h
index a3f34817..1bd9f85b 100644
--- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h
+++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h
@@ -34,6 +34,7 @@ typedef struct {
MYSQL *mySQLConnection;
volatile BOOL *keepAlivePingThreadActivePointer;
volatile BOOL *keepAliveLastPingSuccessPointer;
+ void *parentId;
} SPMySQLConnectionPingDetails;
@interface SPMySQLConnection (Ping_and_KeepAlive)
diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m
index 7940b483..374d0909 100644
--- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m
+++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m
@@ -33,6 +33,7 @@
#import "SPMySQL Private APIs.h"
#import "Locking.h"
#import <pthread.h>
+#include <stdio.h>
@implementation SPMySQLConnection (Ping_and_KeepAlive)
@@ -85,7 +86,7 @@
}
keepAliveThread = [NSThread currentThread];
- [keepAliveThread setName:@"SPMySQL connection keepalive monitor thread"];
+ [keepAliveThread setName:[NSString stringWithFormat:@"SPMySQL connection keepalive monitor thread (id=%p)", self]];
// If the maximum number of ping failures has been reached, determine whether to reconnect.
if (keepAliveLastPingBlocked || keepAlivePingFailures >= 3) {
@@ -158,6 +159,7 @@ end_cleanup:
pingDetails->mySQLConnection = mySQLConnection;
pingDetails->keepAliveLastPingSuccessPointer = &keepAliveLastPingSuccess;
pingDetails->keepAlivePingThreadActivePointer = &keepAlivePingThreadActive;
+ pingDetails->parentId = self;
// Create a pthread for the ping
pthread_t keepAlivePingThread_t;
@@ -216,9 +218,11 @@ end_cleanup:
*/
void _backgroundPingTask(void *ptr)
{
- pthread_setname_np("SPMySQL _backgroundPingTask() worker thread");
-
SPMySQLConnectionPingDetails *pingDetails = (SPMySQLConnectionPingDetails *)ptr;
+
+ char threadNameBuf[80];
+ snprintf(threadNameBuf, sizeof(threadNameBuf), "SPMySQL _backgroundPingTask() worker thread (id=%p)", pingDetails->parentId);
+ pthread_setname_np(threadNameBuf);
// Set up a cleanup routine
pthread_cleanup_push(_pingThreadCleanup, pingDetails);
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;
diff --git a/readme.md b/readme.md
index 957e2cdc..aef52cfb 100644
--- a/readme.md
+++ b/readme.md
@@ -1,7 +1,7 @@
Sequel Pro <img alt="Logo" src="https://sequelpro.com/images/logo.png" align="right" height="50">
==========
-Sequel Pro is a fast, easy-to-use Mac database management application for working with MySQL databases.
+Sequel Pro is a fast, easy-to-use Mac database management application for working with MySQL & MariaDB databases.
You can find more details on our website: [sequelpro.com](http://sequelpro.com)