aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrowanbeentje <rowan@beent.je>2010-03-27 15:01:59 +0000
committerrowanbeentje <rowan@beent.je>2010-03-27 15:01:59 +0000
commit0559e08ff40bc2496c6af22beb4df99cf112e13b (patch)
treed665a5140902bc5dd72da608cf38f8c397fdad21
parentcf8f377e47e14498c9f0d3628752b1ea60437cab (diff)
downloadsequelpro-0559e08ff40bc2496c6af22beb4df99cf112e13b.tar.gz
sequelpro-0559e08ff40bc2496c6af22beb4df99cf112e13b.tar.bz2
sequelpro-0559e08ff40bc2496c6af22beb4df99cf112e13b.zip
- When switching tables, correctly catch disconnections and suppress error dialogs and related crashes
- Move connection error sheet close method to the connection delegate - Tweak the information_schema db schema building query to be much faster on busy servers by amending the VIEW part - Set the connection lock to nil after releasing, coping with connection unlocks deferred on the main thread until after dealloc
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m8
-rw-r--r--Source/SPConnectionDelegate.m17
-rw-r--r--Source/TableDocument.h1
-rw-r--r--Source/TableDocument.m8
-rw-r--r--Source/TableSource.m24
5 files changed, 29 insertions, 29 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
index 7b6fa0b8..549d0013 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
@@ -1996,11 +1996,11 @@ void performThreadedKeepAlive(void *ptr)
NSString *queryDbString = [NSString stringWithFormat:@""
@"SELECT TABLE_SCHEMA AS `databases`, TABLE_NAME AS `tables`, COLUMN_NAME AS `fields`, COLUMN_TYPE AS `type`, CHARACTER_SET_NAME AS `charset`, '0' AS `structtype`, `COLUMN_KEY` AS `KEY`, `EXTRA` AS EXTRA, `PRIVILEGES` AS `PRIVILEGES`, `COLLATION_NAME` AS `collation`, `COLUMN_DEFAULT` AS `default`, `IS_NULLABLE` AS `is_nullable`, `COLUMN_COMMENT` AS `comment` FROM `information_schema`.`COLUMNS` WHERE TABLE_SCHEMA = '%@'"
@"UNION "
- @"SELECT c.TABLE_SCHEMA AS `DATABASES`, c.TABLE_NAME AS `TABLES`, c.COLUMN_NAME AS `fields`, c.COLUMN_TYPE AS `TYPE`, c.CHARACTER_SET_NAME AS `CHARSET`, '1' AS `structtype`, `COLUMN_KEY` AS `KEY`, `EXTRA` AS EXTRA, `PRIVILEGES` AS `PRIVILEGES`, `COLLATION_NAME` AS `collation`, `COLUMN_DEFAULT` AS `default`, `IS_NULLABLE` AS `is_nullable`, `COLUMN_COMMENT` AS `comment` FROM `information_schema`.`COLUMNS` AS c, `information_schema`.`VIEWS` AS v WHERE c.TABLE_SCHEMA = '%@' AND c.TABLE_SCHEMA = v.TABLE_SCHEMA AND c.TABLE_NAME = v.TABLE_NAME "
+ @"SELECT c.TABLE_SCHEMA AS `DATABASES`, c.TABLE_NAME AS `TABLES`, c.COLUMN_NAME AS `fields`, c.COLUMN_TYPE AS `TYPE`, c.CHARACTER_SET_NAME AS `CHARSET`, '1' AS `structtype`, `COLUMN_KEY` AS `KEY`, `EXTRA` AS EXTRA, `PRIVILEGES` AS `PRIVILEGES`, `COLLATION_NAME` AS `collation`, `COLUMN_DEFAULT` AS `default`, `IS_NULLABLE` AS `is_nullable`, `COLUMN_COMMENT` AS `comment` FROM `information_schema`.`COLUMNS` AS c, `information_schema`.`VIEWS` AS v WHERE v.TABLE_SCHEMA = '%@' AND c.TABLE_SCHEMA = '%@' AND c.TABLE_NAME = v.TABLE_NAME "
@"UNION "
@"SELECT ROUTINE_SCHEMA AS `DATABASES`, ROUTINE_NAME AS `TABLES`, ROUTINE_NAME AS `fields`, `DTD_identifier` AS `TYPE`, '' AS `CHARSET`, '2' AS `structtype`, `IS_DETERMINISTIC` AS `KEY`, `SECURITY_TYPE` AS EXTRA, `DEFINER` AS `PRIVILEGES`, '' AS `collation`, '' AS `DEFAULT`, `SQL_DATA_ACCESS` AS `is_nullable`, '' AS `COMMENT` FROM `information_schema`.`ROUTINES` WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_SCHEMA = '%@'"
@"UNION "
- @"SELECT ROUTINE_SCHEMA AS `DATABASES`, ROUTINE_NAME AS `TABLES`, ROUTINE_NAME AS `fields`, `DTD_identifier` AS `TYPE`, '' AS `CHARSET`, '3' AS `structtype`, `IS_DETERMINISTIC` AS `KEY`, `SECURITY_TYPE` AS EXTRA, `DEFINER` AS `PRIVILEGES`, '' AS `collation`, '' AS `DEFAULT`, `SQL_DATA_ACCESS` AS `is_nullable`, '' AS `COMMENT` FROM `information_schema`.`ROUTINES` WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_SCHEMA = '%@'", currentDatabaseEscaped, currentDatabaseEscaped, currentDatabaseEscaped, currentDatabaseEscaped];
+ @"SELECT ROUTINE_SCHEMA AS `DATABASES`, ROUTINE_NAME AS `TABLES`, ROUTINE_NAME AS `fields`, `DTD_identifier` AS `TYPE`, '' AS `CHARSET`, '3' AS `structtype`, `IS_DETERMINISTIC` AS `KEY`, `SECURITY_TYPE` AS EXTRA, `DEFINER` AS `PRIVILEGES`, '' AS `collation`, '' AS `DEFAULT`, `SQL_DATA_ACCESS` AS `is_nullable`, '' AS `COMMENT` FROM `information_schema`.`ROUTINES` WHERE ROUTINE_TYPE = 'FUNCTION' AND ROUTINE_SCHEMA = '%@'", currentDatabaseEscaped, currentDatabaseEscaped, currentDatabaseEscaped, currentDatabaseEscaped, currentDatabaseEscaped];
NSData *encodedQueryData = NSStringDataUsingLossyEncoding(queryDbString, theConnectionEncoding, 1);
const char *queryCString = [encodedQueryData bytes];
@@ -2522,8 +2522,9 @@ void performThreadedKeepAlive(void *ptr)
{
delegate = nil;
- // Ensure the query lock is unlocked
+ // Ensure the query lock is unlocked, thereafter setting to nil in case of pending calls
[self unlockConnection];
+ [queryLock release], queryLock = nil;
// Clean up connections if necessary
if (mConnected) [self disconnect];
@@ -2534,7 +2535,6 @@ void performThreadedKeepAlive(void *ptr)
[keepAliveTimer invalidate];
[keepAliveTimer release];
- [queryLock release];
if (lastQueryErrorMessage) [lastQueryErrorMessage release];
if (connectionHost) [connectionHost release];
if (connectionLogin) [connectionLogin release];
diff --git a/Source/SPConnectionDelegate.m b/Source/SPConnectionDelegate.m
index 6e755d1a..56a254fa 100644
--- a/Source/SPConnectionDelegate.m
+++ b/Source/SPConnectionDelegate.m
@@ -110,22 +110,31 @@
*/
- (MCPConnectionCheck)connectionLost:(id)connection
{
+
+ // Display the connection error dialog and wait for the return code
[NSApp beginSheet:connectionErrorDialog modalForWindow:tableWindow modalDelegate:self didEndSelector:nil contextInfo:nil];
+ NSInteger connectionErrorCode = [NSApp runModalForWindow:connectionErrorDialog];
- NSInteger connectionErrorCode = [NSApp runModalForWindow:connectionErrorDialog];
-
[NSApp endSheet:connectionErrorDialog];
[connectionErrorDialog orderOut:nil];
-
+
// If 'disconnect' was selected, trigger a window close.
if (connectionErrorCode == MCPConnectionCheckDisconnect) {
[self performSelectorOnMainThread:@selector(closeDocumentWindowAndDisconnect) withObject:nil waitUntilDone:YES];
}
-
+
return connectionErrorCode;
}
/**
+ * Invoked when user dismisses the error sheet displayed as a result of the current connection being lost.
+ */
+- (IBAction)closeErrorConnectionSheet:(id)sender
+{
+ [NSApp stopModalWithCode:[sender tag]];
+}
+
+/**
* Close the connection - should be performed on the main thread.
* First hides the window to give code a little bit of time to clean
* everything up before it's all deallocated as a result of the close.
diff --git a/Source/TableDocument.h b/Source/TableDocument.h
index 8919fea6..4a943302 100644
--- a/Source/TableDocument.h
+++ b/Source/TableDocument.h
@@ -233,7 +233,6 @@
// Other methods
- (void) setQueryMode:(NSInteger)theQueryMode;
- (IBAction)closeSheet:(id)sender;
-- (IBAction)closeErrorConnectionSheet:(id)sender;
- (IBAction)closePanelSheet:(id)sender;
- (void)doPerformQueryService:(NSString *)query;
- (void)doPerformLoadQueryService:(NSString *)query;
diff --git a/Source/TableDocument.m b/Source/TableDocument.m
index 7725ee1c..d73fa943 100644
--- a/Source/TableDocument.m
+++ b/Source/TableDocument.m
@@ -2248,14 +2248,6 @@
}
/**
- * Invoked when user dismisses the error sheet displayed as a result of the current connection being lost.
- */
-- (IBAction)closeErrorConnectionSheet:(id)sender
-{
- [NSApp stopModalWithCode:[sender tag]];
-}
-
-/**
* Closes either the server variables or create syntax sheets.
*/
- (IBAction)closePanelSheet:(id)sender
diff --git a/Source/TableSource.m b/Source/TableSource.m
index 8ccc682e..83e3dde1 100644
--- a/Source/TableSource.m
+++ b/Source/TableSource.m
@@ -75,15 +75,15 @@
// If an error occurred, reset the interface and abort
if ([mySQLConnection queryErrored]) {
- NSString *errorMessage = [NSString stringWithString:[mySQLConnection getLastErrorMessage]];
-
[[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:tableDocumentInstance];
[[self onMainThread] setTableDetails:nil];
- SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"),
- nil, nil, [NSApp mainWindow], self, nil, nil, nil,
- [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"),
- errorMessage]);
+ if ([mySQLConnection isConnected]) {
+ SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"),
+ nil, nil, [NSApp mainWindow], self, nil, nil, nil,
+ [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"),
+ [mySQLConnection getLastErrorMessage]]);
+ }
if (tableSourceResult) [tableSourceResult release];
return;
}
@@ -97,15 +97,15 @@
// If an error occurred, reset the interface and abort
if ([mySQLConnection queryErrored]) {
- NSString *errorMessage = [NSString stringWithString:[mySQLConnection getLastErrorMessage]];
-
[[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:tableDocumentInstance];
[[self onMainThread] setTableDetails:nil];
- SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"),
- nil, nil, [NSApp mainWindow], self, nil, nil, nil,
- [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"),
- errorMessage]);
+ if ([mySQLConnection isConnected]) {
+ SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"),
+ nil, nil, [NSApp mainWindow], self, nil, nil, nil,
+ [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"),
+ [mySQLConnection getLastErrorMessage]]);
+ }
if (indexResult) [indexResult release];
return;
}