aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2010-06-07 21:59:39 +0000
committerstuconnolly <stuart02@gmail.com>2010-06-07 21:59:39 +0000
commitceffd765f621e4ad1f9d4d6775c8e55d2f136bfb (patch)
tree32025c0272b128be5189075e864ec1444318094a
parent4c7cbdf882ad1e1bb1a5a11dc59dc53b90bee686 (diff)
downloadsequelpro-ceffd765f621e4ad1f9d4d6775c8e55d2f136bfb.tar.gz
sequelpro-ceffd765f621e4ad1f9d4d6775c8e55d2f136bfb.tar.bz2
sequelpro-ceffd765f621e4ad1f9d4d6775c8e55d2f136bfb.zip
When cancelling an export remove all files already written to disk.
-rw-r--r--Source/SPExportController.h5
-rw-r--r--Source/SPExportController.m25
-rw-r--r--Source/SPExportInitializer.h2
-rw-r--r--Source/SPExportInitializer.m16
4 files changed, 40 insertions, 8 deletions
diff --git a/Source/SPExportController.h b/Source/SPExportController.h
index 8d0a6969..7788ef0e 100644
--- a/Source/SPExportController.h
+++ b/Source/SPExportController.h
@@ -212,6 +212,11 @@
* Previous connection encoding was via Latin1
*/
BOOL sqlPreviousConnectionEncodingViaLatin1;
+
+ /**
+ * Array of export file paths.
+ */
+ NSMutableArray *exportFiles;
NSInteger heightOffset;
NSUInteger windowMinWidth;
diff --git a/Source/SPExportController.m b/Source/SPExportController.m
index ca4f1ac8..42d8982c 100644
--- a/Source/SPExportController.m
+++ b/Source/SPExportController.m
@@ -75,6 +75,7 @@
tables = [[NSMutableArray alloc] init];
exporters = [[NSMutableArray alloc] init];
+ exportFiles = [[NSMutableArray alloc] init];
operationQueue = [[NSOperationQueue alloc] init];
showAdvancedView = NO;
@@ -124,7 +125,9 @@
- (void)exportTables:(NSArray *)exportTables asFormat:(SPExportType)format
{
[self refreshTableList:self];
-
+
+ if ([exportFiles count] > 0) [exportFiles removeAllObjects];
+
if (exportTables && format) {
// Select the correct tab according to the supplied export type
@@ -358,12 +361,31 @@
{
[self setExportCancelled:YES];
+ [exportProgressTitle setStringValue:NSLocalizedString(@"Cancelling...", @"cancelling export message")];
+ [exportProgressText setStringValue:NSLocalizedString(@"Cleaning up...", @"cancelling export cleaning up message")];
+
+ // Disable the cancel button
+ [sender setEnabled:NO];
+
// Cancel all of the currently running operations
[operationQueue cancelAllOperations];
// Close the progress sheet
[NSApp endSheet:exportProgressWindow returnCode:0];
[exportProgressWindow orderOut:self];
+
+ // Loop the cached export file paths and remove them from disk if they exist
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+
+ for (NSString *filePath in exportFiles)
+ {
+ if ([fileManager fileExistsAtPath:filePath]) {
+ [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
+ }
+ }
+
+ // Re-enable the cancel button for future exports
+ [sender setEnabled:YES];
}
/**
@@ -637,6 +659,7 @@
{
[tables release], tables = nil;
[exporters release], exporters = nil;
+ [exportFiles release], exportFiles = nil;
[operationQueue release], operationQueue = nil;
[exportFilename release], exportFilename = nil;
diff --git a/Source/SPExportInitializer.h b/Source/SPExportInitializer.h
index 4d86f619..189a46d2 100644
--- a/Source/SPExportInitializer.h
+++ b/Source/SPExportInitializer.h
@@ -46,6 +46,6 @@
- (SPXMLExporter *)initializeXMLExporterForTable:(NSString *)table orDataArray:(NSArray *)dataArray;
- (void)writeXMLHeaderToFileHandle:(SPFileHandle *)fileHandle;
-- (SPFileHandle *)getFileHandleForFilePath:(NSString *)filePath;
+- (SPFileHandle *)getFileHandleForFilePath:(NSString *)path;
@end
diff --git a/Source/SPExportInitializer.m b/Source/SPExportInitializer.m
index c5779dc6..4b7dc38c 100644
--- a/Source/SPExportInitializer.m
+++ b/Source/SPExportInitializer.m
@@ -574,13 +574,13 @@
/**
* Returns a file handle for writing at the supplied path.
*/
-- (SPFileHandle *)getFileHandleForFilePath:(NSString *)filePath
+- (SPFileHandle *)getFileHandleForFilePath:(NSString *)path
{
SPFileHandle *fileHandle = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];
- if ([fileManager fileExistsAtPath:filePath]) {
- if ((![fileManager isWritableFileAtPath:filePath]) || (!(fileHandle = [SPFileHandle fileHandleForWritingAtPath:filePath]))) {
+ if ([fileManager fileExistsAtPath:path]) {
+ if ((![fileManager isWritableFileAtPath:path]) || (!(fileHandle = [SPFileHandle fileHandleForWritingAtPath:path]))) {
SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil,
NSLocalizedString(@"Couldn't replace the file. Be sure that you have the necessary privileges.", @"message of panel when file cannot be replaced"));
return nil;
@@ -588,17 +588,17 @@
}
// Otherwise attempt to create a file
else {
- if (![fileManager createFileAtPath:filePath contents:[NSData data] attributes:nil]) {
+ if (![fileManager createFileAtPath:path contents:[NSData data] attributes:nil]) {
SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil,
NSLocalizedString(@"Couldn't write to file. Be sure that you have the necessary privileges.", @"message of panel when file cannot be written"));
return nil;
}
// Retrieve a filehandle for the file, attempting to delete it on failure.
- fileHandle = [SPFileHandle fileHandleForWritingAtPath:filePath];
+ fileHandle = [SPFileHandle fileHandleForWritingAtPath:path];
if (!fileHandle) {
- [[NSFileManager defaultManager] removeFileAtPath:filePath handler:nil];
+ [[NSFileManager defaultManager] removeFileAtPath:path handler:nil];
SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil,
NSLocalizedString(@"Couldn't write to file. Be sure that you have the necessary privileges.", @"message of panel when file cannot be written"));
@@ -606,6 +606,10 @@
}
}
+ // Keep a record of the file handle's path in case the user cancels the export then we need to remove
+ // it from disk.
+ [exportFiles addObject:path];
+
return fileHandle;
}