diff options
author | rowanbeentje <rowan@beent.je> | 2013-09-08 20:37:21 +0000 |
---|---|---|
committer | rowanbeentje <rowan@beent.je> | 2013-09-08 20:37:21 +0000 |
commit | 207386000afff61ec1b661a17fa9747bf7fb4407 (patch) | |
tree | 4bb62890e27e1c443efa82cad1a3225265f68c19 /Source/SPAppController.m | |
parent | f800cc92469c2615fe5fb6cc351a24b1cfd6e944 (diff) | |
download | sequelpro-207386000afff61ec1b661a17fa9747bf7fb4407.tar.gz sequelpro-207386000afff61ec1b661a17fa9747bf7fb4407.tar.bz2 sequelpro-207386000afff61ec1b661a17fa9747bf7fb4407.zip |
Allow opened SQL files to be saved back to the original file, addressing Issue #1805:
- Add new menu item for "Save Query", making the existing item "Save Query As" as an alternate
- Track the opened SQL file and used encoding to be able to easily save the same file again
- Standardise encoding detection to use the UniversalDetector framework and use that for opened SQL files where the encoding menu is not used
Diffstat (limited to 'Source/SPAppController.m')
-rw-r--r-- | Source/SPAppController.m | 100 |
1 files changed, 16 insertions, 84 deletions
diff --git a/Source/SPAppController.m b/Source/SPAppController.m index 0efa243d..02d1773b 100644 --- a/Source/SPAppController.m +++ b/Source/SPAppController.m @@ -317,21 +317,24 @@ } // Attempt to open the file into a string. + NSStringEncoding sqlEncoding; NSString *sqlString = nil; // If the user came from an openPanel use the chosen encoding if (encodingPopUp) { - NSError *error = nil; - sqlString = [NSString stringWithContentsOfFile:filename encoding:[[encodingPopUp selectedItem] tag] error:&error]; - if(error != nil) { - NSAlert *errorAlert = [NSAlert alertWithError:error]; - [errorAlert runModal]; - return; - } - - // Otherwise, read while attempting to autodetect the encoding + sqlEncoding = [[encodingPopUp selectedItem] tag]; + + // Otherwise, attempt to autodetect the encoding } else { - sqlString = [self contentOfFile:filename]; + sqlEncoding = [[NSFileManager defaultManager] detectEncodingforFileAtPath:filename]; + } + + NSError *error = nil; + sqlString = [NSString stringWithContentsOfFile:filename encoding:sqlEncoding error:&error]; + if(error != nil) { + NSAlert *errorAlert = [NSAlert alertWithError:error]; + [errorAlert runModal]; + return; } // if encodingPopUp is defined the filename comes from an openPanel and @@ -346,10 +349,12 @@ } else { // Pass query to the Query editor of the current document - [[self frontDocument] doPerformLoadQueryService:[self contentOfFile:filename]]; + [[self frontDocument] doPerformLoadQueryService:sqlString]; } [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL fileURLWithPath:filename]]; + [[self frontDocument] setSqlFileURL:[NSURL fileURLWithPath:filename]]; + [[self frontDocument] setSqlFileEncoding:sqlEncoding]; break; // open only the first SQL file @@ -2014,79 +2019,6 @@ return YES; } -/** - * Insert content of a plain text file for a given path. - * In addition it tries to figure out the file's text encoding heuristically. - */ -- (NSString *)contentOfFile:(NSString *)aPath -{ - NSError *err = nil; - NSStringEncoding enc; - NSString *content = nil; - - // Make usage of the UNIX command "file" to get an info - // about file type and encoding. - NSTask *task=[[NSTask alloc] init]; - NSPipe *pipe=[[NSPipe alloc] init]; - NSFileHandle *handle; - NSString *result; - [task setLaunchPath:@"/usr/bin/file"]; - [task setArguments:[NSArray arrayWithObjects:aPath, @"-Ib", nil]]; - [task setStandardOutput:pipe]; - handle=[pipe fileHandleForReading]; - [task launch]; - result=[[NSString alloc] initWithData:[handle readDataToEndOfFile] - encoding:NSASCIIStringEncoding]; - - [pipe release]; - [task release]; - - // UTF16/32 files are detected as application/octet-stream resp. audio/mpeg - if( [result hasPrefix:@"text/plain"] - || [[[aPath pathExtension] lowercaseString] isEqualToString:SPFileExtensionSQL] - || [[[aPath pathExtension] lowercaseString] isEqualToString:@"txt"] - || [result hasPrefix:@"audio/mpeg"] - || [result hasPrefix:@"application/octet-stream"] - ) - { - // if UTF16/32 cocoa will try to find the correct encoding - if([result hasPrefix:@"application/octet-stream"] || [result hasPrefix:@"audio/mpeg"] || [result rangeOfString:@"utf-16"].length) - enc = 0; - else if([result rangeOfString:@"utf-8"].length) - enc = NSUTF8StringEncoding; - else if([result rangeOfString:@"iso-8859-1"].length) - enc = NSISOLatin1StringEncoding; - else if([result rangeOfString:@"us-ascii"].length) - enc = NSASCIIStringEncoding; - else - enc = 0; - - if(enc == 0) // cocoa tries to detect the encoding - content = [NSString stringWithContentsOfFile:aPath usedEncoding:&enc error:&err]; - else - content = [NSString stringWithContentsOfFile:aPath encoding:enc error:&err]; - - if(content) - { - [result release]; - return content; - } - // If UNIX "file" failed try cocoa's encoding detection - content = [NSString stringWithContentsOfFile:aPath encoding:enc error:&err]; - if(content) - { - [result release]; - return content; - } - } - - [result release]; - - NSLog(@"%@ ‘%@’.", NSLocalizedString(@"Couldn't read the file content of", @"Couldn't read the file content of"), aPath); - - return @""; -} - - (NSArray *)bundleCategoriesForScope:(NSString*)scope { return [bundleCategories objectForKey:scope]; |