aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBibiko <bibiko@eva.mpg.de>2009-10-09 10:13:42 +0000
committerBibiko <bibiko@eva.mpg.de>2009-10-09 10:13:42 +0000
commit0e9df92aef86421374ca1756ff3cbfa4c386c822 (patch)
tree778ccf801f614de0da69c1d1e298c2783861b6d5
parent5759187115c2aaa2db5f528a02bee80ba0980c39 (diff)
downloadsequelpro-0e9df92aef86421374ca1756ff3cbfa4c386c822.tar.gz
sequelpro-0e9df92aef86421374ca1756ff3cbfa4c386c822.tar.bz2
sequelpro-0e9df92aef86421374ca1756ff3cbfa4c386c822.zip
• fixed bug while parsing the CREATE TABLE syntax if a column name contains a '#' or '/*'
- this fixes issue 431 - furthermore if the parsing process fails for some other reasons, i.e. a table name is NULL or empty SP alerts the user about it instead of stalling
-rw-r--r--Source/SPSQLParser.h3
-rw-r--r--Source/SPSQLParser.m11
-rw-r--r--Source/SPTableData.m14
3 files changed, 27 insertions, 1 deletions
diff --git a/Source/SPSQLParser.h b/Source/SPSQLParser.h
index 73dfe493..76105e27 100644
--- a/Source/SPSQLParser.h
+++ b/Source/SPSQLParser.h
@@ -68,6 +68,7 @@
int delimiterLength;
BOOL charIsDelimiter;
BOOL isDelimiterCommand;
+ BOOL ignoreCommentStrings;
}
@@ -77,7 +78,7 @@ typedef enum _SPCommentTypes {
SPCStyleComment = 2
} SPCommentType;
-
+- (void) setIgnoringCommentStrings:(BOOL)ignoringCommentStrings;
/*
* Removes comments within the current string, trimming "#", "--[/s]", and "/* * /" style strings.
diff --git a/Source/SPSQLParser.m b/Source/SPSQLParser.m
index 0b968d0a..4484c4c2 100644
--- a/Source/SPSQLParser.m
+++ b/Source/SPSQLParser.m
@@ -42,6 +42,10 @@ TO_BUFFER_STATE to_scan_string (const char *);
*/
@implementation SPSQLParser : NSMutableString
+- (void)setIgnoringCommentStrings:(BOOL)ignoringCommentStrings
+{
+ ignoreCommentStrings = ignoringCommentStrings;
+}
/*
* Removes comments within the current string, trimming "#", "--[/s]", and "/* * /" style strings.
@@ -554,11 +558,13 @@ TO_BUFFER_STATE to_scan_string (const char *);
break;
case '#':
+ if(ignoreCommentStrings) break;
currentStringIndex = [self endIndexOfCommentOfType:SPHashComment startingAtIndex:currentStringIndex];
break;
// For comments starting "/*", ensure the start syntax is valid before proceeding.
case '/':
+ if(ignoreCommentStrings) break;
if (stringLength < currentStringIndex + 1) break;
if ((unichar)(long)(*charAtIndex)(self, @selector(charAtIndex:), currentStringIndex+1) != '*') break;
currentStringIndex = [self endIndexOfCommentOfType:SPCStyleComment startingAtIndex:currentStringIndex];
@@ -642,11 +648,13 @@ TO_BUFFER_STATE to_scan_string (const char *);
break;
case '#':
+ if(ignoreCommentStrings) break;
currentStringIndex = [self endIndexOfCommentOfType:SPHashComment startingAtIndex:currentStringIndex];
break;
// For comments starting "/*", ensure the start syntax is valid before proceeding.
case '/':
+ if(ignoreCommentStrings) break;
if (stringLength < currentStringIndex + 1) break;
if ((unichar)(long)(*charAtIndex)(self, @selector(charAtIndex:), currentStringIndex+1) != '*') break;
currentStringIndex = [self endIndexOfCommentOfType:SPCStyleComment startingAtIndex:currentStringIndex];
@@ -849,12 +857,15 @@ TO_BUFFER_STATE to_scan_string (const char *);
/* Required and primitive methods to allow subclassing class cluster */
#pragma mark -
- (id) init {
+
if (self = [super init]) {
string = [[NSMutableString string] retain];
}
parsedToChar = '\0';
parsedToPosition = -1;
charCacheEnd = -1;
+ ignoreCommentStrings = NO;
+
return self;
}
- (id) initWithBytes:(const void *)bytes length:(unsigned int)length encoding:(NSStringEncoding)encoding {
diff --git a/Source/SPTableData.m b/Source/SPTableData.m
index 66224529..ec02c301 100644
--- a/Source/SPTableData.m
+++ b/Source/SPTableData.m
@@ -380,11 +380,24 @@
quoteCharacter = [fieldsParser characterAtIndex:0];
// Capture the area between the two backticks as the name
+ // Set the parser to ignoreCommentStrings since a field name can contain # or /*
+ [fieldsParser setIgnoringCommentStrings:YES];
NSString *fieldName = [fieldsParser trimAndReturnStringFromCharacter: quoteCharacter
toCharacter: quoteCharacter
trimmingInclusively: YES
returningInclusively: NO
ignoringQuotedStrings: NO];
+ if(fieldName == nil || [fieldName length] == 0) {
+ NSBeep();
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button")];
+ [alert setInformativeText:[NSString stringWithFormat:NSLocalizedString(@"“%@” couldn't be parsed. You can edit the column setup but the column will not be shown in the Content view; please report this issue to the Sequel Pro team using the Help menu item.", @"“%@” couldn't be parsed. You can edit the column setup but the column will not be shown in the Content view; please report this issue to the Sequel Pro team using the Help menu item."), fieldsParser]];
+ [alert setMessageText:NSLocalizedString(@"Error while parsing CREATE TABLE syntax",@"error while parsing CREATE TABLE syntax")];
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
+ [alert release];
+ continue;
+ }
//if the next character is again a backtick, we stumbled across an escaped backtick. we have to continue parsing.
while ([fieldsParser characterAtIndex:0] == quoteCharacter) {
fieldName = [fieldName stringByAppendingFormat: @"`%@",
@@ -395,6 +408,7 @@
ignoringQuotedStrings: NO]
];
}
+ [fieldsParser setIgnoringCommentStrings:NO];
[tableColumn setObject:[NSNumber numberWithInt:[tableColumns count]] forKey:@"datacolumnindex"];
[tableColumn setObject:fieldName forKey:@"name"];