aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPArrayAdditions.h1
-rw-r--r--Source/SPArrayAdditions.m15
-rw-r--r--Source/SPDatabaseDocument.m28
-rw-r--r--Source/SPTextView.m38
4 files changed, 58 insertions, 24 deletions
diff --git a/Source/SPArrayAdditions.h b/Source/SPArrayAdditions.h
index 89ea53e4..206f15f8 100644
--- a/Source/SPArrayAdditions.h
+++ b/Source/SPArrayAdditions.h
@@ -44,6 +44,7 @@ static inline void NSMutableArrayReplaceObject(NSArray *self, CFIndex idx, id an
- (NSString *)componentsJoinedBySpacesAndQuoted;
- (NSString *)componentsJoinedByPeriodAndBacktickQuoted;
- (NSString *)componentsJoinedByPeriodAndBacktickQuotedAndIgnoreFirst;
+- (NSString *)componentsJoinedAsCSV;
- (NSArray *)subarrayWithIndexes:(NSIndexSet *)indexes;
@end
diff --git a/Source/SPArrayAdditions.m b/Source/SPArrayAdditions.m
index 9f9e7705..66a0ce1b 100644
--- a/Source/SPArrayAdditions.m
+++ b/Source/SPArrayAdditions.m
@@ -70,7 +70,7 @@
if ([result length])
[result appendString:@" "];
- [result appendString:[NSString stringWithFormat:@"\"%@\"", [component stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]]];
+ [result appendFormat:@"\"%@\"", [component stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]];
}
return result;
}
@@ -108,6 +108,19 @@
return result;
}
+- (NSString *)componentsJoinedAsCSV
+{
+ NSMutableString *result = [NSMutableString string];
+ [result setString:@""];
+
+ for (NSString *component in self)
+ {
+ if ([result length])
+ [result appendString: @","];
+ [result appendFormat:@"\"%@\"", [[component description] stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""]];
+ }
+ return result;
+}
- (NSArray *)subarrayWithIndexes:(NSIndexSet *)indexes
{
diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m
index 04660b28..96a6aa3e 100644
--- a/Source/SPDatabaseDocument.m
+++ b/Source/SPDatabaseDocument.m
@@ -4423,11 +4423,16 @@
}
else if([command isEqualToString:@"ExecuteQuery"]) {
+
+ // Bail if document is busy
if (_isWorkingLevel) return;
+
NSString *outputFormat = @"tab";
if([params count] == 2)
outputFormat = [params objectAtIndex:1];
+ BOOL writeAsCsv = ([outputFormat isEqualToString:@"csv"]) ? YES : NO;
+
NSString *queryFileName = [NSString stringWithFormat:@"/private/tmp/SP_QUERY_%@", docProcessID];
NSString *resultFileName = [NSString stringWithFormat:@"/private/tmp/SP_QUERY_RESULT_%@", docProcessID];
NSString *metaFileName = [NSString stringWithFormat:@"/private/tmp/SP_QUERY_RESULT_META_%@", docProcessID];
@@ -4446,27 +4451,42 @@
[fm removeItemAtPath:statusFileName error:nil];
if(inError == nil && query && [query length]) {
+
SPFileHandle *fh = [SPFileHandle fileHandleForWritingAtPath:resultFileName];
- if(!fh)
- NSLog(@"Couldn't create file handle to %@", resultFileName);
+ if(!fh) NSLog(@"Couldn't create file handle to %@", resultFileName);
+
MCPResult *theResult = [mySQLConnection queryString:query];
[theResult setReturnDataAsStrings:YES];
if ([mySQLConnection queryErrored]) {
- [fh writeData:[[NSString stringWithFormat:@"Error.\nMySQL said: %@", [mySQLConnection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]];
+ [fh writeData:[[NSString stringWithFormat:@"MySQL said: %@", [mySQLConnection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]];
status = @"1";
} else {
+
+ // write header
+ if(writeAsCsv)
+ [fh writeData:[[[theResult fetchFieldNames] componentsJoinedAsCSV] dataUsingEncoding:NSUTF8StringEncoding]];
+ else
+ [fh writeData:[[[theResult fetchFieldNames] componentsJoinedByString:@"\t"] dataUsingEncoding:NSUTF8StringEncoding]];
+ [fh writeData:[[NSString stringWithString:@"\n"] dataUsingEncoding:NSUTF8StringEncoding]];
+
+ // write data
if ([theResult numOfRows]) [theResult dataSeek:0];
NSInteger i;
NSArray *theRow;
for ( i = 0 ; i < [theResult numOfRows] ; i++ ) {
theRow = [theResult fetchRowAsArray];
- [fh writeData:[[theRow componentsJoinedByString:@"\t"] dataUsingEncoding:NSUTF8StringEncoding]];
+ if(writeAsCsv)
+ [fh writeData:[[theRow componentsJoinedAsCSV] dataUsingEncoding:NSUTF8StringEncoding]];
+ else
+ [fh writeData:[[theRow componentsJoinedByString:@"\t"] dataUsingEncoding:NSUTF8StringEncoding]];
[fh writeData:[[NSString stringWithString:@"\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}
}
[fh closeFile];
}
}
+
+ // write status file as notification that query was finished
BOOL succeed = [status writeToFile:statusFileName atomically:YES encoding:NSUTF8StringEncoding error:nil];
if(!succeed) {
NSBeep();
diff --git a/Source/SPTextView.m b/Source/SPTextView.m
index 34c87822..da4c3f04 100644
--- a/Source/SPTextView.m
+++ b/Source/SPTextView.m
@@ -3510,13 +3510,13 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
if (cmdData) [cmdData release];
return;
} else {
- if([cmdData objectForKey:@"command"] && [[cmdData objectForKey:@"command"] length]) {
+ if([cmdData objectForKey:@"command"] && [[cmdData objectForKey:@"command"] length] && [cmdData objectForKey:@"scope"] && [[cmdData objectForKey:@"scope"] isEqualToString:@"editor"]) {
NSString *cmd = [cmdData objectForKey:@"command"];
NSString *inputAction = @"";
NSString *inputFallBackAction = @"";
NSError *err = nil;
- NSString *inputTempFileName = @"/tmp/sp_bundle_task_input";
+ NSString *inputTempFileName = @"/tmp/SP_BUNDLE_TASK_INPUT";
NSRange currentWordRange, currentQueryRange, currentSelectionRange, currentLineRange;
[[NSFileManager defaultManager] removeItemAtPath:inputTempFileName error:nil];
@@ -3555,21 +3555,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
replaceRange = NSMakeRange(0,[[self string] length]);
}
- NSError *inputFileError = nil;
- NSString *input = [NSString stringWithString:[[self string] substringWithRange:replaceRange]];
- [input writeToFile:inputTempFileName
- atomically:YES
- encoding:NSUTF8StringEncoding
- error:&inputFileError];
-
- if(inputFileError != nil) {
- NSString *errorMessage = [inputFileError localizedDescription];
- SPBeginAlertSheet(NSLocalizedString(@"Bundle Error", @"bundle error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil,
- [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]);
- if (cmdData) [cmdData release];
- return;
- }
-
NSMutableDictionary *env = [NSMutableDictionary dictionary];
[env setObject:[infoPath stringByDeletingLastPathComponent] forKey:@"SP_BUNDLE_PATH"];
[env setObject:inputTempFileName forKey:@"SP_BUNDLE_INPUT_FILE"];
@@ -3613,8 +3598,25 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
if(currentLineRange.length)
[env setObject:[[self string] substringWithRange:currentLineRange] forKey:@"SP_CURRENT_LINE"];
+ NSError *inputFileError = nil;
+ NSString *input = [NSString stringWithString:[[self string] substringWithRange:replaceRange]];
+ [input writeToFile:inputTempFileName
+ atomically:YES
+ encoding:NSUTF8StringEncoding
+ error:&inputFileError];
+
+ if(inputFileError != nil) {
+ NSString *errorMessage = [inputFileError localizedDescription];
+ SPBeginAlertSheet(NSLocalizedString(@"Bundle Error", @"bundle error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil,
+ [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]);
+ if (cmdData) [cmdData release];
+ return;
+ }
+
NSString *output = [cmd runBashCommandWithEnvironment:env atCurrentDirectoryPath:nil error:&err];
+ [[NSFileManager defaultManager] removeItemAtPath:inputTempFileName error:nil];
+
if(err == nil && [cmdData objectForKey:@"output"]) {
if([[cmdData objectForKey:@"output"] length] && ![[cmdData objectForKey:@"output"] isEqualToString:@"nop"]) {
NSString *action = [[cmdData objectForKey:@"output"] lowercaseString];
@@ -3652,8 +3654,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse)
[NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]);
}
- [[NSFileManager defaultManager] removeItemAtPath:inputTempFileName error:nil];
-
}
if (cmdData) [cmdData release];