aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks
diff options
context:
space:
mode:
Diffstat (limited to 'Frameworks')
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m2
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h33
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m7
3 files changed, 23 insertions, 19 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
index a61f3223..4413e1c0 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m
@@ -1485,7 +1485,7 @@ static void forcePingTimeout(int signalNumber)
*/
- (void)unlockConnection
{
- [queryLock unlock];
+ [queryLock performSelectorOnMainThread:@selector(unlock) withObject:nil waitUntilDone:YES];
}
#pragma mark -
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h
index ae296192..146f81e7 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h
@@ -29,27 +29,28 @@
@class MCPConnection;
typedef struct SP_MYSQL_ROWS {
- char *data;
- unsigned long *dataLengths;
- struct SP_MYSQL_ROWS *nextRow;
+ char *data;
+ unsigned long *dataLengths;
+ struct SP_MYSQL_ROWS *nextRow;
} LOCAL_ROW_DATA;
@interface MCPStreamingResult : MCPResult
{
- MCPConnection *parentConnection;
-
- MYSQL_FIELD *fieldDefinitions;
- BOOL fullyStreaming;
- BOOL dataDownloaded;
- BOOL dataFreed;
- LOCAL_ROW_DATA *localDataStore;
+ MCPConnection *parentConnection;
+
+ MYSQL_FIELD *fieldDefinitions;
+ BOOL fullyStreaming;
+ BOOL connectionUnlocked;
+ BOOL dataDownloaded;
+ BOOL dataFreed;
+ LOCAL_ROW_DATA *localDataStore;
LOCAL_ROW_DATA *currentDataStoreEntry;
- LOCAL_ROW_DATA *localDataStoreLastEntry;
- unsigned long localDataRows;
- unsigned long localDataAllocated;
- unsigned long downloadedRowCount;
- unsigned long processedRowCount;
- unsigned long freedRowCount;
+ LOCAL_ROW_DATA *localDataStoreLastEntry;
+ unsigned long localDataRows;
+ unsigned long localDataAllocated;
+ unsigned long downloadedRowCount;
+ unsigned long processedRowCount;
+ unsigned long freedRowCount;
}
- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)theTimeZone connection:(MCPConnection *)theConnection;
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
index e51785f8..3f3e2073 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
@@ -74,6 +74,7 @@
mTimeZone = [theTimeZone retain];
parentConnection = theConnection;
fullyStreaming = useFullStreaming;
+ connectionUnlocked = NO;
if (mResult) {
mysql_free_result(mResult);
@@ -122,9 +123,9 @@
/**
* Deallocate the result and unlock the parent connection for further use
*/
- - (void) dealloc
+- (void) dealloc
{
- [parentConnection unlockConnection];
+ if (!connectionUnlocked) [parentConnection unlockConnection];
[super dealloc];
}
@@ -169,6 +170,8 @@
// once all memory has been freed
if (processedRowCount == downloadedRowCount) {
while (!dataFreed) usleep(1000);
+ [parentConnection unlockConnection];
+ connectionUnlocked = YES;
return nil;
}