From c8146f9c28da66f02d47537e505a70725fb0c2b4 Mon Sep 17 00:00:00 2001 From: mltownsend Date: Mon, 10 Nov 2008 19:56:30 +0000 Subject: New XCode project --- TableDump.m | 2297 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 1149 insertions(+), 1148 deletions(-) (limited to 'TableDump.m') diff --git a/TableDump.m b/TableDump.m index d5d0eaa3..5687eab1 100644 --- a/TableDump.m +++ b/TableDump.m @@ -39,33 +39,33 @@ get the tables in db */ { - CMMCPResult *queryResult; - int i; + CMMCPResult *queryResult; + int i; //get tables - [tables removeAllObjects]; - queryResult = [mySQLConnection listTables]; - for ( i = 0 ; i < [queryResult numOfRows] ; i++ ) { - [queryResult dataSeek:i]; - [tables addObject:[NSMutableArray arrayWithObjects: - [NSNumber numberWithBool:YES], [[queryResult fetchRowAsArray] objectAtIndex:0], nil]]; - } - - [exportDumpTableView reloadData]; - [exportMultipleCSVTableView reloadData]; - [exportMultipleXMLTableView reloadData]; + [tables removeAllObjects]; + queryResult = [mySQLConnection listTables]; + for ( i = 0 ; i < [queryResult numOfRows] ; i++ ) { + [queryResult dataSeek:i]; + [tables addObject:[NSMutableArray arrayWithObjects: + [NSNumber numberWithBool:YES], [[queryResult fetchRowAsArray] objectAtIndex:0], nil]]; + } + + [exportDumpTableView reloadData]; + [exportMultipleCSVTableView reloadData]; + [exportMultipleXMLTableView reloadData]; /* //disable buttons if there are no tables in db (or no db is selected) - if ( ![tables count] ) { - [dumpButton setEnabled:NO]; - } else { - [dumpButton setEnabled:YES]; - } - if ( ![tableDocumentInstance database] ) { - [readButton setEnabled:NO]; - } else { - [readButton setEnabled:YES]; - } + if ( ![tables count] ) { + [dumpButton setEnabled:NO]; + } else { + [dumpButton setEnabled:YES]; + } + if ( ![tableDocumentInstance database] ) { + [readButton setEnabled:NO]; + } else { + [readButton setEnabled:YES]; + } */ } @@ -74,23 +74,23 @@ get the tables in db selects or deselects all tables */ { - NSEnumerator *enumerator; - id theObject; - - [self reloadTables:self]; - - enumerator = [tables objectEnumerator]; - while ( (theObject = [enumerator nextObject]) ) { - if ( [sender tag] ) { - [theObject replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:YES]]; - } else { - [theObject replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:NO]]; - } - } - - [exportDumpTableView reloadData]; - [exportMultipleCSVTableView reloadData]; - [exportMultipleXMLTableView reloadData]; + NSEnumerator *enumerator; + id theObject; + + [self reloadTables:self]; + + enumerator = [tables objectEnumerator]; + while ( (theObject = [enumerator nextObject]) ) { + if ( [sender tag] ) { + [theObject replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:YES]]; + } else { + [theObject replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:NO]]; + } + } + + [exportDumpTableView reloadData]; + [exportMultipleCSVTableView reloadData]; + [exportMultipleXMLTableView reloadData]; } - (IBAction)closeSheet:(id)sender @@ -98,7 +98,7 @@ selects or deselects all tables ends the modal session */ { - [NSApp stopModalWithCode:[sender tag]]; + [NSApp stopModalWithCode:[sender tag]]; } - (IBAction)stepRow:(id)sender @@ -106,25 +106,25 @@ ends the modal session displays next/previous row in fieldMapping tableView */ { - if ( [sender tag] == 0 ) { - currentRow--; - [self setupFieldMappingArray]; - } else { - currentRow++; - [self setupFieldMappingArray]; - } - - //enable/disable buttons - if ( currentRow == 0 ) { - [rowDownButton setEnabled:NO]; - [rowUpButton setEnabled:YES]; - } else if ( currentRow == ([importArray count]-1) ) { - [rowDownButton setEnabled:YES]; - [rowUpButton setEnabled:NO]; - } else { - [rowDownButton setEnabled:YES]; - [rowUpButton setEnabled:YES]; - } + if ( [sender tag] == 0 ) { + currentRow--; + [self setupFieldMappingArray]; + } else { + currentRow++; + [self setupFieldMappingArray]; + } + + //enable/disable buttons + if ( currentRow == 0 ) { + [rowDownButton setEnabled:NO]; + [rowUpButton setEnabled:YES]; + } else if ( currentRow == ([importArray count]-1) ) { + [rowDownButton setEnabled:YES]; + [rowUpButton setEnabled:NO]; + } else { + [rowDownButton setEnabled:YES]; + [rowUpButton setEnabled:YES]; + } } @@ -134,64 +134,64 @@ displays next/previous row in fieldMapping tableView invoked when user clicks on an export menuItem */ { - NSString *file; - NSString *contextInfo; - NSSavePanel *savePanel = [NSSavePanel savePanel]; - NSString *currentDate = [[NSDate date] descriptionWithCalendarFormat:@"%d.%m.%Y" timeZone:nil locale:nil]; - - switch ( tag ) { - case 5: - //export dump - [self reloadTables:self]; - file = [NSString stringWithFormat:@"%@_dump %@.sql", [tableDocumentInstance database], currentDate]; - [savePanel setAccessoryView:exportDumpView]; - contextInfo = @"exportDump"; - break; - case 6: - //export table content as CSV - file = [NSString stringWithFormat:@"%@.csv", [tableDocumentInstance table]]; - [savePanel setAccessoryView:exportCSVView]; - contextInfo = @"exportTableContentAsCSV"; - break; - case 7: - //export table content as XML - file = [NSString stringWithFormat:@"%@.xml", [tableDocumentInstance table]]; - contextInfo = @"exportTableContentAsXML"; - break; - case 8: - //export custom result as CSV - file = @"customresult.csv"; - [savePanel setAccessoryView:exportCSVView]; - contextInfo = @"exportCustomResultAsCSV"; - break; - case 9: - //export custom result as XML - file = @"customresult.xml"; - contextInfo = @"exportCustomResultAsXML"; - break; - case 10: - //export multiple tables as CSV - [self reloadTables:self]; - file = [NSString stringWithFormat:@"%@.csv", [tableDocumentInstance database]]; - [savePanel setAccessoryView:exportMultipleCSVView]; - contextInfo = @"exportMultipleTablesAsCSV"; - break; - case 11: - //export multiple tables as XML - [self reloadTables:self]; - file = [NSString stringWithFormat:@"%@.xml", [tableDocumentInstance database]]; - [savePanel setAccessoryView:exportMultipleXMLView]; - contextInfo = @"exportMultipleTablesAsXML"; - break; - default: - NSLog(@"ERROR: unknown export item with tag %d", tag); - return; - break; - } - //open savePanel - [savePanel beginSheetForDirectory:[prefs objectForKey:@"savePath"] - file:file modalForWindow:tableWindow modalDelegate:self - didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:contextInfo]; + NSString *file; + NSString *contextInfo; + NSSavePanel *savePanel = [NSSavePanel savePanel]; + NSString *currentDate = [[NSDate date] descriptionWithCalendarFormat:@"%d.%m.%Y" timeZone:nil locale:nil]; + + switch ( tag ) { + case 5: + //export dump + [self reloadTables:self]; + file = [NSString stringWithFormat:@"%@_dump %@.sql", [tableDocumentInstance database], currentDate]; + [savePanel setAccessoryView:exportDumpView]; + contextInfo = @"exportDump"; + break; + case 6: + //export table content as CSV + file = [NSString stringWithFormat:@"%@.csv", [tableDocumentInstance table]]; + [savePanel setAccessoryView:exportCSVView]; + contextInfo = @"exportTableContentAsCSV"; + break; + case 7: + //export table content as XML + file = [NSString stringWithFormat:@"%@.xml", [tableDocumentInstance table]]; + contextInfo = @"exportTableContentAsXML"; + break; + case 8: + //export custom result as CSV + file = @"customresult.csv"; + [savePanel setAccessoryView:exportCSVView]; + contextInfo = @"exportCustomResultAsCSV"; + break; + case 9: + //export custom result as XML + file = @"customresult.xml"; + contextInfo = @"exportCustomResultAsXML"; + break; + case 10: + //export multiple tables as CSV + [self reloadTables:self]; + file = [NSString stringWithFormat:@"%@.csv", [tableDocumentInstance database]]; + [savePanel setAccessoryView:exportMultipleCSVView]; + contextInfo = @"exportMultipleTablesAsCSV"; + break; + case 11: + //export multiple tables as XML + [self reloadTables:self]; + file = [NSString stringWithFormat:@"%@.xml", [tableDocumentInstance database]]; + [savePanel setAccessoryView:exportMultipleXMLView]; + contextInfo = @"exportMultipleTablesAsXML"; + break; + default: + NSLog(@"ERROR: unknown export item with tag %d", tag); + return; + break; + } + //open savePanel + [savePanel beginSheetForDirectory:[prefs objectForKey:@"savePath"] + file:file modalForWindow:tableWindow modalDelegate:self + didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:contextInfo]; } - (void)savePanelDidEnd:(NSSavePanel *)sheet returnCode:(int)returnCode contextInfo:(NSString *)contextInfo @@ -199,87 +199,88 @@ invoked when user clicks on an export menuItem saves the export file */ { - NSString *testString = @""; + NSString *testString = @""; NSError **errorStr; - id fileContent; + id fileContent; BOOL success; - - [sheet orderOut:self]; - if ( returnCode != NSOKButton ) - return; + + [sheet orderOut:self]; + if ( returnCode != NSOKButton ) + return; //save path to preferences - [prefs setObject:[sheet directory] forKey:@"savePath"]; + [prefs setObject:[sheet directory] forKey:@"savePath"]; //error if file exists and is not writable - if ( [[NSFileManager defaultManager] fileExistsAtPath:[sheet filename]] ) { - if ( ![[NSFileManager defaultManager] isWritableFileAtPath:[sheet filename]] ) { - NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, 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; - } - } else { + if ( [[NSFileManager defaultManager] fileExistsAtPath:[sheet filename]] ) { + if ( ![[NSFileManager defaultManager] isWritableFileAtPath:[sheet filename]] ) { + NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, 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; + } + } else { //error if file cannot be written - if ( ![testString writeToFile:[sheet filename] atomically:YES] ) { - NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, 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; - } - } - - if ( [contextInfo isEqualToString:@"exportDump"] ) { - //export dump of selected database - fileContent = [self dumpForSelectedTables]; - } else if ( [contextInfo isEqualToString:@"exportCustomResultAsCSV"] ) { - //export custom query result as csv - fileContent = [self csvForArray:[customQueryInstance currentResult] useFirstLine:[exportFieldNamesSwitch state] - terminatedBy:[exportFieldsTerminatedField stringValue] - enclosedBy:[exportFieldsEnclosedField stringValue] - escapedBy:[exportFieldsEscapedField stringValue] - lineEnds:[exportLinesTerminatedField stringValue] - silently:NO]; - } else if ( [contextInfo isEqualToString:@"exportTableContentAsCSV"] ) { - //export table content as csv - fileContent = [self csvForArray:[tableContentInstance currentResult] useFirstLine:[exportFieldNamesSwitch state] - terminatedBy:[exportFieldsTerminatedField stringValue] - enclosedBy:[exportFieldsEnclosedField stringValue] - escapedBy:[exportFieldsEscapedField stringValue] - lineEnds:[exportLinesTerminatedField stringValue] - silently:NO]; - } else if ( [contextInfo isEqualToString:@"exportMultipleTablesAsCSV"] ) { - //export multiple tables as CSV - fileContent = [self stringForSelectedTablesWithType:@"csv"]; - } else if ( [contextInfo isEqualToString:@"exportCustomResultAsXML"] ) { - //export custom query result as XML - fileContent = [self xmlForArray:[customQueryInstance currentResult] - tableName:@"custom" - withHeader:YES - silently:NO]; - } else if ( [contextInfo isEqualToString:@"exportTableContentAsXML"] ) { - //export table content as XML - fileContent = [self xmlForArray:[tableContentInstance currentResult] - tableName:[tableDocumentInstance table] - withHeader:YES - silently:NO]; - } else if ( [contextInfo isEqualToString:@"exportMultipleTablesAsXML"] ) { - //export multiple tables as XML - fileContent = [self stringForSelectedTablesWithType:@"xml"]; - } else { - //unknown operation - NSLog(@"unknown operation %@", [contextInfo description]); - fileContent = @""; - } + // MLT: Need to use make use of NSError here + if ( ![testString writeToFile:[sheet filename] atomically:YES encoding:NSUTF8StringEncoding error:nil] ) { + NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, 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; + } + } + + if ( [contextInfo isEqualToString:@"exportDump"] ) { + //export dump of selected database + fileContent = [self dumpForSelectedTables]; + } else if ( [contextInfo isEqualToString:@"exportCustomResultAsCSV"] ) { + //export custom query result as csv + fileContent = [self csvForArray:[customQueryInstance currentResult] useFirstLine:[exportFieldNamesSwitch state] + terminatedBy:[exportFieldsTerminatedField stringValue] + enclosedBy:[exportFieldsEnclosedField stringValue] + escapedBy:[exportFieldsEscapedField stringValue] + lineEnds:[exportLinesTerminatedField stringValue] + silently:NO]; + } else if ( [contextInfo isEqualToString:@"exportTableContentAsCSV"] ) { + //export table content as csv + fileContent = [self csvForArray:[tableContentInstance currentResult] useFirstLine:[exportFieldNamesSwitch state] + terminatedBy:[exportFieldsTerminatedField stringValue] + enclosedBy:[exportFieldsEnclosedField stringValue] + escapedBy:[exportFieldsEscapedField stringValue] + lineEnds:[exportLinesTerminatedField stringValue] + silently:NO]; + } else if ( [contextInfo isEqualToString:@"exportMultipleTablesAsCSV"] ) { + //export multiple tables as CSV + fileContent = [self stringForSelectedTablesWithType:@"csv"]; + } else if ( [contextInfo isEqualToString:@"exportCustomResultAsXML"] ) { + //export custom query result as XML + fileContent = [self xmlForArray:[customQueryInstance currentResult] + tableName:@"custom" + withHeader:YES + silently:NO]; + } else if ( [contextInfo isEqualToString:@"exportTableContentAsXML"] ) { + //export table content as XML + fileContent = [self xmlForArray:[tableContentInstance currentResult] + tableName:[tableDocumentInstance table] + withHeader:YES + silently:NO]; + } else if ( [contextInfo isEqualToString:@"exportMultipleTablesAsXML"] ) { + //export multiple tables as XML + fileContent = [self stringForSelectedTablesWithType:@"xml"]; + } else { + //unknown operation + NSLog(@"unknown operation %@", [contextInfo description]); + fileContent = @""; + } if ( [fileContent respondsToSelector:@selector(writeToFile:atomically:encoding:error:)] ) { // mac os 10.4 or later - success = [fileContent writeToFile:[sheet filename] atomically:YES encoding:[CMMCPConnection encodingForMySQLEncoding:[[tableDocumentInstance encoding] cString]] error:errorStr]; + success = [fileContent writeToFile:[sheet filename] atomically:YES encoding:[CMMCPConnection encodingForMySQLEncoding:[[tableDocumentInstance encoding] UTF8String]] error:errorStr]; } else { // mac os pre 10.4 success = [fileContent writeToFile:[sheet filename] atomically:YES]; } - if ( !success ) { - NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, - NSLocalizedString(@"Couldn't write to file. Be sure that you have the necessary privileges.", @"message of panel when file cannot be written")); - } + if ( !success ) { + NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, + NSLocalizedString(@"Couldn't write to file. Be sure that you have the necessary privileges.", @"message of panel when file cannot be written")); + } // Export Finished Growl Notification [GrowlApplicationBridge notifyWithTitle:@"Export Finished" @@ -300,9 +301,9 @@ saves the export file opens the NSOpenPanel { - [[NSOpenPanel openPanel] beginSheetForDirectory:[prefs objectForKey:@"openPath"] file:nil types:nil - modalForWindow:tableWindow modalDelegate:self - didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; + [[NSOpenPanel openPanel] beginSheetForDirectory:[prefs objectForKey:@"openPath"] file:nil types:nil + modalForWindow:tableWindow modalDelegate:self + didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; } */ @@ -311,28 +312,28 @@ opens the NSOpenPanel invoked when user clicks on an export menuItem */ { - NSString *contextInfo; - NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - - switch ( tag ) { - case 1: - //import dump - contextInfo = @"importDump"; - break; - case 2: - //import CSV file - [openPanel setAccessoryView:importCSVView]; - contextInfo = @"importCSVFile"; - break; - default: - NSLog(@"ERROR: unknown import item with tag %d", tag); - return; - break; - } - //open savePanel - [openPanel beginSheetForDirectory:[prefs objectForKey:@"openPath"] - file:nil modalForWindow:tableWindow modalDelegate:self - didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:contextInfo]; + NSString *contextInfo; + NSOpenPanel *openPanel = [NSOpenPanel openPanel]; + + switch ( tag ) { + case 1: + //import dump + contextInfo = @"importDump"; + break; + case 2: + //import CSV file + [openPanel setAccessoryView:importCSVView]; + contextInfo = @"importCSVFile"; + break; + default: + NSLog(@"ERROR: unknown import item with tag %d", tag); + return; + break; + } + //open savePanel + [openPanel beginSheetForDirectory:[prefs objectForKey:@"openPath"] + file:nil modalForWindow:tableWindow modalDelegate:self + didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:contextInfo]; } - (void)openPanelDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(NSString *)contextInfo @@ -340,205 +341,205 @@ invoked when user clicks on an export menuItem reads mysql-dumpfile */ { - NSString *dumpFile; + NSString *dumpFile; NSError **errorStr; - NSMutableString *errors = [NSMutableString string]; + NSMutableString *errors = [NSMutableString string]; - [sheet orderOut:self]; - if ( returnCode != NSOKButton ) - return; + [sheet orderOut:self]; + if ( returnCode != NSOKButton ) + return; //save path to preferences - [prefs setObject:[sheet directory] forKey:@"openPath"]; + [prefs setObject:[sheet directory] forKey:@"openPath"]; //load file into string if ( [NSString respondsToSelector:@selector(stringWithContentsOfFile:encoding:error:)] ) { // mac os 10.4 or later - dumpFile = [NSString stringWithContentsOfFile:[sheet filename] encoding:[CMMCPConnection encodingForMySQLEncoding:[[tableDocumentInstance encoding] cString]] error:errorStr]; + dumpFile = [NSString stringWithContentsOfFile:[sheet filename] encoding:[CMMCPConnection encodingForMySQLEncoding:[[tableDocumentInstance encoding] UTF8String]] error:errorStr]; } else { // mac os pre 10.4 dumpFile = [NSString stringWithContentsOfFile:[sheet filename]]; } - if ( !dumpFile ) { - NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, - NSLocalizedString(@"Couldn't open file. Be sure that the path is correct and that you have the necessary privileges.", @"message of panel when file cannot be opened")); - return; - } + if ( !dumpFile ) { + NSBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, + NSLocalizedString(@"Couldn't open file. Be sure that the path is correct and that you have the necessary privileges.", @"message of panel when file cannot be opened")); + return; + } //reset interface - [errorsView setString:@""]; - [errorsView displayIfNeeded]; - [singleProgressText setStringValue:NSLocalizedString(@"Reading...", @"text showing that app is reading dump")]; - [singleProgressText displayIfNeeded]; - [singleProgressBar setDoubleValue:0]; - [singleProgressBar displayIfNeeded]; - - if ( [contextInfo isEqualToString:@"importDump"] ) { + [errorsView setString:@""]; + [errorsView displayIfNeeded]; + [singleProgressText setStringValue:NSLocalizedString(@"Reading...", @"text showing that app is reading dump")]; + [singleProgressText displayIfNeeded]; + [singleProgressBar setDoubleValue:0]; + [singleProgressBar displayIfNeeded]; + + if ( [contextInfo isEqualToString:@"importDump"] ) { //import dump file - NSArray *queries; - int i; - - //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - [singleProgressBar setIndeterminate:YES]; - [singleProgressBar setUsesThreadedAnimation:YES]; - [singleProgressBar startAnimation:self]; - //get array with an object for each mysql-query -// queries = [dumpFile componentsSeparatedByString:@";\n"]; - queries = [self splitQueries:dumpFile]; - - [singleProgressBar stopAnimation:self]; - [singleProgressBar setUsesThreadedAnimation:NO]; - [singleProgressBar setIndeterminate:NO]; - //perform all mysql-queries - for ( i = 0 ; i < [queries count] ; i++ ) { - [singleProgressBar setDoubleValue:((i+1)*100/[queries count])]; - [singleProgressBar displayIfNeeded]; - [mySQLConnection queryString:[queries objectAtIndex:i]]; - if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] - && ![[mySQLConnection getLastErrorMessage] isEqualToString:@"Query was empty"]) - [errors appendString:[NSString stringWithFormat:NSLocalizedString(@"[ERROR in query %d] %@\n", @"error text when multiple custom query failed"), (i+1),[mySQLConnection getLastErrorMessage]]]; - } - //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - //display errors - if ( [errors length] ) { - [errorsView setString:errors]; - [NSApp beginSheet:errorsSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - [NSApp runModalForWindow:errorsSheet]; - - [NSApp endSheet:errorsSheet]; - [errorsSheet orderOut:nil]; - } - } else if ( [contextInfo isEqualToString:@"importCSVFile"] ) { + NSArray *queries; + int i; + + //open progress sheet + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + [singleProgressBar setIndeterminate:YES]; + [singleProgressBar setUsesThreadedAnimation:YES]; + [singleProgressBar startAnimation:self]; + //get array with an object for each mysql-query +// queries = [dumpFile componentsSeparatedByString:@";\n"]; + queries = [self splitQueries:dumpFile]; + + [singleProgressBar stopAnimation:self]; + [singleProgressBar setUsesThreadedAnimation:NO]; + [singleProgressBar setIndeterminate:NO]; + //perform all mysql-queries + for ( i = 0 ; i < [queries count] ; i++ ) { + [singleProgressBar setDoubleValue:((i+1)*100/[queries count])]; + [singleProgressBar displayIfNeeded]; + [mySQLConnection queryString:[queries objectAtIndex:i]]; + if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] + && ![[mySQLConnection getLastErrorMessage] isEqualToString:@"Query was empty"]) + [errors appendString:[NSString stringWithFormat:NSLocalizedString(@"[ERROR in query %d] %@\n", @"error text when multiple custom query failed"), (i+1),[mySQLConnection getLastErrorMessage]]]; + } + //close progress sheet + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + //display errors + if ( [errors length] ) { + [errorsView setString:errors]; + [NSApp beginSheet:errorsSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + [NSApp runModalForWindow:errorsSheet]; + + [NSApp endSheet:errorsSheet]; + [errorsSheet orderOut:nil]; + } + } else if ( [contextInfo isEqualToString:@"importCSVFile"] ) { //import csv file - int code; - NSPopUpButtonCell *buttonCell = [[NSPopUpButtonCell alloc] init]; - - //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - [singleProgressBar setIndeterminate:YES]; - [singleProgressBar setUsesThreadedAnimation:YES]; - [singleProgressBar startAnimation:self]; - //put file in array - if ( importArray ) - [importArray release]; - importArray = [[self arrayForCSV:dumpFile - terminatedBy:[importFieldsTerminatedField stringValue] - enclosedBy:[importFieldsEnclosedField stringValue] - escapedBy:[importFieldsEscapedField stringValue] - lineEnds:[importLinesTerminatedField stringValue]] retain]; - //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - [singleProgressBar stopAnimation:self]; - [singleProgressBar setUsesThreadedAnimation:NO]; - [singleProgressBar setIndeterminate:NO]; - //show fieldMapping sheet - //set up tableView - currentRow = 0; - fieldMappingArray = nil; - [self setupFieldMappingArray]; - [rowDownButton setEnabled:NO]; - if ( [importArray count] > 1 ) { - [rowUpButton setEnabled:YES]; - } else { - [rowUpButton setEnabled:NO]; - } - //set up tableView buttons - [buttonCell setControlSize:NSSmallControlSize]; - [buttonCell setFont:[NSFont labelFontOfSize:[NSFont smallSystemFontSize]]]; - [buttonCell addItemWithTitle:NSLocalizedString(@"Do not import", @"text for csv import drop downs")]; - [buttonCell addItemsWithTitles:[tableSourceInstance fieldNames]]; - [[fieldMappingTableView tableColumnWithIdentifier:@"1"] setDataCell:buttonCell]; - [NSApp beginSheet:fieldMappingSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - code = [NSApp runModalForWindow:fieldMappingSheet]; - - [NSApp endSheet:fieldMappingSheet]; - [fieldMappingSheet orderOut:nil]; - - if ( code ) { - //import array into db - NSMutableString *fNames = [NSMutableString string]; - NSMutableArray *fValuesIndexes = [NSMutableArray array]; - NSMutableString *fValues = [NSMutableString string]; - int i,j; - - //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - - //get fields to be imported - for ( i = 0 ; i < [fieldMappingArray count] ; i++ ) { - if ( [[[fieldMappingArray objectAtIndex:i] objectAtIndex:1] intValue] > 0 ) { - //field marked for import - if ( [fNames length] ) - [fNames appendString:@","]; - [fNames appendString:[NSString stringWithFormat:@"`%@`", - [[tableSourceInstance fieldNames] objectAtIndex:([[[fieldMappingArray objectAtIndex:i] objectAtIndex:1] intValue]-1)]]]; - [fValuesIndexes addObject:[NSNumber numberWithInt:i]]; - } - } - //import array - for ( i = 0 ; i < [importArray count] ; i++ ) { - //show progress bar - [singleProgressBar setDoubleValue:((i+1)*100/[importArray count])]; - [singleProgressBar displayIfNeeded]; - if ( ![importFieldNamesSwitch state] || (i != 0) ) { - //put values in string - [fValues setString:@""]; - for ( j = 0 ; j < [fValuesIndexes count] ; j++ ) { - if ( [fValues length] ) - [fValues appendString:@","]; - if ( [[[importArray objectAtIndex:i] objectAtIndex:[[fValuesIndexes objectAtIndex:j] intValue]] - isMemberOfClass:[NSNull class]] ) { - [fValues appendString:@"NULL"]; - } else { - [fValues appendString:[NSString stringWithFormat:@"'%@'", - [mySQLConnection prepareString: - [[importArray objectAtIndex:i] objectAtIndex:[[fValuesIndexes objectAtIndex:j] intValue]]]]]; -// [fValues appendString:[NSString stringWithFormat:@"\"%@\"", -// [mySQLConnection prepareString: -// [[importArray objectAtIndex:i] objectAtIndex:[[fValuesIndexes objectAtIndex:j] intValue]]]]]; - } - } - //perform query - [mySQLConnection queryString:[NSString stringWithFormat:@"INSERT INTO `%@` (%@) VALUES (%@)", - [tablesListInstance table], - fNames, - fValues]]; - if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) - [errors appendString:[NSString stringWithFormat:NSLocalizedString(@"[ERROR in line %d] %@\n", @"error text when reading of csv file gave errors"), (i+1),[mySQLConnection getLastErrorMessage]]]; - } - } - //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - } - //display errors - if ( [errors length] ) { - [errorsView setString:errors]; - [NSApp beginSheet:errorsSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - [NSApp runModalForWindow:errorsSheet]; - - [NSApp endSheet:errorsSheet]; - [errorsSheet orderOut:nil]; - } - //free arrays - fieldMappingArray = nil; - importArray = nil; - } + int code; + NSPopUpButtonCell *buttonCell = [[NSPopUpButtonCell alloc] init]; + + //open progress sheet + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + [singleProgressBar setIndeterminate:YES]; + [singleProgressBar setUsesThreadedAnimation:YES]; + [singleProgressBar startAnimation:self]; + //put file in array + if ( importArray ) + [importArray release]; + importArray = [[self arrayForCSV:dumpFile + terminatedBy:[importFieldsTerminatedField stringValue] + enclosedBy:[importFieldsEnclosedField stringValue] + escapedBy:[importFieldsEscapedField stringValue] + lineEnds:[importLinesTerminatedField stringValue]] retain]; + //close progress sheet + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + [singleProgressBar stopAnimation:self]; + [singleProgressBar setUsesThreadedAnimation:NO]; + [singleProgressBar setIndeterminate:NO]; + //show fieldMapping sheet + //set up tableView + currentRow = 0; + fieldMappingArray = nil; + [self setupFieldMappingArray]; + [rowDownButton setEnabled:NO]; + if ( [importArray count] > 1 ) { + [rowUpButton setEnabled:YES]; + } else { + [rowUpButton setEnabled:NO]; + } + //set up tableView buttons + [buttonCell setControlSize:NSSmallControlSize]; + [buttonCell setFont:[NSFont labelFontOfSize:[NSFont smallSystemFontSize]]]; + [buttonCell addItemWithTitle:NSLocalizedString(@"Do not import", @"text for csv import drop downs")]; + [buttonCell addItemsWithTitles:[tableSourceInstance fieldNames]]; + [[fieldMappingTableView tableColumnWithIdentifier:@"1"] setDataCell:buttonCell]; + [NSApp beginSheet:fieldMappingSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + code = [NSApp runModalForWindow:fieldMappingSheet]; + + [NSApp endSheet:fieldMappingSheet]; + [fieldMappingSheet orderOut:nil]; + + if ( code ) { + //import array into db + NSMutableString *fNames = [NSMutableString string]; + NSMutableArray *fValuesIndexes = [NSMutableArray array]; + NSMutableString *fValues = [NSMutableString string]; + int i,j; + + //open progress sheet + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + + //get fields to be imported + for ( i = 0 ; i < [fieldMappingArray count] ; i++ ) { + if ( [[[fieldMappingArray objectAtIndex:i] objectAtIndex:1] intValue] > 0 ) { + //field marked for import + if ( [fNames length] ) + [fNames appendString:@","]; + [fNames appendString:[NSString stringWithFormat:@"`%@`", + [[tableSourceInstance fieldNames] objectAtIndex:([[[fieldMappingArray objectAtIndex:i] objectAtIndex:1] intValue]-1)]]]; + [fValuesIndexes addObject:[NSNumber numberWithInt:i]]; + } + } + //import array + for ( i = 0 ; i < [importArray count] ; i++ ) { + //show progress bar + [singleProgressBar setDoubleValue:((i+1)*100/[importArray count])]; + [singleProgressBar displayIfNeeded]; + if ( ![importFieldNamesSwitch state] || (i != 0) ) { + //put values in string + [fValues setString:@""]; + for ( j = 0 ; j < [fValuesIndexes count] ; j++ ) { + if ( [fValues length] ) + [fValues appendString:@","]; + if ( [[[importArray objectAtIndex:i] objectAtIndex:[[fValuesIndexes objectAtIndex:j] intValue]] + isMemberOfClass:[NSNull class]] ) { + [fValues appendString:@"NULL"]; + } else { + [fValues appendString:[NSString stringWithFormat:@"'%@'", + [mySQLConnection prepareString: + [[importArray objectAtIndex:i] objectAtIndex:[[fValuesIndexes objectAtIndex:j] intValue]]]]]; +// [fValues appendString:[NSString stringWithFormat:@"\"%@\"", +// [mySQLConnection prepareString: +// [[importArray objectAtIndex:i] objectAtIndex:[[fValuesIndexes objectAtIndex:j] intValue]]]]]; + } + } + //perform query + [mySQLConnection queryString:[NSString stringWithFormat:@"INSERT INTO `%@` (%@) VALUES (%@)", + [tablesListInstance table], + fNames, + fValues]]; + if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) + [errors appendString:[NSString stringWithFormat:NSLocalizedString(@"[ERROR in line %d] %@\n", @"error text when reading of csv file gave errors"), (i+1),[mySQLConnection getLastErrorMessage]]]; + } + } + //close progress sheet + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + } + //display errors + if ( [errors length] ) { + [errorsView setString:errors]; + [NSApp beginSheet:errorsSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + [NSApp runModalForWindow:errorsSheet]; + + [NSApp endSheet:errorsSheet]; + [errorsSheet orderOut:nil]; + } + //free arrays + fieldMappingArray = nil; + importArray = nil; + } // Import Finished Growl Notification [GrowlApplicationBridge notifyWithTitle:@"Import Finished" @@ -557,33 +558,33 @@ reads mysql-dumpfile sets up the fieldMapping array to be shown in the tableView */ { - int i, value; - - if ( fieldMappingArray ) { - for ( i = 0 ; i < [fieldMappingArray count] ; i++ ) { - if ( [[[importArray objectAtIndex:currentRow] objectAtIndex:i] isKindOfClass:[NSNull class]] ) { - [[fieldMappingArray objectAtIndex:i] replaceObjectAtIndex:0 withObject:@"NULL"]; - } else { - [[fieldMappingArray objectAtIndex:i] replaceObjectAtIndex:0 withObject:[[importArray objectAtIndex:currentRow] objectAtIndex:i]]; - } - } - } else { - fieldMappingArray = [NSMutableArray array]; - for ( i = 0 ; i < [[importArray objectAtIndex:currentRow] count] ; i++ ) { - if ( i < [[tableSourceInstance fieldNames] count] ) { - value = i + 1; - } else { - value = 0; - } - if ( [[[importArray objectAtIndex:currentRow] objectAtIndex:i] isKindOfClass:[NSNull class]] ) { - [fieldMappingArray addObject:[NSMutableArray arrayWithObjects:@"NULL", [NSNumber numberWithInt:value], nil]]; - } else { - [fieldMappingArray addObject:[NSMutableArray arrayWithObjects:[[importArray objectAtIndex:currentRow] objectAtIndex:i], [NSNumber numberWithInt:value], nil]]; - } - } - [fieldMappingArray retain]; - } - [fieldMappingTableView reloadData]; + int i, value; + + if ( fieldMappingArray ) { + for ( i = 0 ; i < [fieldMappingArray count] ; i++ ) { + if ( [[[importArray objectAtIndex:currentRow] objectAtIndex:i] isKindOfClass:[NSNull class]] ) { + [[fieldMappingArray objectAtIndex:i] replaceObjectAtIndex:0 withObject:@"NULL"]; + } else { + [[fieldMappingArray objectAtIndex:i] replaceObjectAtIndex:0 withObject:[[importArray objectAtIndex:currentRow] objectAtIndex:i]]; + } + } + } else { + fieldMappingArray = [NSMutableArray array]; + for ( i = 0 ; i < [[importArray objectAtIndex:currentRow] count] ; i++ ) { + if ( i < [[tableSourceInstance fieldNames] count] ) { + value = i + 1; + } else { + value = 0; + } + if ( [[[importArray objectAtIndex:currentRow] objectAtIndex:i] isKindOfClass:[NSNull class]] ) { + [fieldMappingArray addObject:[NSMutableArray arrayWithObjects:@"NULL", [NSNumber numberWithInt:value], nil]]; + } else { + [fieldMappingArray addObject:[NSMutableArray arrayWithObjects:[[importArray objectAtIndex:currentRow] objectAtIndex:i], [NSNumber numberWithInt:value], nil]]; + } + } + [fieldMappingArray retain]; + } + [fieldMappingTableView reloadData]; } @@ -593,380 +594,380 @@ sets up the fieldMapping array to be shown in the tableView returns a dump string for the selected tables */ { - int i,j,k,t,rowCount,tableCount; - CMMCPResult *queryResult; - NSString *tableName; - NSArray *fieldNames; - NSArray *theRow; - NSMutableString *rowValue = [NSMutableString string]; - NSMutableArray *fieldValues; - NSMutableString *dump = [NSMutableString string]; - NSMutableString *errors = [NSMutableString string]; + int i,j,k,t,rowCount,tableCount; + CMMCPResult *queryResult; + NSString *tableName; + NSArray *fieldNames; + NSArray *theRow; + NSMutableString *rowValue = [NSMutableString string]; + NSMutableArray *fieldValues; + NSMutableString *dump = [NSMutableString string]; + NSMutableString *errors = [NSMutableString string]; id createTableSyntax; //reset interface - [errorsView setString:@""]; - [errorsView displayIfNeeded]; - [singleProgressText setStringValue:NSLocalizedString(@"Dumping...", @"text showing that app is writing dump")]; - [singleProgressText displayIfNeeded]; - [singleProgressBar setDoubleValue:0]; - [singleProgressBar displayIfNeeded]; + [errorsView setString:@""]; + [errorsView displayIfNeeded]; + [singleProgressText setStringValue:NSLocalizedString(@"Dumping...", @"text showing that app is writing dump")]; + [singleProgressText displayIfNeeded]; + [singleProgressBar setDoubleValue:0]; + [singleProgressBar displayIfNeeded]; //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; //count tables - tableCount = 0; - for ( i = 0 ; i < [tables count] ; i++ ) { - if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { - tableCount++; - } - } - k = 0; + tableCount = 0; + for ( i = 0 ; i < [tables count] ; i++ ) { + if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { + tableCount++; + } + } + k = 0; //add header of dump-file -// [dump appendString:[NSString stringWithFormat:@"# Tables dumped %@\n# Created by Sequel Pro (Copyright (c) 2002-2003 Lorenz Textor)\n#\n# Host: %@ Database: %@\n# ******************************\n\n", [NSDate date], [tableDocumentInstance host], [tableDocumentInstance database]]]; - [dump appendString:@"# Sequel Pro dump\n"]; - [dump appendString:[NSString stringWithFormat:@"# Version %@\n", - [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]]; - [dump appendString:@"# http://code.google.com/p/sequel-pro\n#\n"]; - [dump appendString:[NSString stringWithFormat:@"# Host: %@ (MySQL %@)\n", - [tableDocumentInstance host], [tableDocumentInstance mySQLVersion]]]; - [dump appendString:[NSString stringWithFormat:@"# Database: %@\n", [tableDocumentInstance database]]]; - [dump appendString:[NSString stringWithFormat:@"# Generation Time: %@\n", [NSDate date]]]; - [dump appendString:@"# ************************************************************\n\n"]; - - for ( i = 0 ; i < [tables count] ; i++ ) { - if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { - k++; +// [dump appendString:[NSString stringWithFormat:@"# Tables dumped %@\n# Created by Sequel Pro (Copyright (c) 2002-2003 Lorenz Textor)\n#\n# Host: %@ Database: %@\n# ******************************\n\n", [NSDate date], [tableDocumentInstance host], [tableDocumentInstance database]]]; + [dump appendString:@"# Sequel Pro dump\n"]; + [dump appendString:[NSString stringWithFormat:@"# Version %@\n", + [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]]; + [dump appendString:@"# http://code.google.com/p/sequel-pro\n#\n"]; + [dump appendString:[NSString stringWithFormat:@"# Host: %@ (MySQL %@)\n", + [tableDocumentInstance host], [tableDocumentInstance mySQLVersion]]]; + [dump appendString:[NSString stringWithFormat:@"# Database: %@\n", [tableDocumentInstance database]]]; + [dump appendString:[NSString stringWithFormat:@"# Generation Time: %@\n", [NSDate date]]]; + [dump appendString:@"# ************************************************************\n\n"]; + + for ( i = 0 ; i < [tables count] ; i++ ) { + if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { + k++; //set progressbar and text - tableName = [[tables objectAtIndex:i] objectAtIndex:1]; - [singleProgressText setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Dumping table %@...", @"text showing that app is dumping table"), tableName]]; - [singleProgressText displayIfNeeded]; + tableName = [[tables objectAtIndex:i] objectAtIndex:1]; + [singleProgressText setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Dumping table %@...", @"text showing that app is dumping table"), tableName]]; + [singleProgressText displayIfNeeded]; //add name of table - [dump appendString:[NSString stringWithFormat:@"# Dump of table %@\n# ------------------------------------------------------------\n\n", tableName]]; + [dump appendString:[NSString stringWithFormat:@"# Dump of table %@\n# ------------------------------------------------------------\n\n", tableName]]; //add drop table - if ( [addDropTableSwitch state] == NSOnState ) - [dump appendString:[NSString stringWithFormat:@"DROP TABLE IF EXISTS `%@`;\n\n", tableName]]; + if ( [addDropTableSwitch state] == NSOnState ) + [dump appendString:[NSString stringWithFormat:@"DROP TABLE IF EXISTS `%@`;\n\n", tableName]]; //add create syntax for table - if ( [addCreateTableSwitch state] == NSOnState ) { - queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE `%@`", tableName]]; - if ( [queryResult numOfRows] ) { + if ( [addCreateTableSwitch state] == NSOnState ) { + queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE `%@`", tableName]]; + if ( [queryResult numOfRows] ) { createTableSyntax = [[queryResult fetchRowAsDictionary] objectForKey:@"Create Table"]; if ( [createTableSyntax isKindOfClass:[NSData class]] ) { createTableSyntax = [[[NSString alloc] initWithData:createTableSyntax encoding:[mySQLConnection encoding]] autorelease]; } - [dump appendString:[NSString stringWithFormat:@"%@;\n\n", createTableSyntax]]; + [dump appendString:[NSString stringWithFormat:@"%@;\n\n", createTableSyntax]]; } - if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) { - [errors appendString:[NSString stringWithFormat:@"%@\n", [mySQLConnection getLastErrorMessage]]]; - if ( [addErrorsSwitch state] == NSOnState ) { - [dump appendString:[NSString stringWithFormat:@"# Error: %@\n", [mySQLConnection getLastErrorMessage]]]; - } - } - } + if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) { + [errors appendString:[NSString stringWithFormat:@"%@\n", [mySQLConnection getLastErrorMessage]]]; + if ( [addErrorsSwitch state] == NSOnState ) { + [dump appendString:[NSString stringWithFormat:@"# Error: %@\n", [mySQLConnection getLastErrorMessage]]]; + } + } + } //add table content - if ( [addTableContentSwitch state] == NSOnState ) { - queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM `%@`", tableName]]; - fieldNames = [queryResult fetchFieldNames]; - rowCount = [queryResult numOfRows]; - for ( j = 0 ; j < rowCount ; j++ ) { - [queryResult dataSeek:j]; - theRow = [queryResult fetchRowAsArray]; - fieldValues = [NSMutableArray array]; - for ( t = 0 ; t < [theRow count] ; t++ ) { - if ( [[theRow objectAtIndex:t] isKindOfClass:[NSData class]] ) { - //escape special characters - [rowValue setString:[mySQLConnection prepareBinaryData:[theRow objectAtIndex:t]]]; - } else { - [rowValue setString:[[theRow objectAtIndex:t] description]]; - //escape special characters - [rowValue setString:[mySQLConnection prepareString:rowValue]]; - } - if ( [[theRow objectAtIndex:t] isMemberOfClass:[NSNull class]] ) { - [fieldValues addObject:@"NULL"]; - } else { -// [fieldValues addObject:[NSString stringWithFormat:@"\"%@\"", rowValue]]; - [fieldValues addObject:[NSString stringWithFormat:@"'%@'", rowValue]]; - } - } - [dump appendString:[NSString stringWithFormat:@"INSERT INTO `%@` (`%@`) VALUES (%@);\n", - tableName, [fieldNames componentsJoinedByString:@"`,`"], - [fieldValues componentsJoinedByString:@","]]]; - } - if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) { - [errors appendString:[NSString stringWithFormat:@"%@\n", [mySQLConnection getLastErrorMessage]]]; - if ( [addErrorsSwitch state] == NSOnState ) { - [dump appendString:[NSString stringWithFormat:@"# Error: %@\n", [mySQLConnection getLastErrorMessage]]]; - } - } - } + if ( [addTableContentSwitch state] == NSOnState ) { + queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM `%@`", tableName]]; + fieldNames = [queryResult fetchFieldNames]; + rowCount = [queryResult numOfRows]; + for ( j = 0 ; j < rowCount ; j++ ) { + [queryResult dataSeek:j]; + theRow = [queryResult fetchRowAsArray]; + fieldValues = [NSMutableArray array]; + for ( t = 0 ; t < [theRow count] ; t++ ) { + if ( [[theRow objectAtIndex:t] isKindOfClass:[NSData class]] ) { + //escape special characters + [rowValue setString:[mySQLConnection prepareBinaryData:[theRow objectAtIndex:t]]]; + } else { + [rowValue setString:[[theRow objectAtIndex:t] description]]; + //escape special characters + [rowValue setString:[mySQLConnection prepareString:rowValue]]; + } + if ( [[theRow objectAtIndex:t] isMemberOfClass:[NSNull class]] ) { + [fieldValues addObject:@"NULL"]; + } else { +// [fieldValues addObject:[NSString stringWithFormat:@"\"%@\"", rowValue]]; + [fieldValues addObject:[NSString stringWithFormat:@"'%@'", rowValue]]; + } + } + [dump appendString:[NSString stringWithFormat:@"INSERT INTO `%@` (`%@`) VALUES (%@);\n", + tableName, [fieldNames componentsJoinedByString:@"`,`"], + [fieldValues componentsJoinedByString:@","]]]; + } + if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) { + [errors appendString:[NSString stringWithFormat:@"%@\n", [mySQLConnection getLastErrorMessage]]]; + if ( [addErrorsSwitch state] == NSOnState ) { + [dump appendString:[NSString stringWithFormat:@"# Error: %@\n", [mySQLConnection getLastErrorMessage]]]; + } + } + } //set progressbar and text - [singleProgressBar setDoubleValue:(k*100/tableCount)]; - [singleProgressBar displayIfNeeded]; - [dump appendString:@"\n\n"]; - } - } + [singleProgressBar setDoubleValue:(k*100/tableCount)]; + [singleProgressBar displayIfNeeded]; + [dump appendString:@"\n\n"]; + } + } //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + //show errors sheet if there have been errors - if ( [errors length] ) { - [errorsView setString:errors]; - [NSApp beginSheet:errorsSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - [NSApp runModalForWindow:errorsSheet]; - - [NSApp endSheet:errorsSheet]; - [errorsSheet orderOut:nil]; - } - - return [NSString stringWithString:dump]; + if ( [errors length] ) { + [errorsView setString:errors]; + [NSApp beginSheet:errorsSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + [NSApp runModalForWindow:errorsSheet]; + + [NSApp endSheet:errorsSheet]; + [errorsSheet orderOut:nil]; + } + + return [NSString stringWithString:dump]; } - (NSString *)csvForArray:(NSArray *)array useFirstLine:(BOOL)firstLine terminatedBy:(NSString *)terminated - enclosedBy:(NSString *)enclosed escapedBy:(NSString *)escaped lineEnds:(NSString *)lineEnds silently:(BOOL)silently; + enclosedBy:(NSString *)enclosed escapedBy:(NSString *)escaped lineEnds:(NSString *)lineEnds silently:(BOOL)silently; /* takes an array and returns it as a csv string */ { - NSMutableString *string = [NSMutableString string]; - NSMutableString *rowValue = [NSMutableString string]; - NSMutableArray *tempRow = [NSMutableArray array]; - NSMutableString *tempTerminated, *tempLineEnds; - int i,j; + NSMutableString *string = [NSMutableString string]; + NSMutableString *rowValue = [NSMutableString string]; + NSMutableArray *tempRow = [NSMutableArray array]; + NSMutableString *tempTerminated, *tempLineEnds; + int i,j; //repare tabs and line ends - tempTerminated = [NSMutableString stringWithString:terminated]; - [tempTerminated replaceOccurrencesOfString:@"\\t" withString:@"\t" - options:NSLiteralSearch - range:NSMakeRange(0, [tempTerminated length])]; - [tempTerminated replaceOccurrencesOfString:@"\\n" withString:@"\n" - options:NSLiteralSearch - range:NSMakeRange(0, [tempTerminated length])]; - [tempTerminated replaceOccurrencesOfString:@"\\r" withString:@"\r" - options:NSLiteralSearch - range:NSMakeRange(0, [tempTerminated length])]; - terminated = [NSString stringWithString:tempTerminated]; - tempLineEnds = [NSMutableString stringWithString:lineEnds]; - [tempLineEnds replaceOccurrencesOfString:@"\\t" withString:@"\t" - options:NSLiteralSearch - range:NSMakeRange(0, [tempLineEnds length])]; - [tempLineEnds replaceOccurrencesOfString:@"\\n" withString:@"\n" - options:NSLiteralSearch - range:NSMakeRange(0, [tempLineEnds length])]; - [tempLineEnds replaceOccurrencesOfString:@"\\r" withString:@"\r" - options:NSLiteralSearch - range:NSMakeRange(0, [tempLineEnds length])]; - lineEnds = [NSString stringWithString:tempLineEnds]; - - if ( !silently ) { - //reset interface - [singleProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; - [singleProgressText displayIfNeeded]; - [singleProgressBar setDoubleValue:0]; - [singleProgressBar displayIfNeeded]; - //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - } - - for ( i = 0 ; i < [array count] ; i++ ) { - if ( !silently ) { -// [singleProgressText setStringValue:[NSString stringWithFormat:@"Writing row %d of %d", i+1, [array count]]]; -// [singleProgressText displayIfNeeded]; - [singleProgressBar setDoubleValue:((i+1)*100/[array count])]; - [singleProgressBar displayIfNeeded]; - } - if ( (i > 0) || ((i == 0) && firstLine) ) { - [tempRow removeAllObjects]; - for ( j = 0 ; j < [[array objectAtIndex:i] count] ; j++ ) { - //escape "enclosed by" character + tempTerminated = [NSMutableString stringWithString:terminated]; + [tempTerminated replaceOccurrencesOfString:@"\\t" withString:@"\t" + options:NSLiteralSearch + range:NSMakeRange(0, [tempTerminated length])]; + [tempTerminated replaceOccurrencesOfString:@"\\n" withString:@"\n" + options:NSLiteralSearch + range:NSMakeRange(0, [tempTerminated length])]; + [tempTerminated replaceOccurrencesOfString:@"\\r" withString:@"\r" + options:NSLiteralSearch + range:NSMakeRange(0, [tempTerminated length])]; + terminated = [NSString stringWithString:tempTerminated]; + tempLineEnds = [NSMutableString stringWithString:lineEnds]; + [tempLineEnds replaceOccurrencesOfString:@"\\t" withString:@"\t" + options:NSLiteralSearch + range:NSMakeRange(0, [tempLineEnds length])]; + [tempLineEnds replaceOccurrencesOfString:@"\\n" withString:@"\n" + options:NSLiteralSearch + range:NSMakeRange(0, [tempLineEnds length])]; + [tempLineEnds replaceOccurrencesOfString:@"\\r" withString:@"\r" + options:NSLiteralSearch + range:NSMakeRange(0, [tempLineEnds length])]; + lineEnds = [NSString stringWithString:tempLineEnds]; + + if ( !silently ) { + //reset interface + [singleProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; + [singleProgressText displayIfNeeded]; + [singleProgressBar setDoubleValue:0]; + [singleProgressBar displayIfNeeded]; + //open progress sheet + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + } + + for ( i = 0 ; i < [array count] ; i++ ) { + if ( !silently ) { +// [singleProgressText setStringValue:[NSString stringWithFormat:@"Writing row %d of %d", i+1, [array count]]]; +// [singleProgressText displayIfNeeded]; + [singleProgressBar setDoubleValue:((i+1)*100/[array count])]; + [singleProgressBar displayIfNeeded]; + } + if ( (i > 0) || ((i == 0) && firstLine) ) { + [tempRow removeAllObjects]; + for ( j = 0 ; j < [[array objectAtIndex:i] count] ; j++ ) { + //escape "enclosed by" character /* - [rowValue setString:@""]; - scanner = [NSScanner scannerWithString:[[[array objectAtIndex:i] objectAtIndex:j] description]]; - [scanner setCharactersToBeSkipped:nil]; - while ( ![scanner isAtEnd] ) { - if ( [scanner scanUpToString:enclosed intoString:&tempString] ) { - [rowValue appendString:tempString]; - } - if ( [scanner scanString:enclosed intoString:nil] ) { - [rowValue appendString:[NSString stringWithFormat:@"%@%@", escaped, enclosed]]; - } - } + [rowValue setString:@""]; + scanner = [NSScanner scannerWithString:[[[array objectAtIndex:i] objectAtIndex:j] description]]; + [scanner setCharactersToBeSkipped:nil]; + while ( ![scanner isAtEnd] ) { + if ( [scanner scanUpToString:enclosed intoString:&tempString] ) { + [rowValue appendString:tempString]; + } + if ( [scanner scanString:enclosed intoString:nil] ) { + [rowValue appendString:[NSString stringWithFormat:@"%@%@", escaped, enclosed]]; + } + } */ - [rowValue setString:[[[array objectAtIndex:i] objectAtIndex:j] description]]; - if ( [rowValue isEqualToString:[prefs objectForKey:@"nullValue"]] ) { - [tempRow addObject:@"NULL"]; - } else { - [rowValue replaceOccurrencesOfString:escaped - withString:[NSString stringWithFormat:@"%@%@", escaped, escaped] - options:NSLiteralSearch - range:NSMakeRange(0,[rowValue length])]; - if ( ![escaped isEqualToString:enclosed] ) { - [rowValue replaceOccurrencesOfString:enclosed - withString:[NSString stringWithFormat:@"%@%@", escaped, enclosed] - options:NSLiteralSearch - range:NSMakeRange(0,[rowValue length])]; - } - [rowValue replaceOccurrencesOfString:lineEnds - withString:[NSString stringWithFormat:@"%@%@", escaped, lineEnds] - options:NSLiteralSearch - range:NSMakeRange(0,[rowValue length])]; - if ( [enclosed isEqualToString:@""] ) { - [rowValue replaceOccurrencesOfString:terminated - withString:[NSString stringWithFormat:@"%@%@", escaped, terminated] - options:NSLiteralSearch - range:NSMakeRange(0,[rowValue length])]; - } - [tempRow addObject:[NSString stringWithFormat:@"%@%@%@", enclosed, rowValue, enclosed]]; - } - } - [string appendString:[tempRow componentsJoinedByString:terminated]]; - [string appendString:lineEnds]; - } - } + [rowValue setString:[[[array objectAtIndex:i] objectAtIndex:j] description]]; + if ( [rowValue isEqualToString:[prefs objectForKey:@"nullValue"]] ) { + [tempRow addObject:@"NULL"]; + } else { + [rowValue replaceOccurrencesOfString:escaped + withString:[NSString stringWithFormat:@"%@%@", escaped, escaped] + options:NSLiteralSearch + range:NSMakeRange(0,[rowValue length])]; + if ( ![escaped isEqualToString:enclosed] ) { + [rowValue replaceOccurrencesOfString:enclosed + withString:[NSString stringWithFormat:@"%@%@", escaped, enclosed] + options:NSLiteralSearch + range:NSMakeRange(0,[rowValue length])]; + } + [rowValue replaceOccurrencesOfString:lineEnds + withString:[NSString stringWithFormat:@"%@%@", escaped, lineEnds] + options:NSLiteralSearch + range:NSMakeRange(0,[rowValue length])]; + if ( [enclosed isEqualToString:@""] ) { + [rowValue replaceOccurrencesOfString:terminated + withString:[NSString stringWithFormat:@"%@%@", escaped, terminated] + options:NSLiteralSearch + range:NSMakeRange(0,[rowValue length])]; + } + [tempRow addObject:[NSString stringWithFormat:@"%@%@%@", enclosed, rowValue, enclosed]]; + } + } + [string appendString:[tempRow componentsJoinedByString:terminated]]; + [string appendString:lineEnds]; + } + } /* - //remove last line end - [string deleteCharactersInRange:NSMakeRange(([string length]-[lineEnds length]),([lineEnds length]))]; + //remove last line end + [string deleteCharactersInRange:NSMakeRange(([string length]-[lineEnds length]),([lineEnds length]))]; */ - if ( !silently ) { - //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - } + if ( !silently ) { + //close progress sheet + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + } - return [NSString stringWithString:string]; + return [NSString stringWithString:string]; } - (NSArray *)arrayForCSV:(NSString *)csv terminatedBy:(NSString *)terminated - enclosedBy:(NSString *)enclosed escapedBy:(NSString *)escaped lineEnds:(NSString *)lineEnds + enclosedBy:(NSString *)enclosed escapedBy:(NSString *)escaped lineEnds:(NSString *)lineEnds /* loads a csv string into an array */ { - NSMutableString *tempTerminated, *tempLineEnds; - NSMutableArray *tempArray = [NSMutableArray array]; - NSMutableArray *tempRowArray = [NSMutableArray array]; - NSMutableString *mutableField; - NSScanner *scanner; - NSString *scanString; - NSMutableString *tempString = [NSMutableString string]; - NSMutableArray *linesArray = [NSMutableArray array]; - BOOL isEscaped, br; - int fieldCount = nil; - int x,i,j; + NSMutableString *tempTerminated, *tempLineEnds; + NSMutableArray *tempArray = [NSMutableArray array]; + NSMutableArray *tempRowArray = [NSMutableArray array]; + NSMutableString *mutableField; + NSScanner *scanner; + NSString *scanString; + NSMutableString *tempString = [NSMutableString string]; + NSMutableArray *linesArray = [NSMutableArray array]; + BOOL isEscaped, br; + int fieldCount = nil; + int x,i,j; //repare tabs and line ends - tempTerminated = [NSMutableString stringWithString:terminated]; - [tempTerminated replaceOccurrencesOfString:@"\\t" withString:@"\t" - options:NSLiteralSearch - range:NSMakeRange(0, [tempTerminated length])]; - [tempTerminated replaceOccurrencesOfString:@"\\n" withString:@"\n" - options:NSLiteralSearch - range:NSMakeRange(0, [tempTerminated length])]; - [tempTerminated replaceOccurrencesOfString:@"\\r" withString:@"\r" - options:NSLiteralSearch - range:NSMakeRange(0, [tempTerminated length])]; - terminated = [NSString stringWithString:tempTerminated]; - tempLineEnds = [NSMutableString stringWithString:lineEnds]; - [tempLineEnds replaceOccurrencesOfString:@"\\t" withString:@"\t" - options:NSLiteralSearch - range:NSMakeRange(0, [tempLineEnds length])]; - [tempLineEnds replaceOccurrencesOfString:@"\\n" withString:@"\n" - options:NSLiteralSearch - range:NSMakeRange(0, [tempLineEnds length])]; - [tempLineEnds replaceOccurrencesOfString:@"\\r" withString:@"\r" - options:NSLiteralSearch - range:NSMakeRange(0, [tempLineEnds length])]; - lineEnds = [NSString stringWithString:tempLineEnds]; + tempTerminated = [NSMutableString stringWithString:terminated]; + [tempTerminated replaceOccurrencesOfString:@"\\t" withString:@"\t" + options:NSLiteralSearch + range:NSMakeRange(0, [tempTerminated length])]; + [tempTerminated replaceOccurrencesOfString:@"\\n" withString:@"\n" + options:NSLiteralSearch + range:NSMakeRange(0, [tempTerminated length])]; + [tempTerminated replaceOccurrencesOfString:@"\\r" withString:@"\r" + options:NSLiteralSearch + range:NSMakeRange(0, [tempTerminated length])]; + terminated = [NSString stringWithString:tempTerminated]; + tempLineEnds = [NSMutableString stringWithString:lineEnds]; + [tempLineEnds replaceOccurrencesOfString:@"\\t" withString:@"\t" + options:NSLiteralSearch + range:NSMakeRange(0, [tempLineEnds length])]; + [tempLineEnds replaceOccurrencesOfString:@"\\n" withString:@"\n" + options:NSLiteralSearch + range:NSMakeRange(0, [tempLineEnds length])]; + [tempLineEnds replaceOccurrencesOfString:@"\\r" withString:@"\r" + options:NSLiteralSearch + range:NSMakeRange(0, [tempLineEnds length])]; + lineEnds = [NSString stringWithString:tempLineEnds]; //array with one line per object - scanner = [NSScanner scannerWithString:csv]; - [scanner setCharactersToBeSkipped:nil]; - while ( ![scanner isAtEnd] ) { - [tempString setString:@""]; - br = NO; - while ( !br ) { - scanString = @""; - [scanner scanUpToString:lineEnds intoString:&scanString]; - [tempString appendString:scanString]; - [scanner scanString:lineEnds intoString:&scanString]; - //test if lineEnds-character is escaped - isEscaped = NO; - j = 1; - if ( ![escaped isEqualToString:enclosed] && ![escaped isEqualToString:@""] ) { - while ( ((j*[escaped length])<=[tempString length]) && - ([[tempString substringWithRange:NSMakeRange(([tempString length]-(j*[escaped length])),[escaped length])] isEqualToString:escaped]) ) { - isEscaped = !isEscaped; - j++; - } - } - if ( !isEscaped || [scanner isAtEnd] ) { - //end of row - br = YES; - } else { - //lineEnds-character was escaped - [tempString appendString:scanString]; - } - } - //add line to array - [linesArray addObject:[NSString stringWithString:tempString]]; - } - for ( x = 0 ; x < [linesArray count] ; x++ ) { - //separate fields - [tempRowArray removeAllObjects]; - [tempRowArray addObjectsFromArray:[self arrayForString:[linesArray objectAtIndex:x] enclosed:enclosed escaped:escaped terminated:terminated]]; - if ( x == 0 ) { - fieldCount = [tempRowArray count]; - } else { - while ( [tempRowArray count] < fieldCount ) { - [tempRowArray addObject:@"NULL"]; - } - } - for ( i = 0 ; i < [tempRowArray count] ; i++ ) { - if ( [[tempRowArray objectAtIndex:i] isEqualToString:@"NULL"] || [[tempRowArray objectAtIndex:i] isEqualToString:@"\\N"] || [[tempRowArray objectAtIndex:i] isEqualToString:[prefs objectForKey:@"nullValue"]] ) { - //put nsnull object to array if field contains un-enclosed NULL string - [tempRowArray replaceObjectAtIndex:i withObject:[NSNull null]]; - } else { - //strip enclosed and escaped characters - mutableField = [NSMutableString stringWithString:[tempRowArray objectAtIndex:i]]; - //strip enclosed characters - if ( [mutableField length] >= (2*[enclosed length]) ) { - if ( [[mutableField substringToIndex:[enclosed length]] isEqualToString:enclosed] ) { - [mutableField deleteCharactersInRange:NSMakeRange(0,[enclosed length])]; - } - if ( [[mutableField substringFromIndex:([mutableField length]-[enclosed length])] isEqualToString:enclosed] ) { - [mutableField deleteCharactersInRange:NSMakeRange(([mutableField length]-[enclosed length]),[enclosed length])]; - } - } - //strip escaped characters - if ( ![enclosed isEqualToString:@""] ) { - [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, enclosed] withString:enclosed options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; - } else { - [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, terminated] withString:terminated options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; - } - if ( ![lineEnds isEqualToString:@""] ) { - [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, lineEnds] withString:lineEnds options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; - } - if ( ![escaped isEqualToString:@""] && ![escaped isEqualToString:enclosed] ) { - [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, escaped] withString:escaped options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; - } - //add field to tempRowArray - [tempRowArray replaceObjectAtIndex:i withObject:[NSString stringWithString:mutableField]]; - } - } - //add row to tempArray - [tempArray addObject:[NSArray arrayWithArray:tempRowArray]]; - } - - return [NSArray arrayWithArray:tempArray]; + scanner = [NSScanner scannerWithString:csv]; + [scanner setCharactersToBeSkipped:nil]; + while ( ![scanner isAtEnd] ) { + [tempString setString:@""]; + br = NO; + while ( !br ) { + scanString = @""; + [scanner scanUpToString:lineEnds intoString:&scanString]; + [tempString appendString:scanString]; + [scanner scanString:lineEnds intoString:&scanString]; + //test if lineEnds-character is escaped + isEscaped = NO; + j = 1; + if ( ![escaped isEqualToString:enclosed] && ![escaped isEqualToString:@""] ) { + while ( ((j*[escaped length])<=[tempString length]) && + ([[tempString substringWithRange:NSMakeRange(([tempString length]-(j*[escaped length])),[escaped length])] isEqualToString:escaped]) ) { + isEscaped = !isEscaped; + j++; + } + } + if ( !isEscaped || [scanner isAtEnd] ) { + //end of row + br = YES; + } else { + //lineEnds-character was escaped + [tempString appendString:scanString]; + } + } + //add line to array + [linesArray addObject:[NSString stringWithString:tempString]]; + } + for ( x = 0 ; x < [linesArray count] ; x++ ) { + //separate fields + [tempRowArray removeAllObjects]; + [tempRowArray addObjectsFromArray:[self arrayForString:[linesArray objectAtIndex:x] enclosed:enclosed escaped:escaped terminated:terminated]]; + if ( x == 0 ) { + fieldCount = [tempRowArray count]; + } else { + while ( [tempRowArray count] < fieldCount ) { + [tempRowArray addObject:@"NULL"]; + } + } + for ( i = 0 ; i < [tempRowArray count] ; i++ ) { + if ( [[tempRowArray objectAtIndex:i] isEqualToString:@"NULL"] || [[tempRowArray objectAtIndex:i] isEqualToString:@"\\N"] || [[tempRowArray objectAtIndex:i] isEqualToString:[prefs objectForKey:@"nullValue"]] ) { + //put nsnull object to array if field contains un-enclosed NULL string + [tempRowArray replaceObjectAtIndex:i withObject:[NSNull null]]; + } else { + //strip enclosed and escaped characters + mutableField = [NSMutableString stringWithString:[tempRowArray objectAtIndex:i]]; + //strip enclosed characters + if ( [mutableField length] >= (2*[enclosed length]) ) { + if ( [[mutableField substringToIndex:[enclosed length]] isEqualToString:enclosed] ) { + [mutableField deleteCharactersInRange:NSMakeRange(0,[enclosed length])]; + } + if ( [[mutableField substringFromIndex:([mutableField length]-[enclosed length])] isEqualToString:enclosed] ) { + [mutableField deleteCharactersInRange:NSMakeRange(([mutableField length]-[enclosed length]),[enclosed length])]; + } + } + //strip escaped characters + if ( ![enclosed isEqualToString:@""] ) { + [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, enclosed] withString:enclosed options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; + } else { + [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, terminated] withString:terminated options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; + } + if ( ![lineEnds isEqualToString:@""] ) { + [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, lineEnds] withString:lineEnds options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; + } + if ( ![escaped isEqualToString:@""] && ![escaped isEqualToString:enclosed] ) { + [mutableField replaceOccurrencesOfString:[NSString stringWithFormat:@"%@%@", escaped, escaped] withString:escaped options:NSLiteralSearch range:NSMakeRange(0, [mutableField length])]; + } + //add field to tempRowArray + [tempRowArray replaceObjectAtIndex:i withObject:[NSString stringWithString:mutableField]]; + } + } + //add row to tempArray + [tempArray addObject:[NSArray arrayWithArray:tempRowArray]]; + } + + return [NSArray arrayWithArray:tempArray]; } @@ -975,63 +976,63 @@ loads a csv string into an array takes an array and returns it as a xml string */ { - NSMutableString *string = [NSMutableString string]; - int i,j; - - if ( !silently ) { - //reset interface - [singleProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; - [singleProgressText displayIfNeeded]; - [singleProgressBar setDoubleValue:0]; - [singleProgressBar displayIfNeeded]; - //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - } - - if ( header ) { + NSMutableString *string = [NSMutableString string]; + int i,j; + + if ( !silently ) { + //reset interface + [singleProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; + [singleProgressText displayIfNeeded]; + [singleProgressBar setDoubleValue:0]; + [singleProgressBar displayIfNeeded]; + //open progress sheet + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + } + + if ( header ) { //add header - [string appendString:@"\n\n"]; - [string appendString:@"\n\n"]; - } + [string appendString:@"\n\n"]; + [string appendString:@"\n\n"]; + } //add table name - [string appendString:[NSString stringWithFormat:@"\t<%@>\n", [self htmlEscapeString:table]]]; - - for ( i = 1 ; i < [array count] ; i++ ) { - if ( !silently ) { - [singleProgressBar setDoubleValue:((i+1)*100/[array count])]; - [singleProgressBar displayIfNeeded]; - } + [string appendString:[NSString stringWithFormat:@"\t<%@>\n", [self htmlEscapeString:table]]]; + + for ( i = 1 ; i < [array count] ; i++ ) { + if ( !silently ) { + [singleProgressBar setDoubleValue:((i+1)*100/[array count])]; + [singleProgressBar displayIfNeeded]; + } //add rows - [string appendString:@"\t\n"]; - for ( j = 0 ; j < [[array objectAtIndex:i] count] ; j++ ) { - [string appendString:[NSString stringWithFormat:@"\t\t<%@>%@\n", - [self htmlEscapeString:[[[array objectAtIndex:0] objectAtIndex:j] description]], - [self htmlEscapeString:[[[array objectAtIndex:i] objectAtIndex:j] description]], - [self htmlEscapeString:[[[array objectAtIndex:0] objectAtIndex:j] description]]]]; - } - [string appendString:@"\t\n"]; - } + [string appendString:@"\t\n"]; + for ( j = 0 ; j < [[array objectAtIndex:i] count] ; j++ ) { + [string appendString:[NSString stringWithFormat:@"\t\t<%@>%@\n", + [self htmlEscapeString:[[[array objectAtIndex:0] objectAtIndex:j] description]], + [self htmlEscapeString:[[[array objectAtIndex:i] objectAtIndex:j] description]], + [self htmlEscapeString:[[[array objectAtIndex:0] objectAtIndex:j] description]]]]; + } + [string appendString:@"\t\n"]; + } //end table name - [string appendString:[NSString stringWithFormat:@"\t", [self htmlEscapeString:table]]]; - - if ( !silently ) { - //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - } - - return [NSString stringWithString:string]; + [string appendString:[NSString stringWithFormat:@"\t", [self htmlEscapeString:table]]]; + + if ( !silently ) { + //close progress sheet + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + } + + return [NSString stringWithString:string]; } - (NSString *)stringForSelectedTablesWithType:(NSString *)type @@ -1040,138 +1041,138 @@ returns a csv/xml string for the selected tables type has to be "csv" or "xml" */ { - int i,j,k,t,rowCount,tableCount; - CMMCPResult *queryResult; - NSString *tableName; - NSArray *fieldNames; - NSArray *theRow; - NSMutableArray *tableArray = [NSMutableArray array]; - NSMutableString *rowValue = [NSMutableString string]; - NSMutableArray *fieldValues; - NSMutableString *dump = [NSMutableString string]; - NSMutableString *errors = [NSMutableString string]; + int i,j,k,t,rowCount,tableCount; + CMMCPResult *queryResult; + NSString *tableName; + NSArray *fieldNames; + NSArray *theRow; + NSMutableArray *tableArray = [NSMutableArray array]; + NSMutableString *rowValue = [NSMutableString string]; + NSMutableArray *fieldValues; + NSMutableString *dump = [NSMutableString string]; + NSMutableString *errors = [NSMutableString string]; //reset interface - [errorsView setString:@""]; - [errorsView displayIfNeeded]; - [singleProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; - [singleProgressText displayIfNeeded]; - [singleProgressBar setDoubleValue:0]; - [singleProgressBar displayIfNeeded]; + [errorsView setString:@""]; + [errorsView displayIfNeeded]; + [singleProgressText setStringValue:NSLocalizedString(@"Writing...", @"text showing that app is writing text file")]; + [singleProgressText displayIfNeeded]; + [singleProgressBar setDoubleValue:0]; + [singleProgressBar displayIfNeeded]; //open progress sheet - [NSApp beginSheet:singleProgressSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; + [NSApp beginSheet:singleProgressSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; //count tables - tableCount = 0; - for ( i = 0 ; i < [tables count] ; i++ ) { - if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { - tableCount++; - } - } - k = 0; + tableCount = 0; + for ( i = 0 ; i < [tables count] ; i++ ) { + if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { + tableCount++; + } + } + k = 0; //add header of dump-file - if ( [type isEqualToString:@"csv"] ) { - [dump appendString:[NSString stringWithFormat:@"Host: %@ Database: %@ Generation Time: %@\n\n", - [tableDocumentInstance host], [tableDocumentInstance database], [NSDate date]]]; - } else if ( [type isEqualToString:@"xml"] ) { - [dump appendString:@"\n\n"]; - [dump appendString:@"\n\n\n"]; - [dump appendString:[NSString stringWithFormat:@"<%@>\n\n\n", - [self htmlEscapeString:[tableDocumentInstance database]]]]; - } - for ( i = 0 ; i < [tables count] ; i++ ) { - if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { - k++; + if ( [type isEqualToString:@"csv"] ) { + [dump appendString:[NSString stringWithFormat:@"Host: %@ Database: %@ Generation Time: %@\n\n", + [tableDocumentInstance host], [tableDocumentInstance database], [NSDate date]]]; + } else if ( [type isEqualToString:@"xml"] ) { + [dump appendString:@"\n\n"]; + [dump appendString:@"\n\n\n"]; + [dump appendString:[NSString stringWithFormat:@"<%@>\n\n\n", + [self htmlEscapeString:[tableDocumentInstance database]]]]; + } + for ( i = 0 ; i < [tables count] ; i++ ) { + if ( [[[tables objectAtIndex:i] objectAtIndex:0] boolValue] ) { + k++; //set progressbar and text - tableName = [[tables objectAtIndex:i] objectAtIndex:1]; - [singleProgressText setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Writing table %@...", @"text showing that app is writing table to text file"), tableName]]; - [singleProgressText displayIfNeeded]; + tableName = [[tables objectAtIndex:i] objectAtIndex:1]; + [singleProgressText setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Writing table %@...", @"text showing that app is writing table to text file"), tableName]]; + [singleProgressText displayIfNeeded]; //add name of table - if ( [type isEqualToString:@"csv"] ) { - [dump appendString:[NSString stringWithFormat:@"Table %@\n\n", tableName]]; - } + if ( [type isEqualToString:@"csv"] ) { + [dump appendString:[NSString stringWithFormat:@"Table %@\n\n", tableName]]; + } //add table content - queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM `%@`", tableName]]; - fieldNames = [queryResult fetchFieldNames]; - rowCount = [queryResult numOfRows]; - [tableArray removeAllObjects]; - //add field names - [tableArray addObject:fieldNames]; - for ( j = 0 ; j < rowCount ; j++ ) { - [queryResult dataSeek:j]; - theRow = [queryResult fetchRowAsArray]; - fieldValues = [NSMutableArray array]; - for ( t = 0 ; t < [theRow count] ; t++ ) { - if ( [[theRow objectAtIndex:t] isKindOfClass:[NSData class]] ) { - //convert data to string - [rowValue setString:[[NSString alloc] initWithData:[theRow objectAtIndex:t] - encoding:[mySQLConnection encoding]]]; - } else if ( [[theRow objectAtIndex:t] isMemberOfClass:[NSNull class]] ) { - [rowValue setString:[prefs objectForKey:@"nullValue"]]; - } else { - [rowValue setString:[[theRow objectAtIndex:t] description]]; - } - [fieldValues addObject:[NSString stringWithString:rowValue]]; - } - [tableArray addObject:[NSArray arrayWithArray:fieldValues]]; - } - if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) { - [errors appendString:[NSString stringWithFormat:@"%@\n", [mySQLConnection getLastErrorMessage]]]; - } - if ( [type isEqualToString:@"csv"] ) { - [dump appendString:[self csvForArray:tableArray - useFirstLine:[exportMultipleFieldNamesSwitch state] - terminatedBy:[exportMultipleFieldsTerminatedField stringValue] - enclosedBy:[exportMultipleFieldsEnclosedField stringValue] - escapedBy:[exportMultipleFieldsEscapedField stringValue] - lineEnds:[exportMultipleLinesTerminatedField stringValue] - silently:YES]]; - } else if ( [type isEqualToString:@"xml"] ) { - [dump appendString:[self xmlForArray:tableArray tableName:tableName withHeader:NO silently:YES]]; - } + queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM `%@`", tableName]]; + fieldNames = [queryResult fetchFieldNames]; + rowCount = [queryResult numOfRows]; + [tableArray removeAllObjects]; + //add field names + [tableArray addObject:fieldNames]; + for ( j = 0 ; j < rowCount ; j++ ) { + [queryResult dataSeek:j]; + theRow = [queryResult fetchRowAsArray]; + fieldValues = [NSMutableArray array]; + for ( t = 0 ; t < [theRow count] ; t++ ) { + if ( [[theRow objectAtIndex:t] isKindOfClass:[NSData class]] ) { + //convert data to string + [rowValue setString:[[NSString alloc] initWithData:[theRow objectAtIndex:t] + encoding:[mySQLConnection encoding]]]; + } else if ( [[theRow objectAtIndex:t] isMemberOfClass:[NSNull class]] ) { + [rowValue setString:[prefs objectForKey:@"nullValue"]]; + } else { + [rowValue setString:[[theRow objectAtIndex:t] description]]; + } + [fieldValues addObject:[NSString stringWithString:rowValue]]; + } + [tableArray addObject:[NSArray arrayWithArray:fieldValues]]; + } + if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""] ) { + [errors appendString:[NSString stringWithFormat:@"%@\n", [mySQLConnection getLastErrorMessage]]]; + } + if ( [type isEqualToString:@"csv"] ) { + [dump appendString:[self csvForArray:tableArray + useFirstLine:[exportMultipleFieldNamesSwitch state] + terminatedBy:[exportMultipleFieldsTerminatedField stringValue] + enclosedBy:[exportMultipleFieldsEnclosedField stringValue] + escapedBy:[exportMultipleFieldsEscapedField stringValue] + lineEnds:[exportMultipleLinesTerminatedField stringValue] + silently:YES]]; + } else if ( [type isEqualToString:@"xml"] ) { + [dump appendString:[self xmlForArray:tableArray tableName:tableName withHeader:NO silently:YES]]; + } //set progressbar and text - [singleProgressBar setDoubleValue:(k*100/tableCount)]; - [singleProgressBar displayIfNeeded]; - [dump appendString:@"\n\n\n"]; - } - } + [singleProgressBar setDoubleValue:(k*100/tableCount)]; + [singleProgressBar displayIfNeeded]; + [dump appendString:@"\n\n\n"]; + } + } //write xml end - if ( [type isEqualToString:@"xml"] ) { - [dump appendString:[NSString stringWithFormat:@"", - [self htmlEscapeString:[tableDocumentInstance database]]]]; - } + if ( [type isEqualToString:@"xml"] ) { + [dump appendString:[NSString stringWithFormat:@"", + [self htmlEscapeString:[tableDocumentInstance database]]]]; + } //close progress sheet - [NSApp endSheet:singleProgressSheet]; - [singleProgressSheet orderOut:nil]; - + [NSApp endSheet:singleProgressSheet]; + [singleProgressSheet orderOut:nil]; + //show errors sheet if there have been errors - if ( [errors length] ) { - [errorsView setString:errors]; - [NSApp beginSheet:errorsSheet - modalForWindow:tableWindow modalDelegate:self - didEndSelector:nil contextInfo:nil]; - [NSApp runModalForWindow:errorsSheet]; - - [NSApp endSheet:errorsSheet]; - [errorsSheet orderOut:nil]; - } - - return [NSString stringWithString:dump]; + if ( [errors length] ) { + [errorsView setString:errors]; + [NSApp beginSheet:errorsSheet + modalForWindow:tableWindow modalDelegate:self + didEndSelector:nil contextInfo:nil]; + [NSApp runModalForWindow:errorsSheet]; + + [NSApp endSheet:errorsSheet]; + [errorsSheet orderOut:nil]; + } + + return [NSString stringWithString:dump]; } - (NSString *)htmlEscapeString:(NSString *)string @@ -1179,107 +1180,107 @@ type has to be "csv" or "xml" html escapes a string */ { - NSMutableString *mutableString = [NSMutableString stringWithString:string]; - - [mutableString replaceOccurrencesOfString:@"&" withString:@"&" - options:NSLiteralSearch - range:NSMakeRange(0, [mutableString length])]; - [mutableString replaceOccurrencesOfString:@"<" withString:@"<" - options:NSLiteralSearch - range:NSMakeRange(0, [mutableString length])]; - [mutableString replaceOccurrencesOfString:@">" withString:@">" - options:NSLiteralSearch - range:NSMakeRange(0, [mutableString length])]; - [mutableString replaceOccurrencesOfString:@"\"" withString:@""" - options:NSLiteralSearch - range:NSMakeRange(0, [mutableString length])]; - - return [NSString stringWithString:mutableString]; + NSMutableString *mutableString = [NSMutableString stringWithString:string]; + + [mutableString replaceOccurrencesOfString:@"&" withString:@"&" + options:NSLiteralSearch + range:NSMakeRange(0, [mutableString length])]; + [mutableString replaceOccurrencesOfString:@"<" withString:@"<" + options:NSLiteralSearch + range:NSMakeRange(0, [mutableString length])]; + [mutableString replaceOccurrencesOfString:@">" withString:@">" + options:NSLiteralSearch + range:NSMakeRange(0, [mutableString length])]; + [mutableString replaceOccurrencesOfString:@"\"" withString:@""" + options:NSLiteralSearch + range:NSMakeRange(0, [mutableString length])]; + + return [NSString stringWithString:mutableString]; } - (NSArray *)arrayForString:(NSString *)string enclosed:(NSString *)enclosed - escaped:(NSString *)escaped terminated:(NSString *)terminated + escaped:(NSString *)escaped terminated:(NSString *)terminated /* split a string by the terminated-character if this is not escaped if enclosed-character is given, ignores characters inside enclosed-characters */ { - NSMutableArray *tempArray = [NSMutableArray array]; - BOOL inString = NO; - BOOL isEscaped = NO; - BOOL br = NO; - unsigned i, j, start; - char enc = nil; - char esc = nil; - char ter = nil; - - //we take only first character by now (too complicated otherwise) - if ( [enclosed length] ) { - enc = [enclosed characterAtIndex:0]; - } - if ( [escaped length] ) { - esc = [escaped characterAtIndex:0]; - } - if ( [terminated length] ) { - ter = [terminated characterAtIndex:0]; - } - - start = 0; - - for ( i = 0 ; i < [string length] ; i++ ) { - if ( inString ) { - //we are in a string - br = NO; - while ( !br ) { - if ( i >= [string length] ) { - //end of string -> no second enclose character found - br = YES; - } else if ( [string characterAtIndex:i] == enc ) { - //second enclose-character found - //enclose-character escaped? - isEscaped = NO; - j = 1; - while ( (i-j>0) && ([string characterAtIndex:(i-j)] == esc) ) { - isEscaped = !isEscaped; - j++; - } - if ( !isEscaped ) { - inString = NO; - br = YES; - } - } - if ( !br ) - i++; - } - } else if ( [string characterAtIndex:i] == ter ) { - //terminated-character found - if ( [enclosed isEqualToString:@""] ) { - //check if terminated character is escaped - isEscaped = NO; - j = 1; - while ( (i-j>0) && ([string characterAtIndex:(i-j)] == esc) ) { - isEscaped = !isEscaped; - j++; - } - if ( !isEscaped ) { - [tempArray addObject:[string substringWithRange:NSMakeRange(start,(i-start))]]; - start = i + 1; - } - } else { - //add object to array + NSMutableArray *tempArray = [NSMutableArray array]; + BOOL inString = NO; + BOOL isEscaped = NO; + BOOL br = NO; + unsigned i, j, start; + char enc = nil; + char esc = nil; + char ter = nil; + + //we take only first character by now (too complicated otherwise) + if ( [enclosed length] ) { + enc = [enclosed characterAtIndex:0]; + } + if ( [escaped length] ) { + esc = [escaped characterAtIndex:0]; + } + if ( [terminated length] ) { + ter = [terminated characterAtIndex:0]; + } + + start = 0; + + for ( i = 0 ; i < [string length] ; i++ ) { + if ( inString ) { + //we are in a string + br = NO; + while ( !br ) { + if ( i >= [string length] ) { + //end of string -> no second enclose character found + br = YES; + } else if ( [string characterAtIndex:i] == enc ) { + //second enclose-character found + //enclose-character escaped? + isEscaped = NO; + j = 1; + while ( (i-j>0) && ([string characterAtIndex:(i-j)] == esc) ) { + isEscaped = !isEscaped; + j++; + } + if ( !isEscaped ) { + inString = NO; + br = YES; + } + } + if ( !br ) + i++; + } + } else if ( [string characterAtIndex:i] == ter ) { + //terminated-character found + if ( [enclosed isEqualToString:@""] ) { + //check if terminated character is escaped + isEscaped = NO; + j = 1; + while ( (i-j>0) && ([string characterAtIndex:(i-j)] == esc) ) { + isEscaped = !isEscaped; + j++; + } + if ( !isEscaped ) { + [tempArray addObject:[string substringWithRange:NSMakeRange(start,(i-start))]]; + start = i + 1; + } + } else { + //add object to array //NSLog([string substringWithRange:NSMakeRange(start,(i-start))]); - [tempArray addObject:[string substringWithRange:NSMakeRange(start,(i-start))]]; - start = i + 1; - } - } else if ( [string characterAtIndex:i] == enc ) { - //enclosed-character found - inString = YES; - } - } + [tempArray addObject:[string substringWithRange:NSMakeRange(start,(i-start))]]; + start = i + 1; + } + } else if ( [string characterAtIndex:i] == enc ) { + //enclosed-character found + inString = YES; + } + } //add rest of string to array - [tempArray addObject:[string substringWithRange:NSMakeRange(start,([string length]-start))]]; + [tempArray addObject:[string substringWithRange:NSMakeRange(start,([string length]-start))]]; - return [NSArray arrayWithArray:tempArray]; + return [NSArray arrayWithArray:tempArray]; } - (NSArray *)splitQueries:(NSString *)query @@ -1287,72 +1288,72 @@ if enclosed-character is given, ignores characters inside enclosed-characters splits the queries by ;'s which aren't inside any ", ' or ` characters */ { - NSMutableString *queries = [NSMutableString stringWithString:query]; - NSMutableArray *queryArray = [NSMutableArray array]; - char stringType = nil; - BOOL inString = NO; - BOOL escaped; - unsigned lineStart = 0; - unsigned i, j, x, currentLineLength; - - //parse string - for ( i = 0 ; i < [queries length] ; i++ ) { - if ( inString ) { - //we are in a string - //look for end of string - for ( ; i < [queries length] ; i++ ) { - if ( (([queries characterAtIndex:i] == '`') && (stringType == '`')) || - (([queries characterAtIndex:i] == stringType) && ([queries characterAtIndex:i-1] != '\\')) ) { - //back-tick or no backslash before string end -> end of string - inString = NO; - break; - } else if ( [queries characterAtIndex:i] == stringType ) { - //check if string end isn't escaped - escaped = YES; - j = 2; - currentLineLength = i - lineStart; - while ( ((currentLineLength-j)>0) && ([queries characterAtIndex:i-j] == '\\') ) { - escaped = !escaped; - j++; - } - if ( !escaped ) { - //it's really the end of the string - inString = NO; - } - } - } - } else if ( ([queries characterAtIndex:i] == '#') || - ((i+2<[queries length]) && - ([queries characterAtIndex:i] == '-') && - ([queries characterAtIndex:i+1] == '-') && - ([queries characterAtIndex:i+2] == ' ')) ) { - //it's a comment -> delete it - x = i; - while ( (x<[queries length]) && ([queries characterAtIndex:x] != '\r') && ([queries characterAtIndex:x] != '\n') ) { - x++; - } - [queries deleteCharactersInRange:NSMakeRange(i,x-i)]; - } else if ( [queries characterAtIndex:i] == ';' ) { - //we are at the end of a query - [queryArray addObject:[queries substringWithRange:NSMakeRange(lineStart, (i-lineStart))]]; - while ( ((i+1)<[queries length]) && (([queries characterAtIndex:i+1]=='\n') || ([queries characterAtIndex:i+1]=='\r') || ([queries characterAtIndex:i+1]==' ')) ) { - i++; - } - lineStart = i + 1; - } else if ( ([queries characterAtIndex:i] == '\'') || - ([queries characterAtIndex:i] == '"') || - ([queries characterAtIndex:i] == '`') ) { - //we are entering a string - inString = YES; - stringType = [queries characterAtIndex:i]; - } - } - //add rest of string to array (if last line has not ended with a ";") - if ( lineStart < [queries length] ) { - [queryArray addObject:[queries substringWithRange:NSMakeRange(lineStart, ([queries length]-lineStart))]]; - } - //return array - return [NSArray arrayWithArray:queryArray]; + NSMutableString *queries = [NSMutableString stringWithString:query]; + NSMutableArray *queryArray = [NSMutableArray array]; + char stringType = nil; + BOOL inString = NO; + BOOL escaped; + unsigned lineStart = 0; + unsigned i, j, x, currentLineLength; + + //parse string + for ( i = 0 ; i < [queries length] ; i++ ) { + if ( inString ) { + //we are in a string + //look for end of string + for ( ; i < [queries length] ; i++ ) { + if ( (([queries characterAtIndex:i] == '`') && (stringType == '`')) || + (([queries characterAtIndex:i] == stringType) && ([queries characterAtIndex:i-1] != '\\')) ) { + //back-tick or no backslash before string end -> end of string + inString = NO; + break; + } else if ( [queries characterAtIndex:i] == stringType ) { + //check if string end isn't escaped + escaped = YES; + j = 2; + currentLineLength = i - lineStart; + while ( ((currentLineLength-j)>0) && ([queries characterAtIndex:i-j] == '\\') ) { + escaped = !escaped; + j++; + } + if ( !escaped ) { + //it's really the end of the string + inString = NO; + } + } + } + } else if ( ([queries characterAtIndex:i] == '#') || + ((i+2<[queries length]) && + ([queries characterAtIndex:i] == '-') && + ([queries characterAtIndex:i+1] == '-') && + ([queries characterAtIndex:i+2] == ' ')) ) { + //it's a comment -> delete it + x = i; + while ( (x<[queries length]) && ([queries characterAtIndex:x] != '\r') && ([queries characterAtIndex:x] != '\n') ) { + x++; + } + [queries deleteCharactersInRange:NSMakeRange(i,x-i)]; + } else if ( [queries characterAtIndex:i] == ';' ) { + //we are at the end of a query + [queryArray addObject:[queries substringWithRange:NSMakeRange(lineStart, (i-lineStart))]]; + while ( ((i+1)<[queries length]) && (([queries characterAtIndex:i+1]=='\n') || ([queries characterAtIndex:i+1]=='\r') || ([queries characterAtIndex:i+1]==' ')) ) { + i++; + } + lineStart = i + 1; + } else if ( ([queries characterAtIndex:i] == '\'') || + ([queries characterAtIndex:i] == '"') || + ([queries characterAtIndex:i] == '`') ) { + //we are entering a string + inString = YES; + stringType = [queries characterAtIndex:i]; + } + } + //add rest of string to array (if last line has not ended with a ";") + if ( lineStart < [queries length] ) { + [queryArray addObject:[queries substringWithRange:NSMakeRange(lineStart, ([queries length]-lineStart))]]; + } + //return array + return [NSArray arrayWithArray:queryArray]; } @@ -1362,111 +1363,111 @@ splits the queries by ;'s which aren't inside any ", ' or ` characters sets the connection (received from TableDocument) and makes things that have to be done only once */ { - NSButtonCell *switchButton = [[NSButtonCell alloc] init]; + NSButtonCell *switchButton = [[NSButtonCell alloc] init]; - prefs = [[NSUserDefaults standardUserDefaults] retain]; + prefs = [[NSUserDefaults standardUserDefaults] retain]; - mySQLConnection = theConnection; + mySQLConnection = theConnection; //set up the interface - [switchButton setButtonType:NSSwitchButton]; - [switchButton setControlSize:NSSmallControlSize]; - [[exportDumpTableView tableColumnWithIdentifier:@"switch"] setDataCell:switchButton]; - [[exportMultipleCSVTableView tableColumnWithIdentifier:@"switch"] setDataCell:switchButton]; - [[exportMultipleXMLTableView tableColumnWithIdentifier:@"switch"] setDataCell:switchButton]; - if ( [prefs boolForKey:@"useMonospacedFonts"] ) { - [[[exportDumpTableView tableColumnWithIdentifier:@"tables"] dataCell] - setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; - [[[exportMultipleCSVTableView tableColumnWithIdentifier:@"tables"] dataCell] - setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; - [[[exportMultipleXMLTableView tableColumnWithIdentifier:@"tables"] dataCell] - setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; - [[[fieldMappingTableView tableColumnWithIdentifier:@"0"] dataCell] - setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; - [errorsView setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; - } else { - [[[exportDumpTableView tableColumnWithIdentifier:@"tables"] dataCell] - setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - [[[exportMultipleCSVTableView tableColumnWithIdentifier:@"tables"] dataCell] - setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - [[[exportMultipleXMLTableView tableColumnWithIdentifier:@"tables"] dataCell] - setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - [[[fieldMappingTableView tableColumnWithIdentifier:@"0"] dataCell] - setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - [errorsView setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; - } -// [self reloadTables:self]; + [switchButton setButtonType:NSSwitchButton]; + [switchButton setControlSize:NSSmallControlSize]; + [[exportDumpTableView tableColumnWithIdentifier:@"switch"] setDataCell:switchButton]; + [[exportMultipleCSVTableView tableColumnWithIdentifier:@"switch"] setDataCell:switchButton]; + [[exportMultipleXMLTableView tableColumnWithIdentifier:@"switch"] setDataCell:switchButton]; + if ( [prefs boolForKey:@"useMonospacedFonts"] ) { + [[[exportDumpTableView tableColumnWithIdentifier:@"tables"] dataCell] + setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; + [[[exportMultipleCSVTableView tableColumnWithIdentifier:@"tables"] dataCell] + setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; + [[[exportMultipleXMLTableView tableColumnWithIdentifier:@"tables"] dataCell] + setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; + [[[fieldMappingTableView tableColumnWithIdentifier:@"0"] dataCell] + setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; + [errorsView setFont:[NSFont fontWithName:@"Monaco" size:[NSFont smallSystemFontSize]]]; + } else { + [[[exportDumpTableView tableColumnWithIdentifier:@"tables"] dataCell] + setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [[[exportMultipleCSVTableView tableColumnWithIdentifier:@"tables"] dataCell] + setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [[[exportMultipleXMLTableView tableColumnWithIdentifier:@"tables"] dataCell] + setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [[[fieldMappingTableView tableColumnWithIdentifier:@"0"] dataCell] + setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [errorsView setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + } +// [self reloadTables:self]; } //tableView datasource methods - (int)numberOfRowsInTableView:(NSTableView *)aTableView; { - if ( aTableView == fieldMappingTableView ) { - return [fieldMappingArray count]; - } else { - return [tables count]; - } + if ( aTableView == fieldMappingTableView ) { + return [fieldMappingArray count]; + } else { + return [tables count]; + } } - (id)tableView:(NSTableView *)aTableView - objectValueForTableColumn:(NSTableColumn *)aTableColumn - row:(int)rowIndex + objectValueForTableColumn:(NSTableColumn *)aTableColumn + row:(int)rowIndex { - if ( aTableView == fieldMappingTableView ) { - return [[fieldMappingArray objectAtIndex:rowIndex] objectAtIndex:[[aTableColumn identifier] intValue]]; - } else { - if ( [[aTableColumn identifier] isEqualToString:@"switch"] ) { - return [[tables objectAtIndex:rowIndex] objectAtIndex:0]; - } else { - return [[tables objectAtIndex:rowIndex] objectAtIndex:1]; - } - } + if ( aTableView == fieldMappingTableView ) { + return [[fieldMappingArray objectAtIndex:rowIndex] objectAtIndex:[[aTableColumn identifier] intValue]]; + } else { + if ( [[aTableColumn identifier] isEqualToString:@"switch"] ) { + return [[tables objectAtIndex:rowIndex] objectAtIndex:0]; + } else { + return [[tables objectAtIndex:rowIndex] objectAtIndex:1]; + } + } } - (void)tableView:(NSTableView *)aTableView - setObjectValue:(id)anObject - forTableColumn:(NSTableColumn *)aTableColumn - row:(int)rowIndex + setObjectValue:(id)anObject + forTableColumn:(NSTableColumn *)aTableColumn + row:(int)rowIndex { - if ( aTableView == fieldMappingTableView ) { - int i; - for ( i = 0 ; i < [fieldMappingArray count] ; i++ ) { - //check that field isn't already used - if ( [[[fieldMappingArray objectAtIndex:i] objectAtIndex:1] isEqualToNumber:anObject] - && (rowIndex != i) - && ![anObject isEqualToNumber:[NSNumber numberWithInt:0]] ) { - return; - } - } - [[fieldMappingArray objectAtIndex:rowIndex] replaceObjectAtIndex:[[aTableColumn identifier] intValue] withObject:anObject]; - } else { - [[tables objectAtIndex:rowIndex] replaceObjectAtIndex:0 withObject:anObject]; - } + if ( aTableView == fieldMappingTableView ) { + int i; + for ( i = 0 ; i < [fieldMappingArray count] ; i++ ) { + //check that field isn't already used + if ( [[[fieldMappingArray objectAtIndex:i] objectAtIndex:1] isEqualToNumber:anObject] + && (rowIndex != i) + && ![anObject isEqualToNumber:[NSNumber numberWithInt:0]] ) { + return; + } + } + [[fieldMappingArray objectAtIndex:rowIndex] replaceObjectAtIndex:[[aTableColumn identifier] intValue] withObject:anObject]; + } else { + [[tables objectAtIndex:rowIndex] replaceObjectAtIndex:0 withObject:anObject]; + } } //last but not least - (id)init; { - self = [super init]; + self = [super init]; - tables = [[NSMutableArray alloc] init]; + tables = [[NSMutableArray alloc] init]; - return self; + return self; } - (void)dealloc { -// NSLog(@"TableDump dealloc"); - - [tables release]; - [importArray release]; - [fieldMappingArray release]; - [savePath release]; - [openPath release]; - [prefs release]; - - [super dealloc]; +// NSLog(@"TableDump dealloc"); + + [tables release]; + [importArray release]; + [fieldMappingArray release]; + [savePath release]; + [openPath release]; + [prefs release]; + + [super dealloc]; } -- cgit v1.2.3