diff options
author | stuconnolly <stuart02@gmail.com> | 2011-10-08 19:17:34 +0000 |
---|---|---|
committer | stuconnolly <stuart02@gmail.com> | 2011-10-08 19:17:34 +0000 |
commit | 4f96895de524ea086d3ae1285fd89dfa53f86f54 (patch) | |
tree | 86d17f15bb96272ff84d17e182410475f49b6dee | |
parent | fbe0dde7445e36f058974ec0245076ed20974bd6 (diff) | |
download | sequelpro-4f96895de524ea086d3ae1285fd89dfa53f86f54.tar.gz sequelpro-4f96895de524ea086d3ae1285fd89dfa53f86f54.tar.bz2 sequelpro-4f96895de524ea086d3ae1285fd89dfa53f86f54.zip |
Ensure the that table constraints are cleared in [SPTableData informationForTable:] to prevent the inclusion of them in subsequent calls for different tables. Fixes issue 1206.
-rw-r--r-- | Source/SPDotExporter.m | 20 | ||||
-rw-r--r-- | Source/SPTableData.m | 47 |
2 files changed, 34 insertions, 33 deletions
diff --git a/Source/SPDotExporter.m b/Source/SPDotExporter.m index e0c1a294..cd00b61f 100644 --- a/Source/SPDotExporter.m +++ b/Source/SPDotExporter.m @@ -108,16 +108,16 @@ // Process the tables for (NSUInteger i = 0; i < [[self dotExportTables] count]; i++) { - // Check for cancellation flag if ([self isCancelled]) { [fkInfo release]; [pool release]; + return; } NSString *tableName = NSArrayObjectAtIndex([self dotExportTables], i); - NSString *tableLinkName = [self dotForceLowerTableNames]?[tableName lowercaseString]:tableName; + NSString *tableLinkName = [self dotForceLowerTableNames] ? [tableName lowercaseString] : tableName; NSDictionary *tableInfo = [[self dotTableData] informationForTable:tableName]; // Set the current table @@ -154,21 +154,24 @@ // Check if any relations are available for the table NSArray *tableConstraints = [tableInfo objectForKey:@"constraints"]; + if ([tableConstraints count]) { - for (NSDictionary* aConstraint in tableConstraints) { - + + for (NSDictionary* constraint in tableConstraints) + { // Check for cancellation flag if ([self isCancelled]) { [fkInfo release]; [pool release]; + return; } // Get the column references. Currently the columns themselves are an array, // while reference columns and tables are comma separated if there are more than // one. Only use the first of each for the time being. - NSArray *originColumns = [aConstraint objectForKey:@"columns"]; - NSArray *referenceColumns = [[aConstraint objectForKey:@"ref_columns"] componentsSeparatedByString:@","]; + NSArray *originColumns = [constraint objectForKey:@"columns"]; + NSArray *referenceColumns = [[constraint objectForKey:@"ref_columns"] componentsSeparatedByString:@","]; NSString *extra = @""; @@ -176,12 +179,13 @@ extra = @" [ arrowhead=crow, arrowtail=odiamond ]"; } - [fkInfo addObject:[NSString stringWithFormat:@"%@:%@ -> %@:%@ %@", tableLinkName, [originColumns objectAtIndex:0], [aConstraint objectForKey:@"ref_table"], [[referenceColumns objectAtIndex:0] lowercaseString], extra]]; + [fkInfo addObject:[NSString stringWithFormat:@"%@:%@ -> %@:%@ %@", tableLinkName, [originColumns objectAtIndex:0], [constraint objectForKey:@"ref_table"], [[referenceColumns objectAtIndex:0] lowercaseString], extra]]; } } // Update progress NSInteger progress = (i * ([self exportMaxProgress] / [[self dotExportTables] count])); + [self setExportProgressValue:progress]; [delegate performSelectorOnMainThread:@selector(dotExportProcessProgressUpdated:) withObject:self waitUntilDone:NO]; } @@ -193,7 +197,9 @@ // Get the relations for (id item in fkInfo) + { [metaString appendFormat:@"%@;\n", item]; + } [fkInfo release]; diff --git a/Source/SPTableData.m b/Source/SPTableData.m index 1936d0b1..f2c00c15 100644 --- a/Source/SPTableData.m +++ b/Source/SPTableData.m @@ -76,7 +76,6 @@ [mySQLConnection retain]; } - /** * Retrieve the encoding for the current table, using or refreshing the cache as appropriate. */ @@ -120,7 +119,6 @@ return [NSString stringWithString:tableCreateSyntax]; } - /** * Retrieve all columns for the current table as an array, using or refreshing the cache as appropriate. */ @@ -191,7 +189,6 @@ return [columns objectAtIndex:columnIndex]; } - /** * Retrieve column names for the current table as an array, using or refreshing the cache as appropriate. */ @@ -210,7 +207,6 @@ return columnNames; } - /** * Retrieve a NSDictionary containing all parameters of the column with a specific index, using or refreshing the cache as appropriate. * @@ -237,7 +233,6 @@ * * @param colName The column name which should be checked. */ - - (BOOL) columnIsBlobOrText:(NSString *)colName { // If processing is already in action, wait for it to complete @@ -260,7 +255,6 @@ * * @param colName The column name which should be checked. */ - - (BOOL) columnIsGeometry:(NSString *)colName { // If processing is already in action, wait for it to complete @@ -277,7 +271,6 @@ return (BOOL) ([[[self columnWithName:colName] objectForKey:@"typegrouping"] isEqualToString:@"geometry"]); } - /** * Retrieve the table status value for a supplied key, using or refreshing the cache as appropriate. * @@ -307,7 +300,6 @@ [status setValue:value forKey:key]; } - /** * Retrieve all known status values as a dictionary, using or refreshing the cache as appropriate. */ @@ -322,7 +314,6 @@ return status; } - /** * Flushes all caches - should be used on major changes, for example table changes. */ @@ -348,7 +339,6 @@ } } - /** * Flushes any status-related caches. */ @@ -367,7 +357,6 @@ [columnNames removeAllObjects]; } - /** * Retrieves the information for the current table and stores it in cache. * Returns a boolean indicating success. @@ -454,7 +443,6 @@ return TRUE; } - /** * Retrieve the CREATE TABLE string for a table and analyse it to extract the field * details, primary key, unique keys, and table encoding. @@ -481,6 +469,11 @@ [mySQLConnection storeEncodingForRestoration]; [mySQLConnection setEncoding:@"utf8"]; } + + // In cases where this method is called directly instead of via -updateInformationForCurrentTable + // (for example, from the exporters) clear the list of constraints to prevent the previous call's table + // constraints being included in the table information (issue 1206). + [constraints removeAllObjects]; // Retrieve the CREATE TABLE syntax for the table MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE %@", [tableName backtickQuotedString]]]; @@ -614,11 +607,12 @@ [tableColumns addObject:d]; // TODO: Otherwise it's a key definition, check, or other 'metadata'. Would be useful to parse/display these! - } else { + } + else { NSArray *parts = [fieldsParser splitStringByCharacter:' ' skippingBrackets:YES ignoringQuotedStrings:YES]; // Constraints - if( [[parts objectAtIndex:0] hasPrefix:@"CONSTRAINT"] ) { + if ([[parts objectAtIndex:0] hasPrefix:@"CONSTRAINT"]) { NSMutableDictionary *constraintDetails = [[NSMutableDictionary alloc] init]; // Extract the relevant details from the constraint string @@ -643,9 +637,10 @@ [constraintDetails setObject:[fieldsParser unquotedString] forKey:@"ref_columns"]; NSUInteger nextOffs = 12; - if( [parts count] > 8 ) { + + if ([parts count] > 8) { // NOTE: this won't get SET NULL | NO ACTION | RESTRICT - if( [[parts objectAtIndex:9] hasPrefix:@"UPDATE"] ) { + if ([[parts objectAtIndex:9] hasPrefix:@"UPDATE"]) { if( [NSArrayObjectAtIndex(parts, 10) hasPrefix:@"SET"] ) { [constraintDetails setObject:@"SET NULL" forKey:@"update"]; @@ -659,8 +654,8 @@ forKey:@"update"]; } } - else if( [NSArrayObjectAtIndex(parts, 9) hasPrefix:@"DELETE"] ) { - if( [NSArrayObjectAtIndex(parts, 10) hasPrefix:@"SET"] ) { + else if ([NSArrayObjectAtIndex(parts, 9) hasPrefix:@"DELETE"]) { + if ([NSArrayObjectAtIndex(parts, 10) hasPrefix:@"SET"]) { [constraintDetails setObject:@"SET NULL" forKey:@"delete"]; nextOffs = 13; @@ -674,6 +669,7 @@ } } } + if ([parts count] > nextOffs - 1) { if( [NSArrayObjectAtIndex(parts, nextOffs) hasPrefix:@"UPDATE"] ) { if( [NSArrayObjectAtIndex(parts, nextOffs+1) hasPrefix:@"SET"] ) { @@ -700,9 +696,11 @@ } } } + [constraints addObject:constraintDetails]; [constraintDetails release]; } + // primary key // add "isprimarykey" to the corresponding tableColumn // add dict root "primarykeyfield" = <field> for faster accessing @@ -718,6 +716,7 @@ } } } + // unique keys // add to each corresponding tableColumn the tag "unique" if given else if( [NSArrayObjectAtIndex(parts, 0) hasPrefix:@"UNIQUE"] && [parts count] == 4) { @@ -771,7 +770,6 @@ [createTableParser release]; [fieldParser release]; - // this will be 'Table' or 'View' [tableData setObject:[resultFieldNames objectAtIndex:0] forKey:@"type"]; [tableData setObject:[NSString stringWithString:encodingString] forKey:@"encoding"]; @@ -786,8 +784,6 @@ return tableData; } - - /** * Retrieve information which can be used to display views. Unlike tables, all the information * for views cannot be extracted from the CREATE ALGORITHM syntax without selecting all the info @@ -916,8 +912,6 @@ return viewData; } - - /** * Retrieve the status of a table as a dictionary and add it to the local cache for reuse. */ @@ -1348,7 +1342,7 @@ /** * Dealloc the class */ -- (void) dealloc +- (void)dealloc { [columns release]; [columnNames release]; @@ -1376,15 +1370,16 @@ #ifdef SP_REFACTOR /* glue */ -- (void)setTableDocumentInstance:(SPDatabaseDocument*)doc +- (void)setTableDocumentInstance:(SPDatabaseDocument *)doc { tableDocumentInstance = doc; } -- (void)setTableListInstance:(SPTablesList*)list +- (void)setTableListInstance:(SPTablesList *)list { tableListInstance = list; } + #endif @end
\ No newline at end of file |