aboutsummaryrefslogtreecommitdiffstats
path: root/Source/TableDocument.m
diff options
context:
space:
mode:
authorBibiko <bibiko@eva.mpg.de>2009-08-25 11:23:24 +0000
committerBibiko <bibiko@eva.mpg.de>2009-08-25 11:23:24 +0000
commitca7cce67d986c3a7e3d5b4d8503d33872e461b68 (patch)
tree10a0b0d319024a9b0589d2e083dc4d109b9fd73d /Source/TableDocument.m
parent94f177aa0e8350a9bba0790ee41b606c461a314f (diff)
downloadsequelpro-ca7cce67d986c3a7e3d5b4d8503d33872e461b68.tar.gz
sequelpro-ca7cce67d986c3a7e3d5b4d8503d33872e461b68.tar.bz2
sequelpro-ca7cce67d986c3a7e3d5b4d8503d33872e461b68.zip
• re-factored the SPF file structure
- now it's an open format XML plist file with either encrypted <data> key or plain text <data> dict - (if option "Save Passords") the passwords will be readable if no encryption! - queries can be saved as plain text; whereby SP will compress the text chunk if length > 50k automatically NOTE: Basically it's working but the Save SPF file accessory is now a bit out of sync - waiting for stuart02
Diffstat (limited to 'Source/TableDocument.m')
-rw-r--r--Source/TableDocument.m546
1 files changed, 321 insertions, 225 deletions
diff --git a/Source/TableDocument.m b/Source/TableDocument.m
index 3f7bbac9..b89d6fe3 100644
--- a/Source/TableDocument.m
+++ b/Source/TableDocument.m
@@ -85,7 +85,7 @@
queryEditorInitString = nil;
[saveConnectionEncryptString setStringValue:@""];
- spf = nil;
+ spfSession = nil;
}
@@ -171,13 +171,20 @@
NSError *readError = nil;
NSString *convError = nil;
NSPropertyListFormat format;
+
NSString *encryptpw = nil;
-
- NSData *pData = [[NSData dataWithContentsOfFile:path options:NSUncachedRead error:&readError] decompress];
+ NSDictionary *data = nil;
+ NSDictionary *connection = nil;
+ NSDictionary *spf = nil;
+
+ int connectionType;
+
+ NSData *pData = [NSData dataWithContentsOfFile:path options:NSUncachedRead error:&readError];
+
spf = [[NSPropertyListSerialization propertyListFromData:pData
mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError] retain];
- if(!spf || readError != nil || [convError length] | format != NSPropertyListBinaryFormat_v1_0) {
+ if(!spf || readError != nil || [convError length] || !(format == NSPropertyListXMLFormat_v1_0 || format == NSPropertyListBinaryFormat_v1_0)) {
NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")]
defaultButton:NSLocalizedString(@"OK", @"OK button")
alternateButton:nil
@@ -189,15 +196,30 @@
return;
}
- // Init Custom Query editor with the stored queries if given
- if([spf objectForKey:@"queries"])
- [self initQueryEditorWithString:[spf objectForKey:@"queries"]];
+ // For dispatching later
+ if(![[spf objectForKey:@"format"] isEqualToString:@"connection"]) {
+ NSLog(@"SPF file format is not 'connection'.");
+ return;
+ }
+
+ if(![spf objectForKey:@"data"]) {
+ NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")]
+ defaultButton:NSLocalizedString(@"OK", @"OK button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:NSLocalizedString(@"No data found.", @"no data found")];
+
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
+ return;
+ }
// Clean fields
[connectionController setName:@""];
[connectionController setUser:@""];
[connectionController setHost:@""];
[connectionController setPort:@""];
+ [connectionController setSocket:@""];
[connectionController setSshHost:@""];
[connectionController setSshUser:@""];
[connectionController setSshPort:@""];
@@ -206,10 +228,10 @@
[connectionController setSshPassword:@""];
// Ask for a password if SPF file passwords were encrypted as sheet
- if([spf objectForKey:@"encrypted"] && [[spf objectForKey:@"encrypted"] intValue] == NSOnState) {
+ if([spf objectForKey:@"encrypted"] && [[spf valueForKey:@"encrypted"] boolValue]) {
[inputTextWindowHeader setStringValue:NSLocalizedString(@"Connection file is encrypted", @"Connection file is encrypted")];
- [inputTextWindowMessage setStringValue:NSLocalizedString(@"Please enter the password:",@"Please enter the password")];
+ [inputTextWindowMessage setStringValue:[NSString stringWithFormat:NSLocalizedString(@"Enter password for ‘%@’:",@"Please enter the password"), [path lastPathComponent]]];
[inputTextWindowSecureTextField setStringValue:@""];
[inputTextWindowSecureTextField selectText:nil];
@@ -240,84 +262,113 @@
}
- if([spf objectForKey:@"connectionType"]) {
- [connectionController setType:[[spf objectForKey:@"connectionType"] intValue]];
- [connectionController resizeTabViewToConnectionType:[connectionController type] animating:NO];
- }
-
- if([spf objectForKey:@"name"])
- [connectionController setName:[spf objectForKey:@"name"]];
- if([spf objectForKey:@"user"])
- [connectionController setUser:[spf objectForKey:@"user"]];
- if([spf objectForKey:@"host"])
- [connectionController setHost:[spf objectForKey:@"host"]];
- if([spf objectForKey:@"port"])
- [connectionController setPort:[spf objectForKey:@"port"]];
- if([spf objectForKey:@"sshHost"])
- [connectionController setSshHost:[spf objectForKey:@"sshHost"]];
- if([spf objectForKey:@"sshUser"])
- [connectionController setSshUser:[spf objectForKey:@"sshUser"]];
- if([spf objectForKey:@"sshPort"])
- [connectionController setSshPort:[spf objectForKey:@"sshPort"]];
- if([spf objectForKey:@"selectedDatabase"])
- [connectionController setDatabase:[spf objectForKey:@"selectedDatabase"]];
-
- // If password are stored in SPF file auto-connect
- // otherwise wait for password(s)
- if([spf objectForKey:@"auth"]) {
-
- NSString *sauth;
- if(encryptpw != nil && [spf objectForKey:@"encrypted"] && [[spf objectForKey:@"encrypted"] intValue] == NSOnState)
- if([[spf objectForKey:@"auth"] length])
- sauth = [[NSString alloc] initWithData:[[spf objectForKey:@"auth"] dataDecryptedWithPassword:encryptpw] encoding:NSUTF8StringEncoding];
- else
- sauth = @"";
- else
- if([[spf objectForKey:@"auth"] length])
- sauth = [[NSString alloc] initWithData:[spf objectForKey:@"auth"] encoding:NSUTF8StringEncoding];
- else
- sauth = @"";
+ if([[spf objectForKey:@"data"] isKindOfClass:[NSDictionary class]])
+ data = [NSDictionary dictionaryWithDictionary:[spf objectForKey:@"data"]];
+ else if([[spf objectForKey:@"data"] isKindOfClass:[NSData class]]) {
+ NSData *decryptdata = nil;
+ decryptdata = [[[NSMutableData alloc] initWithData:[(NSData *)[spf objectForKey:@"data"] dataDecryptedWithPassword:encryptpw]] autorelease];
+ if(decryptdata != nil && [decryptdata length]) {
+ NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:decryptdata] autorelease];
+ data = (NSDictionary *)[unarchiver decodeObjectForKey:@"data"];
+ [unarchiver finishDecoding];
+ }
+ if(data == nil) {
+ NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")]
+ defaultButton:NSLocalizedString(@"OK", @"OK button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:NSLocalizedString(@"Wrong data format or password.", @"wrong data format or password")];
+
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
+ return;
- [connectionController setPassword:sauth];
- [sauth release];
+ }
+ }
- if([connectionController type] == SP_CONNECTION_SSHTUNNEL) {
+ if(data == nil) {
+ NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")]
+ defaultButton:NSLocalizedString(@"OK", @"OK button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:NSLocalizedString(@"Wrong data format.", @"wrong data format")];
- if(![spf objectForKey:@"sshAuth"]) {
- [connectionController setSshPassword:@""];
- [[connectionController valueForKeyPath:@"sshSSHPasswordField"] selectText:self];
- return;
- }
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
+ return;
- NSString *sshauth;
- if(encryptpw != nil && [spf objectForKey:@"encrypted"] && [[spf objectForKey:@"encrypted"] intValue] == NSOnState)
- if([[spf objectForKey:@"sshAuth"] length])
- sshauth = [[NSString alloc] initWithData:[[spf objectForKey:@"sshAuth"] dataDecryptedWithPassword:encryptpw] encoding:NSUTF8StringEncoding];
- else
- sshauth = @"";
- else
- if([[spf objectForKey:@"sshAuth"] length])
- sshauth = [[NSString alloc] initWithData:[spf objectForKey:@"sshAuth"] encoding:NSUTF8StringEncoding];
- else
- sshauth = @"";
+ }
- [connectionController setSshPassword:sshauth];
- [sshauth release];
- [connectionController initiateConnection:nil];
+ encryptpw = nil;
- } else {
+ if(![data objectForKey:@"connection"]) {
+ NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while reading connection data file", @"error while reading connection data file")]
+ defaultButton:NSLocalizedString(@"OK", @"OK button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:NSLocalizedString(@"No connection data found.", @"no connection data found")];
- [connectionController initiateConnection:nil];
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
+ return;
+ }
- }
- } else {
+ connection = [NSDictionary dictionaryWithDictionary:[data objectForKey:@"connection"]];
+
+ if([connection objectForKey:@"type"]) {
+ if([[connection objectForKey:@"type"] isEqualToString:@"SP_CONNECTION_TCPIP"])
+ connectionType = SP_CONNECTION_TCPIP;
+ else if([[connection objectForKey:@"type"] isEqualToString:@"SP_CONNECTION_SOCKET"])
+ connectionType = SP_CONNECTION_SOCKET;
+ else if([[connection objectForKey:@"type"] isEqualToString:@"SP_CONNECTION_SSHTUNNEL"])
+ connectionType = SP_CONNECTION_SSHTUNNEL;
+ else
+ connectionType = SP_CONNECTION_TCPIP;
+
+ [connectionController setType:connectionType];
+ [connectionController resizeTabViewToConnectionType:connectionType animating:NO];
+ }
+
+ if([connection objectForKey:@"name"])
+ [connectionController setName:[connection objectForKey:@"name"]];
+ if([connection objectForKey:@"user"])
+ [connectionController setUser:[connection objectForKey:@"user"]];
+ if([connection objectForKey:@"host"])
+ [connectionController setHost:[connection objectForKey:@"host"]];
+ if([connection objectForKey:@"port"])
+ [connectionController setPort:[NSString stringWithFormat:@"%d", [connection objectForKey:@"port"]]];
+ if([connection objectForKey:@"password"])
+ [connectionController setPassword:[connection objectForKey:@"password"]];
+ if(connectionType == SP_CONNECTION_SOCKET && [connection objectForKey:@"socket"])
+ [connectionController setSocket:[connection objectForKey:@"socket"]];
+
+ if(connectionType == SP_CONNECTION_SSHTUNNEL) {
+ if([connection objectForKey:@"ssh_host"])
+ [connectionController setSshHost:[connection objectForKey:@"ssh_host"]];
+ if([connection objectForKey:@"ssh_user"])
+ [connectionController setSshUser:[connection objectForKey:@"ssh_user"]];
+ if([connection objectForKey:@"ssh_port"])
+ [connectionController setSshPort:[NSString stringWithFormat:@"%d", [connection objectForKey:@"ssh_port"]]];
+ if([connection objectForKey:@"ssh_password"])
+ [connectionController setSshPassword:[connection objectForKey:@"ssh_password"]];
+ }
+
+ if([connection objectForKey:@"database"])
+ [connectionController setDatabase:[connection objectForKey:@"database"]];
+
+ if([data objectForKey:@"session"])
+ spfSession = [[NSDictionary dictionaryWithDictionary:[data objectForKey:@"session"]] retain];
+
+ if(![connection objectForKey:@"password"]) {
[connectionController setPassword:@""];
[connectionController setSshPassword:@""];
[[connectionController valueForKeyPath:@"standardPasswordField"] selectText:self];
-
+ return;
}
- encryptpw = nil;
+
+ if([connection objectForKey:@"auto_connect"] && [[connection valueForKey:@"auto_connect"] boolValue])
+ [connectionController initiateConnection:nil];
}
@@ -330,70 +381,51 @@
// Check and set the table
NSArray *tables = [tablesListInstance tables];
- // Give SP a bit time to load the table list
- int cnt = 0;
- while(cnt < 5) {
- if(![tables indexOfObject:[spf objectForKey:@"selectedTable"]] == NSNotFound) break;
- usleep(500);
- cnt++;
- }
+ if([tables indexOfObject:[spfSession objectForKey:@"table"]] == NSNotFound) return;
- if([tables indexOfObject:[spf objectForKey:@"selectedTable"]] == NSNotFound) return;
+ // TODO up to now it doesn't work
+ if([spfSession objectForKey:@"contentSelectedIndexSet"]) {
+ NSMutableIndexSet *anIndexSet = [NSMutableIndexSet indexSet];
+ NSArray *items = [spfSession objectForKey:@"contentSelectedIndexSet"];
+ unsigned int i;
+ for(i=0; i<[items count]; i++)
+ [anIndexSet addIndex:(NSUInteger)NSArrayObjectAtIndex(items, i)];
- // Select table
- [tablesListInstance selectTableAtIndex:[NSNumber numberWithInt:[tables indexOfObject:[spf objectForKey:@"selectedTable"]]]];
- [[tablesListInstance valueForKeyPath:@"tablesListView"] scrollRowToVisible:[tables indexOfObject:[spf objectForKey:@"selectedTable"]]];
+ [tableContentInstance setSelectedRowIndexesToRestore:anIndexSet];
+ }
// Set table content details for restore
- if([spf objectForKey:@"contentSortCol"])
- [tableContentInstance setSortColumnNameToRestore:[spf objectForKey:@"contentSortCol"] isAscending:[[spf objectForKey:@"contentSortCol"] boolValue]];
- if([spf objectForKey:@"contentLimitStartPosition"])
- [tableContentInstance setLimitStartToRestore:[[spf objectForKey:@"contentLimitStartPosition"] intValue]];
- if([spf objectForKey:@"contentViewport"])
- [tableContentInstance setViewportToRestore:NSRectFromString([spf objectForKey:@"contentViewport"])];
- if([spf objectForKey:@"contentFilter"])
- [tableContentInstance setFiltersToRestore:[spf objectForKey:@"contentFilter"]];
+ if([spfSession objectForKey:@"contentSortCol"])
+ [tableContentInstance setSortColumnNameToRestore:[spfSession objectForKey:@"contentSortCol"] isAscending:[[spfSession objectForKey:@"contentSortCol"] boolValue]];
+ if([spfSession objectForKey:@"contentLimitStartPosition"])
+ [tableContentInstance setLimitStartToRestore:[[spfSession objectForKey:@"contentLimitStartPosition"] intValue]];
+ if([spfSession objectForKey:@"contentViewport"])
+ [tableContentInstance setViewportToRestore:NSRectFromString([spfSession objectForKey:@"contentViewport"])];
+ if([spfSession objectForKey:@"contentFilter"])
+ [tableContentInstance setFiltersToRestore:[spfSession objectForKey:@"contentFilter"]];
- [tablesListInstance setContentRequiresReload:YES];
+ // Select table
+ [tablesListInstance selectTableAtIndex:[NSNumber numberWithInt:[tables indexOfObject:[spfSession objectForKey:@"table"]]]];
+ // [tablesListInstance setContentRequiresReload:YES];
+
// Select view
- if ([spHistoryControllerInstance currentlySelectedView] != [[spf objectForKey:@"view"] intValue]) {
- switch ([[spf objectForKey:@"view"] intValue]) {
- case SP_VIEW_STRUCTURE:
- [self viewStructure:self];
- break;
- case SP_VIEW_CONTENT:
- [self viewContent:self];
- break;
- case SP_VIEW_CUSTOMQUERY:
- [self viewQuery:self];
- break;
- case SP_VIEW_STATUS:
- [self viewStatus:self];
- break;
- case SP_VIEW_RELATIONS:
- [self viewRelations:self];
- break;
- }
- if ([spHistoryControllerInstance currentlySelectedView] != [[spf objectForKey:@"view"] intValue]) {
- return;
- }
- }
+ if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_STRUCTURE"])
+ [self viewStructure:self];
+ else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_CONTENT"])
+ [self viewContent:self];
+ else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_CUSTOMQUERY"])
+ [self viewQuery:self];
+ else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_STATUS"])
+ [self viewStatus:self];
+ else if([[spfSession objectForKey:@"view"] isEqualToString:@"SP_VIEW_RELATIONS"])
+ [self viewRelations:self];
- if([spf objectForKey:@"contentSelectedIndexSet"]) {
- NSMutableIndexSet *anIndexSet = [NSMutableIndexSet indexSet];
- NSArray *items = [spf objectForKey:@"contentSelectedIndexSet"];
- unsigned int i;
- for(i=0; i<[items count]; i++)
- {
- [anIndexSet addIndex:(NSUInteger)NSArrayObjectAtIndex(items, i)];
- }
- [tableContentInstance setSelectedRowIndexesToRestore:anIndexSet];
- }
+ [[tablesListInstance valueForKeyPath:@"tablesListView"] scrollRowToVisible:[tables indexOfObject:[spfSession objectForKey:@"selectedTable"]]];
- // dealloc spf data
- [spf release];
- spf = nil;
+ // dealloc spfSession data
+ [spfSession release];
+ spfSession = nil;
}
/*
@@ -481,6 +513,18 @@
description:[NSString stringWithFormat:NSLocalizedString(@"Connected to %@",@"description for connected growl notification"), [tableWindow title]]
notificationName:@"Connected"];
+
+ // Init Custom Query editor with the stored queries in a spf file if given.
+ if(spfSession != nil && [spfSession objectForKey:@"queries"]) {
+ if([[spfSession objectForKey:@"queries"] isKindOfClass:[NSData class]]) {
+ NSString *q = [[NSString alloc] initWithData:[[spfSession objectForKey:@"queries"] decompress] encoding:NSUTF8StringEncoding];
+ [self initQueryEditorWithString:q];
+ [q release];
+ }
+ else
+ [self initQueryEditorWithString:[spfSession objectForKey:@"queries"]];
+ }
+
// Insert queryEditorInitString into the Query Editor if defined
if(queryEditorInitString && [queryEditorInitString length]) {
[self viewQuery:self];
@@ -496,7 +540,7 @@
else
[tableWindow makeFirstResponder:[tablesListInstance valueForKeyPath:@"tablesListView"]];
- if(spf != nil)
+ if(spfSession != nil)
[self restoreSession];
// [self performSelector:@selector(restoreSession) withObject:nil afterDelay:0.3];
@@ -1942,115 +1986,167 @@
[saveConnectionEncryptString abortEditing];
[saveConnectionEncryptString selectText:nil];
+ [self saveSPFtoFile:fileName];
- NSMutableDictionary *spfdata = [NSMutableDictionary dictionary];
+ }
+ }
+}
- NSIndexSet *contentSelectedIndexSet = [tableContentInstance selectedRowIndexes];
+- (void)saveSPFtoFile:(NSString *)fileName
+{
+ NSString *aString;
- [spfdata setObject:[NSNumber numberWithInt:1] forKey:@"version"];
- [spfdata setObject:@"session" forKey:@"format"];
+ NSMutableDictionary *spfdata = [NSMutableDictionary dictionary];
+ NSMutableDictionary *connection = [NSMutableDictionary dictionary];
+ NSMutableDictionary *session = nil;
+ NSMutableDictionary *data = [NSMutableDictionary dictionary];
- [spfdata setObject:[self name] forKey:@"name"];
- [spfdata setObject:[self host] forKey:@"host"];
- [spfdata setObject:[self user] forKey:@"user"];
+ NSIndexSet *contentSelectedIndexSet = [tableContentInstance selectedRowIndexes];
- if([saveConnectionEncrypt isEnabled])
- [spfdata setObject:[NSNumber numberWithInt:[saveConnectionEncrypt state]] forKey:@"encrypted"];
+ [spfdata setObject:[NSNumber numberWithInt:1] forKey:@"version"];
+ [spfdata setObject:@"connection" forKey:@"format"];
+ if([saveConnectionEncrypt isEnabled])
+ [spfdata setObject:[NSNumber numberWithBool:([saveConnectionEncrypt state]==NSOnState) ? YES : NO ] forKey:@"encrypted"];
- [spfdata setObject:[NSNumber numberWithInt:[connectionController type]] forKey:@"connectionType"];
- if([connectionController type] == 2) {
- [spfdata setObject:[connectionController sshHost] forKey:@"sshHost"];
- [spfdata setObject:[connectionController sshUser] forKey:@"sshUser"];
- [spfdata setObject:[connectionController sshPort] forKey:@"sshPort"];
- }
+ if([saveConnectionSavePassword state] == NSOnState)
+ [connection setObject:[NSNumber numberWithBool:([saveConnectionAutoConnect state]==NSOnState) ? YES : NO ] forKey:@"auto_connect"];
- if([saveConnectionSavePassword state] == NSOnState) {
- NSString *pw = [self keychainPasswordForConnection:nil];
- if(![pw length]) pw = [connectionController password];
- if([saveConnectionEncrypt state] == NSOffState) {
- if([pw length])
- [spfdata setObject:[pw dataUsingEncoding:NSUTF8StringEncoding] forKey:@"auth"];
- else
- [spfdata setObject:[NSData data] forKey:@"auth"];
- if([[connectionController sshPassword] length])
- [spfdata setObject:[[connectionController sshPassword] dataUsingEncoding:NSUTF8StringEncoding] forKey:@"sshAuth"];
- else
- [spfdata setObject:[NSData data] forKey:@"sshAuth"];
- } else {
- if([pw length])
- [spfdata setObject:[[pw dataUsingEncoding:NSUTF8StringEncoding] dataEncryptedWithPassword:[saveConnectionEncryptString stringValue]] forKey:@"auth"];
- else
- [spfdata setObject:[NSData data] forKey:@"auth"];
- if([[connectionController sshPassword] length])
- [spfdata setObject:[[[connectionController sshPassword] dataUsingEncoding:NSUTF8StringEncoding] dataEncryptedWithPassword:[saveConnectionEncryptString stringValue]] forKey:@"sshAuth"];
- else
- [spfdata setObject:[NSData data] forKey:@"sshAuth"];
- }
- }
+ [connection setObject:[self name] forKey:@"name"];
+ [connection setObject:[self host] forKey:@"host"];
+ [connection setObject:[self user] forKey:@"user"];
- if([connectionController port] &&[[connectionController port] length])
- [spfdata setObject:[connectionController port] forKey:@"port"];
-
- if([[self database] length])
- [spfdata setObject:[self database] forKey:@"selectedDatabase"];
-
- // Include session data like selected table, view etc. ?
- if([saveConnectionIncludeData state] == NSOnState) {
- if([[self table] length])
- [spfdata setObject:[self table] forKey:@"selectedTable"];
- if([tableContentInstance sortColumnName])
- [spfdata setObject:[tableContentInstance sortColumnName] forKey:@"contentSortCol"];
-
- [spfdata setObject:[NSNumber numberWithInt:[spHistoryControllerInstance currentlySelectedView]] forKey:@"view"];
- [spfdata setObject:[NSNumber numberWithBool:[tableContentInstance sortColumnIsAscending]] forKey:@"contentSortColIsAsc"];
- [spfdata setObject:[NSNumber numberWithInt:[tableContentInstance limitStart]] forKey:@"contentLimitStartPosition"];
- [spfdata setObject:NSStringFromRect([tableContentInstance viewport]) forKey:@"contentViewport"];
- if([tableContentInstance filterSettings])
- [spfdata setObject:[tableContentInstance filterSettings] forKey:@"contentFilter"];
-
- if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length])
- [spfdata setObject:[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] forKey:@"queries"];
-
- if (contentSelectedIndexSet && [contentSelectedIndexSet count]) {
- NSMutableArray *indices = [NSMutableArray array];
- unsigned indexBuffer[[contentSelectedIndexSet count]];
- unsigned limit = [contentSelectedIndexSet getIndexes:indexBuffer maxCount:[contentSelectedIndexSet count] inIndexRange:NULL];
- unsigned idx;
- for (idx = 0; idx < limit; idx++) {
- [indices addObject:[NSNumber numberWithInt:indexBuffer[idx]]];
- }
- [spfdata setObject:indices forKey:@"contentSelectedIndexSet"];
- }
+ switch([connectionController type]) {
+ case SP_CONNECTION_TCPIP:
+ aString = @"SP_CONNECTION_TCPIP";
+ break;
+ case SP_CONNECTION_SOCKET:
+ aString = @"SP_CONNECTION_SOCKET";
+ [connection setObject:[connectionController socket] forKey:@"socket"];
+ break;
+ case SP_CONNECTION_SSHTUNNEL:
+ aString = @"SP_CONNECTION_SSHTUNNEL";
+ [connection setObject:[connectionController sshHost] forKey:@"ssh_host"];
+ [connection setObject:[connectionController sshUser] forKey:@"ssh_user"];
+ if([connectionController port] && [[connectionController port] length])
+ [connection setObject:[NSNumber numberWithInt:[[connectionController sshPort] intValue]] forKey:@"ssh_port"];
+ break;
+ default:
+ aString = @"SP_CONNECTION_TCPIP";
+ }
+ [connection setObject:aString forKey:@"type"];
+
+
+ if([saveConnectionSavePassword state] == NSOnState) {
+ NSString *pw = [self keychainPasswordForConnection:nil];
+ if(![pw length]) pw = [connectionController password];
+ [connection setObject:pw forKey:@"password"];
+ if([connectionController type] == SP_CONNECTION_SSHTUNNEL)
+ [connection setObject:[connectionController sshPassword] forKey:@"ssh_password"];
+ }
+
+ if([connectionController port] && [[connectionController port] length])
+ [connection setObject:[NSNumber numberWithInt:[[connectionController port] intValue]] forKey:@"port"];
+
+ if([[self database] length])
+ [connection setObject:[self database] forKey:@"database"];
+
+ // Include session data like selected table, view etc. ?
+ if([saveConnectionIncludeData state] == NSOnState) {
+
+ session = [NSMutableDictionary dictionary];
+
+ if([[self table] length])
+ [session setObject:[self table] forKey:@"table"];
+ if([tableContentInstance sortColumnName])
+ [session setObject:[tableContentInstance sortColumnName] forKey:@"contentSortCol"];
+
+ switch([spHistoryControllerInstance currentlySelectedView]){
+ case SP_VIEW_STRUCTURE:
+ aString = @"SP_VIEW_STRUCTURE";
+ break;
+ case SP_VIEW_CONTENT:
+ aString = @"SP_VIEW_CONTENT";
+ break;
+ case SP_VIEW_CUSTOMQUERY:
+ aString = @"SP_VIEW_CUSTOMQUERY";
+ break;
+ case SP_VIEW_STATUS:
+ aString = @"SP_VIEW_STATUS";
+ break;
+ case SP_VIEW_RELATIONS:
+ aString = @"SP_VIEW_RELATIONS";
+ break;
+ default:
+ aString = @"SP_VIEW_STRUCTURE";
}
+ [session setObject:aString forKey:@"view"];
- NSString *err = nil;
- NSData *plist = [NSPropertyListSerialization dataFromPropertyList:spfdata
- format:NSPropertyListBinaryFormat_v1_0
- errorDescription:&err];
-
- if(err != nil) {
- NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while converting connection data", @"error while converting connection data")]
- defaultButton:NSLocalizedString(@"OK", @"OK button")
- alternateButton:nil
- otherButton:nil
- informativeTextWithFormat:err];
-
- [alert setAlertStyle:NSCriticalAlertStyle];
- [alert runModal];
- return;
+ [session setObject:[NSNumber numberWithBool:[tableContentInstance sortColumnIsAscending]] forKey:@"contentSortColIsAsc"];
+ [session setObject:[NSNumber numberWithInt:[tableContentInstance limitStart]] forKey:@"contentLimitStartPosition"];
+ [session setObject:NSStringFromRect([tableContentInstance viewport]) forKey:@"contentViewport"];
+ if([tableContentInstance filterSettings])
+ [session setObject:[tableContentInstance filterSettings] forKey:@"contentFilter"];
+
+ if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length])
+ if([[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] length] > 50000)
+ [session setObject:[[[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] dataUsingEncoding:NSUTF8StringEncoding] compress] forKey:@"queries"];
+ else
+ [session setObject:[[[customQueryInstance valueForKeyPath:@"textView"] textStorage] string] forKey:@"queries"];
+ if (contentSelectedIndexSet && [contentSelectedIndexSet count]) {
+ NSMutableArray *indices = [NSMutableArray array];
+ unsigned indexBuffer[[contentSelectedIndexSet count]];
+ unsigned limit = [contentSelectedIndexSet getIndexes:indexBuffer maxCount:[contentSelectedIndexSet count] inIndexRange:NULL];
+ unsigned idx;
+ for (idx = 0; idx < limit; idx++) {
+ [indices addObject:[NSNumber numberWithInt:indexBuffer[idx]]];
+ }
+ [session setObject:indices forKey:@"contentSelectedIndexSet"];
}
+ }
+
- NSError *error = nil;
- [[plist compress] writeToFile:fileName options:NSAtomicWrite error:&error];
- if(error != nil){
- NSAlert *errorAlert = [NSAlert alertWithError:error];
- [errorAlert runModal];
- return;
- }
+ [data setObject:connection forKey:@"connection"];
+ if(session != nil)
+ [data setObject:session forKey:@"session"];
+
+ if([saveConnectionEncrypt state] == NSOffState) {
+ [spfdata setObject:data forKey:@"data"];
+ } else {
+ NSMutableData *encryptdata = [[[NSMutableData alloc] init] autorelease];
+ NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:encryptdata] autorelease];
+ [archiver encodeObject:data forKey:@"data"];
+ [archiver finishEncoding];
+ [spfdata setObject:[encryptdata dataEncryptedWithPassword:[saveConnectionEncryptString stringValue]] forKey:@"data"];
+ }
+
+ // NSLog(@"%@", spfdata);
+
+ NSString *err = nil;
+ NSData *plist = [NSPropertyListSerialization dataFromPropertyList:spfdata
+ format:NSPropertyListXMLFormat_v1_0
+ errorDescription:&err];
+
+ if(err != nil) {
+ NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while converting connection data", @"error while converting connection data")]
+ defaultButton:NSLocalizedString(@"OK", @"OK button")
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:err];
+
+ [alert setAlertStyle:NSCriticalAlertStyle];
+ [alert runModal];
return;
}
- }
+
+ NSError *error = nil;
+ [plist writeToFile:fileName options:NSAtomicWrite error:&error];
+ if(error != nil){
+ NSAlert *errorAlert = [NSAlert alertWithError:error];
+ [errorAlert runModal];
+ }
+
}
+
/**
* Passes the request to the tableDump object
*/
@@ -2850,7 +2946,7 @@
if (mySQLVersion) [mySQLVersion release];
[allDatabases release];
if(queryEditorInitString) [queryEditorInitString release];
- if(spf) [spf release];
+ if(spfSession) [spfSession release];
if(userManagerInstance) [userManagerInstance release];
[super dealloc];
}
n1420'>1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627