diff options
author | Max <dmoagx@users.noreply.github.com> | 2017-12-30 00:36:10 +0100 |
---|---|---|
committer | Max <dmoagx@users.noreply.github.com> | 2018-01-20 02:42:36 +0100 |
commit | db2bdd8b53cede1bddde85e1527246d8e52f0fa2 (patch) | |
tree | 72c27e2eea096d226bfc0d60e0f4fe8a8ec11c3a /Source/SPExportInitializer.m | |
parent | e00786ad1ddc53ce66247124b94280a441eacf3e (diff) | |
download | sequelpro-db2bdd8b53cede1bddde85e1527246d8e52f0fa2.tar.gz sequelpro-db2bdd8b53cede1bddde85e1527246d8e52f0fa2.tar.bz2 sequelpro-db2bdd8b53cede1bddde85e1527246d8e52f0fa2.zip |
merge SPExportController (part of #2789)
Diffstat (limited to 'Source/SPExportInitializer.m')
-rw-r--r-- | Source/SPExportInitializer.m | 611 |
1 files changed, 0 insertions, 611 deletions
diff --git a/Source/SPExportInitializer.m b/Source/SPExportInitializer.m deleted file mode 100644 index 9269cac8..00000000 --- a/Source/SPExportInitializer.m +++ /dev/null @@ -1,611 +0,0 @@ -// -// SPExportInitializer.m -// sequel-pro -// -// Created by Stuart Connolly (stuconnolly.com) on March 31, 2010. -// Copyright (c) 2010 Stuart Connolly. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -// More info at <https://github.com/sequelpro/sequelpro> - -#import "SPExportInitializer.h" -#import "SPTableData.h" -#import "SPDatabaseDocument.h" -#import "SPTablesList.h" -#import "SPGrowlController.h" -#import "SPDatabaseDocument.h" -#import "SPCustomQuery.h" -#import "SPAlertSheets.h" -#import "SPTableContent.h" -#import "SPCSVExporter.h" -#import "SPSQLExporter.h" -#import "SPXMLExporter.h" -#import "SPDotExporter.h" -#import "SPExportFile.h" -#import "SPExportFileUtilities.h" -#import "SPExportFilenameUtilities.h" -#import "SPExportFileNameTokenObject.h" -#import "SPConnectionControllerDelegateProtocol.h" -#import "SPExportController+SharedPrivateAPI.h" -#import "SPSQLExporterDelegate.h" - -#import <SPMySQL/SPMySQL.h> - -@implementation SPExportController (SPExportInitializer) - -/** - * Starts the export process by placing the first exporter on the operation queue. Also opens the progress - * sheet if it's not already visible. - */ -- (void)startExport -{ - // Start progress indicator - [exportProgressTitle setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Exporting %@", @"text showing that the application is importing a supplied format"), exportTypeLabel]]; - [exportProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; - - [exportProgressIndicator setUsesThreadedAnimation:NO]; - [exportProgressIndicator setIndeterminate:NO]; - [exportProgressIndicator setDoubleValue:0]; - - // If it's not already displayed, open the progress sheet - if (![exportProgressWindow isVisible]) { - [NSApp beginSheet:exportProgressWindow - modalForWindow:[tableDocumentInstance parentWindow] - modalDelegate:self - didEndSelector:nil - contextInfo:nil]; - } - - // cache the current connection encoding so the exporter can do what it wants. - previousConnectionEncoding = [[NSString alloc] initWithString:[connection encoding]]; - previousConnectionEncodingViaLatin1 = [connection encodingUsesLatin1Transport]; - - // Add the first exporter to the operation queue - [operationQueue addOperation:[exporters objectAtIndex:0]]; - - // Remove the exporter we just added to the operation queue from our list of exporters - // so we know it's already been done. - [exporters removeObjectAtIndex:0]; -} - -/** - * @see _queueIsEmptyAfterCancelling: - */ -- (void)exportEnded -{ - [self _hideExportProgress]; - - // Restore query mode - [tableDocumentInstance setQueryMode:SPInterfaceQueryMode]; - - // Display Growl notification - [self displayExportFinishedGrowlNotification]; - - // Restore the connection encoding to it's pre-export value - [tableDocumentInstance setConnectionEncoding:[NSString stringWithFormat:@"%@%@", previousConnectionEncoding, (previousConnectionEncodingViaLatin1) ? @"-" : @""] reloadingViews:NO]; -} - -/** - * Initializes the export process by analysing the selected criteria. - */ -- (void)initializeExportUsingSelectedOptions -{ - NSArray *dataArray = nil; - - // Get rid of the cached connection encoding - if (previousConnectionEncoding) SPClear(previousConnectionEncoding); - - createCustomFilename = ([[exportCustomFilenameTokenField stringValue] length] > 0); - - NSMutableArray *exportTables = [NSMutableArray array]; - - // Set whether or not we are to export to multiple files - [self setExportToMultipleFiles:[exportFilePerTableCheck state]]; - - // Get the data depending on the source - switch (exportSource) - { - case SPFilteredExport: - dataArray = [tableContentInstance currentDataResultWithNULLs:YES hideBLOBs:NO]; - break; - case SPQueryExport: - dataArray = [customQueryInstance currentDataResultWithNULLs:YES truncateDataFields:NO]; - break; - case SPTableExport: - // Create an array of tables to export - for (NSMutableArray *table in tables) - { - if (exportType == SPSQLExport) { - if ([[table objectAtIndex:1] boolValue] || [[table objectAtIndex:2] boolValue] || [[table objectAtIndex:3] boolValue]) { - - // Check the overall export settings - if ([[table objectAtIndex:1] boolValue] && (![exportSQLIncludeStructureCheck state])) { - [table replaceObjectAtIndex:1 withObject:@NO]; - } - - if ([[table objectAtIndex:2] boolValue] && (![exportSQLIncludeContentCheck state])) { - [table replaceObjectAtIndex:2 withObject:@NO]; - } - - if ([[table objectAtIndex:3] boolValue] && (![exportSQLIncludeDropSyntaxCheck state])) { - [table replaceObjectAtIndex:3 withObject:@NO]; - } - - [exportTables addObject:table]; - } - } - else if (exportType == SPDotExport) { - [exportTables addObject:[table objectAtIndex:0]]; - } - else { - if ([[table objectAtIndex:2] boolValue]) { - [exportTables addObject:[table objectAtIndex:0]]; - } - } - } - - break; - } - - // Set the export type label - switch (exportType) - { - case SPSQLExport: - exportTypeLabel = @"SQL"; - break; - case SPCSVExport: - exportTypeLabel = @"CSV"; - break; - case SPXMLExport: - exportTypeLabel = @"XML"; - break; - case SPDotExport: - exportTypeLabel = @"Dot"; - break; - case SPPDFExport: - case SPHTMLExport: - case SPExcelExport: - default: - [NSException raise:NSInvalidArgumentException format:@"unsupported exportType=%lu",exportType]; - return; - } - - // Begin the export based on the source - switch (exportSource) - { - case SPFilteredExport: - case SPQueryExport: - [self exportTables:nil orDataArray:dataArray]; - break; - case SPTableExport: - [self exportTables:exportTables orDataArray:nil]; - break; - } -} - -/** - * Exports the contents of the supplied array of tables or data array. - * - * Note that at least one of these parameters must not be nil. - * - * @param exportTables An array of table/view names to be exported (can be nil). - * @param dataArray A MySQL result set array to be exported (can be nil). - */ -- (void)exportTables:(NSArray *)exportTables orDataArray:(NSArray *)dataArray -{ - BOOL singleFileHandleSet = NO; - SPExportFile *singleExportFile = nil, *file = nil; - - // Change query logging mode - [tableDocumentInstance setQueryMode:SPImportExportQueryMode]; - - // Start the notification timer to allow notifications to be shown even if frontmost for long queries - [[SPGrowlController sharedGrowlController] setVisibilityForNotificationName:@"Export Finished"]; - - // Setup the progress sheet - [exportProgressTitle setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Exporting %@", @"text showing that the application is importing a supplied format"), exportTypeLabel]]; - [exportProgressText setStringValue:NSLocalizedString(@"Initializing...", @"initializing export label")]; - - [exportProgressIndicator setIndeterminate:YES]; - [exportProgressIndicator setUsesThreadedAnimation:YES]; - - // Open the progress sheet - [NSApp beginSheet:exportProgressWindow - modalForWindow:[tableDocumentInstance parentWindow] - modalDelegate:self - didEndSelector:nil - contextInfo:nil]; - - // CSV export - if (exportType == SPCSVExport) { - - SPCSVExporter *csvExporter = nil; - - // If the user has selected to only export to a single file or this is a filtered or custom query - // export, create the single file now and assign it to all subsequently created exporters. - if ((![self exportToMultipleFiles]) || (exportSource == SPFilteredExport) || (exportSource == SPQueryExport)) { - NSString *selectedTableName = nil; - - if (exportSource == SPTableExport && [exportTables count] == 1) selectedTableName = [exportTables objectAtIndex:0]; - - [exportFilename setString:createCustomFilename ? [self expandCustomFilenameFormatUsingTableName:selectedTableName] : [self generateDefaultExportFilename]]; - - // Only append the extension if necessary - if (![[exportFilename pathExtension] length]) { - [exportFilename setString:[exportFilename stringByAppendingPathExtension:[self currentDefaultExportFileExtension]]]; - } - - singleExportFile = [SPExportFile exportFileAtPath:[[exportPathField stringValue] stringByAppendingPathComponent:exportFilename]]; - } - - // Start the export process depending on the data source - if (exportSource == SPTableExport) { - - // Cache the number of tables being exported - exportTableCount = [exportTables count]; - - // Loop through the tables, creating an exporter for each - for (NSString *table in exportTables) - { - csvExporter = [self initializeCSVExporterForTable:table orDataArray:nil]; - - // If required create a single file handle for all CSV exports - if (![self exportToMultipleFiles]) { - if (!singleFileHandleSet) { - [singleExportFile setExportFileNeedsCSVHeader:YES]; - - [exportFiles addObject:singleExportFile]; - - singleFileHandleSet = YES; - } - - [csvExporter setExportOutputFile:singleExportFile]; - } - - [exporters addObject:csvExporter]; - } - } - else { - csvExporter = [self initializeCSVExporterForTable:nil orDataArray:dataArray]; - - [exportFiles addObject:singleExportFile]; - - [csvExporter setExportOutputFile:singleExportFile]; - - [exporters addObject:csvExporter]; - } - } - // SQL export - else if (exportType == SPSQLExport) { - - // Cache the number of tables being exported - exportTableCount = [exportTables count]; - - SPSQLExporter *sqlExporter = [[SPSQLExporter alloc] initWithDelegate:self]; - - [sqlExporter setSqlDatabaseHost:[tableDocumentInstance host]]; - [sqlExporter setSqlDatabaseName:[tableDocumentInstance database]]; - [sqlExporter setSqlDatabaseVersion:[tableDocumentInstance mySQLVersion]]; - - [sqlExporter setSqlOutputIncludeUTF8BOM:[exportUseUTF8BOMButton state]]; - [sqlExporter setSqlOutputEncodeBLOBasHex:[exportSQLBLOBFieldsAsHexCheck state]]; - [sqlExporter setSqlOutputIncludeErrors:[exportSQLIncludeErrorsCheck state]]; - [sqlExporter setSqlOutputIncludeAutoIncrement:([exportSQLIncludeStructureCheck state] && [exportSQLIncludeAutoIncrementValueButton state])]; - - [sqlExporter setSqlInsertAfterNValue:[exportSQLInsertNValueTextField integerValue]]; - [sqlExporter setSqlInsertDivider:[exportSQLInsertDividerPopUpButton indexOfSelectedItem]]; - - [sqlExporter setSqlExportTables:exportTables]; - - // Create custom filename if required - NSString *selectedTableName = (exportSource == SPTableExport && [exportTables count] == 1)? [[exportTables objectAtIndex:0] objectAtIndex:0] : nil; - [exportFilename setString:(createCustomFilename) ? [self expandCustomFilenameFormatUsingTableName:selectedTableName] : [self generateDefaultExportFilename]]; - - // Only append the extension if necessary - if (![[exportFilename pathExtension] length]) { - [exportFilename setString:[exportFilename stringByAppendingPathExtension:[self currentDefaultExportFileExtension]]]; - } - - file = [SPExportFile exportFileAtPath:[[exportPathField stringValue] stringByAppendingPathComponent:exportFilename]]; - - [exportFiles addObject:file]; - - [sqlExporter setExportOutputFile:file]; - - [exporters addObject:sqlExporter]; - - [sqlExporter release]; - } - // XML export - else if (exportType == SPXMLExport) { - - SPXMLExporter *xmlExporter = nil; - - // If the user has selected to only export to a single file or this is a filtered or custom query - // export, create the single file now and assign it to all subsequently created exporters. - if ((![self exportToMultipleFiles]) || (exportSource == SPFilteredExport) || (exportSource == SPQueryExport)) { - NSString *selectedTableName = nil; - if (exportSource == SPTableExport && [exportTables count] == 1) selectedTableName = [exportTables objectAtIndex:0]; - - [exportFilename setString:(createCustomFilename) ? [self expandCustomFilenameFormatUsingTableName:selectedTableName] : [self generateDefaultExportFilename]]; - - // Only append the extension if necessary - if (![[exportFilename pathExtension] length]) { - [exportFilename setString:[exportFilename stringByAppendingPathExtension:[self currentDefaultExportFileExtension]]]; - } - - singleExportFile = [SPExportFile exportFileAtPath:[[exportPathField stringValue] stringByAppendingPathComponent:exportFilename]]; - } - - // Start the export process depending on the data source - if (exportSource == SPTableExport) { - - // Cache the number of tables being exported - exportTableCount = [exportTables count]; - - // Loop through the tables, creating an exporter for each - for (NSString *table in exportTables) - { - xmlExporter = [self initializeXMLExporterForTable:table orDataArray:nil]; - - // If required create a single file handle for all XML exports - if (![self exportToMultipleFiles]) { - if (!singleFileHandleSet) { - [singleExportFile setExportFileNeedsXMLHeader:YES]; - - [exportFiles addObject:singleExportFile]; - - singleFileHandleSet = YES; - } - - [xmlExporter setExportOutputFile:singleExportFile]; - } - - [exporters addObject:xmlExporter]; - } - } - else { - xmlExporter = [self initializeXMLExporterForTable:nil orDataArray:dataArray]; - - [singleExportFile setExportFileNeedsXMLHeader:YES]; - - [exportFiles addObject:singleExportFile]; - - [xmlExporter setExportOutputFile:singleExportFile]; - - [exporters addObject:xmlExporter]; - } - } - // Dot export - else if (exportType == SPDotExport) { - - // Cache the number of tables being exported - exportTableCount = [exportTables count]; - - SPDotExporter *dotExporter = [[SPDotExporter alloc] initWithDelegate:self]; - - [dotExporter setDotTableData:tableDataInstance]; - [dotExporter setDotForceLowerTableNames:[exportDotForceLowerTableNamesCheck state]]; - [dotExporter setDotDatabaseHost:[tableDocumentInstance host]]; - [dotExporter setDotDatabaseName:[tableDocumentInstance database]]; - [dotExporter setDotDatabaseVersion:[tableDocumentInstance mySQLVersion]]; - - [dotExporter setDotExportTables:exportTables]; - - // Create custom filename if required - if (createCustomFilename) { - [exportFilename setString:[self expandCustomFilenameFormatUsingTableName:nil]]; - } - else { - [exportFilename setString:[tableDocumentInstance database]]; - } - - // Only append the extension if necessary - if (![[exportFilename pathExtension] length]) { - [exportFilename setString:[exportFilename stringByAppendingPathExtension:[self currentDefaultExportFileExtension]]]; - } - - file = [SPExportFile exportFileAtPath:[[exportPathField stringValue] stringByAppendingPathComponent:exportFilename]]; - - [exportFiles addObject:file]; - - [dotExporter setExportOutputFile:file]; - - [exporters addObject:dotExporter]; - - [dotExporter release]; - } - - // For each of the created exporters, set their generic properties - for (SPExporter *exporter in exporters) - { - [exporter setConnection:connection]; - [exporter setServerSupport:[self serverSupport]]; - [exporter setExportOutputEncoding:[connection stringEncoding]]; - [exporter setExportMaxProgress:(NSInteger)[exportProgressIndicator bounds].size.width]; - [exporter setExportUsingLowMemoryBlockingStreaming:([exportProcessLowMemoryButton state] == NSOnState)]; - [exporter setExportOutputCompressionFormat:(SPFileCompressionFormat)[exportOutputCompressionFormatPopupButton indexOfSelectedItem]]; - [exporter setExportOutputCompressFile:([exportOutputCompressionFormatPopupButton indexOfSelectedItem] != SPNoCompression)]; - } - - NSMutableArray *problemFiles = [[NSMutableArray alloc] init]; - - // Create the actual file handles while dealing with errors (e.g. file already exists, etc) during creation - for (SPExportFile *exportFile in exportFiles) - { - if ([exportFile createExportFileHandle:NO] == SPExportFileHandleCreated) { - - [exportFile setCompressionFormat:(SPFileCompressionFormat)[exportOutputCompressionFormatPopupButton indexOfSelectedItem]]; - - if ([exportFile exportFileNeedsCSVHeader]) { - [self writeCSVHeaderToExportFile:exportFile]; - } - else if ([exportFile exportFileNeedsXMLHeader]) { - [self writeXMLHeaderToExportFile:exportFile]; - } - } - else { - [problemFiles addObject:exportFile]; - } - } - - // Deal with any file handles that we failed to create for whatever reason - if ([problemFiles count] > 0) { - [self errorCreatingExportFileHandles:problemFiles]; - } - else { - [self startExport]; - } - - [problemFiles release]; -} - -/** - * Initialises a CSV exporter for the supplied table name or data array. - * - * @param table The table name for which the exporter should be cerated for (can be nil). - * @param dataArray The MySQL result data array for which the exporter should be created for (can be nil). - */ -- (SPCSVExporter *)initializeCSVExporterForTable:(NSString *)table orDataArray:(NSArray *)dataArray -{ - SPCSVExporter *csvExporter = [[SPCSVExporter alloc] initWithDelegate:self]; - - // Depeding on the export source, set the table name or data array - if (exportSource == SPTableExport) { - [csvExporter setCsvTableName:table]; - } - else { - [csvExporter setCsvDataArray:dataArray]; - } - - [csvExporter setCsvTableData:tableDataInstance]; - [csvExporter setCsvOutputFieldNames:[exportCSVIncludeFieldNamesCheck state]]; - [csvExporter setCsvFieldSeparatorString:[exportCSVFieldsTerminatedField stringValue]]; - [csvExporter setCsvEnclosingCharacterString:[exportCSVFieldsWrappedField stringValue]]; - [csvExporter setCsvLineEndingString:[exportCSVLinesTerminatedField stringValue]]; - [csvExporter setCsvEscapeString:[exportCSVFieldsEscapedField stringValue]]; - [csvExporter setCsvNULLString:[exportCSVNULLValuesAsTextField stringValue]]; - - // If required create separate files - if (exportSource == SPTableExport && [self exportToMultipleFiles]) { - - if (createCustomFilename) { - - // Create custom filename based on the selected format - [exportFilename setString:[self expandCustomFilenameFormatUsingTableName:table]]; - - // If the user chose to use a custom filename format and we exporting to multiple files, make - // sure the table name is included to ensure the output files are unique. - if (exportTableCount > 1) { - BOOL tableNameInTokens = NO; - NSArray *representedObjects = [exportCustomFilenameTokenField objectValue]; - for (id representedObject in representedObjects) { - if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]] && [[representedObject tokenId] isEqualToString:SPFileNameTableTokenName]) tableNameInTokens = YES; - } - [exportFilename setString:(tableNameInTokens ? exportFilename : [exportFilename stringByAppendingFormat:@"_%@", table])]; - } - } - else { - [exportFilename setString:(dataArray) ? [tableDocumentInstance database] : table]; - } - - // Only append the extension if necessary - if (![[exportFilename pathExtension] length]) { - [exportFilename setString:[exportFilename stringByAppendingPathExtension:[self currentDefaultExportFileExtension]]]; - } - - SPExportFile *file = [SPExportFile exportFileAtPath:[[exportPathField stringValue] stringByAppendingPathComponent:exportFilename]]; - - [exportFiles addObject:file]; - - [csvExporter setExportOutputFile:file]; - } - - return [csvExporter autorelease]; -} - -/** - * Initialises a XML exporter for the supplied table name or data array. - * - * @param table The table name for which the exporter should be cerated for (can be nil). - * @param dataArray The MySQL result data array for which the exporter should be created for (can be nil). - */ -- (SPXMLExporter *)initializeXMLExporterForTable:(NSString *)table orDataArray:(NSArray *)dataArray -{ - SPXMLExporter *xmlExporter = [[SPXMLExporter alloc] initWithDelegate:self]; - - // if required set the data array - if (exportSource != SPTableExport) { - [xmlExporter setXmlDataArray:dataArray]; - } - - // Regardless of the export source, set exporter's table name as it's used in the output - // of table and table content exports. - [xmlExporter setXmlTableName:table]; - - [xmlExporter setXmlFormat:[exportXMLFormatPopUpButton indexOfSelectedItem]]; - [xmlExporter setXmlOutputIncludeStructure:[exportXMLIncludeStructure state]]; - [xmlExporter setXmlOutputIncludeContent:[exportXMLIncludeContent state]]; - [xmlExporter setXmlNULLString:[exportXMLNULLValuesAsTextField stringValue]]; - - // If required create separate files - if ((exportSource == SPTableExport) && exportToMultipleFiles && (exportTableCount > 0)) { - - if (createCustomFilename) { - - // Create custom filename based on the selected format - [exportFilename setString:[self expandCustomFilenameFormatUsingTableName:table]]; - - // If the user chose to use a custom filename format and we exporting to multiple files, make - // sure the table name is included to ensure the output files are unique. - if (exportTableCount > 1) { - BOOL tableNameInTokens = NO; - NSArray *representedObjects = [exportCustomFilenameTokenField objectValue]; - for (id representedObject in representedObjects) { - if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]] && [[representedObject tokenId] isEqualToString:SPFileNameTableTokenName]) tableNameInTokens = YES; - } - [exportFilename setString:(tableNameInTokens ? exportFilename : [exportFilename stringByAppendingFormat:@"_%@", table])]; - } - } - else { - [exportFilename setString:(dataArray) ? [tableDocumentInstance database] : table]; - } - - // Only append the extension if necessary - if (![[exportFilename pathExtension] length]) { - [exportFilename setString:[exportFilename stringByAppendingPathExtension:[self currentDefaultExportFileExtension]]]; - } - - SPExportFile *file = [SPExportFile exportFileAtPath:[[exportPathField stringValue] stringByAppendingPathComponent:exportFilename]]; - - [file setExportFileNeedsXMLHeader:YES]; - - [exportFiles addObject:file]; - - [xmlExporter setExportOutputFile:file]; - } - - return [xmlExporter autorelease]; -} - -@end |