aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPTableData.m
diff options
context:
space:
mode:
Diffstat (limited to 'Source/SPTableData.m')
-rw-r--r--Source/SPTableData.m51
1 files changed, 23 insertions, 28 deletions
diff --git a/Source/SPTableData.m b/Source/SPTableData.m
index 1936d0b1..297718b9 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]]];
@@ -597,7 +590,7 @@
}
[fieldsParser setIgnoreCommentStrings:NO];
- [tableColumn setObject:[NSNumber numberWithInteger:[tableColumns count]] forKey:@"datacolumnindex"];
+ [tableColumn setObject:[NSString stringWithFormat:@"%llu", (unsigned long long)[tableColumns count]] forKey:@"datacolumnindex"];
[tableColumn setObject:fieldName forKey:@"name"];
// Split the remaining field definition string by spaces and process
@@ -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
@@ -876,7 +872,7 @@
resultRow = [theResult fetchRowAsDictionary];
// Add the column index and name
- [tableColumn setObject:[NSNumber numberWithInteger:[tableColumns count]] forKey:@"datacolumnindex"];
+ [tableColumn setObject:[NSString stringWithFormat:@"%llu", (unsigned long long)[tableColumns count]] forKey:@"datacolumnindex"];
[tableColumn setObject:[NSString stringWithString:[resultRow objectForKey:@"Field"]] forKey:@"name"];
// Populate type, length, and other available details from the Type columns
@@ -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