diff options
186 files changed, 19017 insertions, 23446 deletions
diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPAttribute.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPAttribute.h deleted file mode 100644 index 469d0808..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPAttribute.h +++ /dev/null @@ -1,106 +0,0 @@ -// -// $Id$ -// -// MCPAttribute.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -@class MCPModel; -@class MCPClassDescription; -@class MCPRelation; -@class MCPJoin; - -@interface MCPAttribute : NSObject < NSCoding > -{ -@protected - MCPClassDescription *classDescription; // ClassDescription of which the attribute is attribute - NSString *name; // Name of the attribute (Obj-C side) - Class valueClass; // Class used by the attribute (or NULL if the internal type is not an object) - NSString *internalType; // Name of the class, or type used for the class definition - NSString *externalName; // Name of the corresponding column in the DB - NSString *externalType; // Type used to store the attribute (in the DB) - NSUInteger width; // Width (for storing by the DB) - BOOL allowsNull; // Attribute can be null - BOOL autoGenerated; // Attribute is auto generated by the DB - BOOL isPartOfKey; // Attribute is part of theprimary key of the class description - BOOL isPartOfIdentity; // Attribute is part of the idclass description of the class description - BOOL hasAccessor; // Does this attribute have an accessor - id defaultValue; // Default value of the attribute - NSMutableArray *joins; // An array of the joins using this attribute -} - -#pragma mark Class methods -+ (void) initialize; - -#pragma mark Life cycle -- (id) initForClassDescription:(MCPClassDescription *) iClassDescription withName:(NSString *) iName; -- (void) dealloc; - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder; -- (void) encodeWithCoder:(NSCoder *) encoder; - -#pragma mark Setters -- (void) setName:(NSString *) iName; -- (void) setValueClass:(Class) iValueClass; -- (void) setInternalType:(NSString *) iInternalType; -- (void) setExternalType:(NSString *) iExternalType; -- (void) setExternalName:(NSString *) iExternalName; -- (void) setWidth:(NSUInteger) iWidth; -- (void) setAllowsNull:(BOOL) iAllowsNull; -- (void) setAutoGenerated:(BOOL) iAutoGenerated; -- (void) setIsPartOfKey:(BOOL) iIsPartOfKey; -- (void) setIsPartOfIdentity:(BOOL) iIsPartOfIdentity; -- (void) setHasAccessor:(BOOL) iHasAccessor; -- (void) setDefaultValue:(id) iDefaultValue; -- (void) insertObject:(MCPJoin *) iJoin inJoinsAtIndex:(NSUInteger) index; -- (void) removeObjectFromJoinsAtIndex:(NSUInteger) index; -//- (void) addRelation:(MCPRelation *) iRelation; -//- (void) removeRelation:(MCPRelation *) iRelation; - -#pragma mark Getters -- (MCPClassDescription *) classDescription; -- (NSString *) name; -- (Class) valueClass; -- (NSString *) valueClassName; -- (NSString *) internalType; -- (NSString *) externalName; -- (NSString *) externalType; -- (NSUInteger) width; -- (BOOL) allowsNull; -- (BOOL) autoGenerated; -- (BOOL) isPartOfKey; -- (BOOL) isPartOfIdentity; -- (BOOL) hasAccessor; -- (id) defaultValue; -- (NSUInteger) countOfJoins; -- (MCPJoin *) objectInJoinsAtIndex:(NSUInteger) index; -- (NSUInteger) indexOfJoinIdenticalTo:(id) iJoin; - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPAttribute.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPAttribute.m deleted file mode 100644 index 085c1114..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPAttribute.m +++ /dev/null @@ -1,466 +0,0 @@ -// -// $Id$ -// -// MCPAttribute.m -// MCPkit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPAttribute.h" - -#import "MCPEntrepriseNotifications.h" - -#import "MCPModel.h" -#import "MCPClassDescription.h" -#import "MCPRelation.h" -#import "MCPJoin.h" - -static NSArray *MCPRecognisedInternalType; - -@interface MCPAttribute (Private) - -- (void)setValueClassName:(NSString *) iClassName; - -@end - -@implementation MCPAttribute - -#pragma mark Class methods -+ (void) initialize -{ - if (self == [MCPAttribute class]) { - [self setVersion:010101]; // Ma.Mi.Re -> MaMiRe - MCPRecognisedInternalType = [[NSArray alloc] initWithObjects:@"NSCalendarDate", @"NSData", @"NSNumber", @"NSString", nil]; - [self setKeys:[NSArray arrayWithObject:@"internalType"] triggerChangeNotificationsForDependentKey:@"valueClassName"]; - [self setKeys:[NSArray arrayWithObject:@"valueClassName"] triggerChangeNotificationsForDependentKey:@"internalType"]; - } - return; -} - - -#pragma mark Life cycle -- (id) initForClassDescription:(MCPClassDescription *) iClassDescription withName:(NSString *) iName -{ - self = [super init]; - { - classDescription = iClassDescription; - [self setName:iName]; -// relations = (NSMutableArray *)(CFArrayCreateMutable (kCFAllocatorDefault, 0, NULL)); - joins = [[NSMutableArray alloc] init]; - } - return self; -} - -- (void) dealloc -{ -// NSArray *theRelations; -// unsigned int i; - - [name release]; - [internalType release]; - [externalName release]; - [externalType release]; - [defaultValue release]; -/* - while ([relations count]) { - [(MCPRelation *)[relations objectAtIndex:0] unjoinAttribute:self]; - } -// By now relation should be empty anyway... - [relations release]; - */ - while ([joins count]) { - [[self objectInJoinsAtIndex:0] invalidate]; - } - // By now the joins array should be empty - [joins release]; - [super dealloc]; -} - - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder -{ - self = [super init]; - if ((self) && ([decoder allowsKeyedCoding])) { - NSString *theClassName = [decoder decodeObjectForKey:@"MCPvalueClassName"]; - - classDescription = [decoder decodeObjectForKey:@"MCPclassDescription"]; - [self setName:[decoder decodeObjectForKey:@"MCPname"]]; - if (theClassName) { - [self setValueClass:NSClassFromString(theClassName)]; - } - [self setInternalType:[decoder decodeObjectForKey:@"MCPinternalType"]]; - [self setExternalName:[decoder decodeObjectForKey:@"MCPexternalName"]]; - [self setExternalType:[decoder decodeObjectForKey:@"MCPexternalType"]]; - [self setWidth:(NSUInteger)[decoder decodeInt32ForKey:@"MCPwidth"]]; - [self setAllowsNull:[decoder decodeBoolForKey:@"MCPallowsNull"]]; - [self setAutoGenerated:[decoder decodeBoolForKey:@"MCPautoGenerated"]]; - [self setIsPartOfKey:[decoder decodeBoolForKey:@"MCPisPartOfKey"]]; - [self setIsPartOfIdentity:[decoder decodeBoolForKey:@"MCPisPartOfIdentity"]]; - [self setHasAccessor:[decoder decodeBoolForKey:@"MCPhasAccessor"]]; - [self setDefaultValue:[decoder decodeObjectForKey:@"MCPdefaultValue"]]; -// Not sure that the next line is working (getting an array holding weak references), hence doing the thing expelcitly: -// relations = [[decoder decodeObjectForKey:@"MCPrelations"] retain]; -// relations = (NSMutableArray *)(CFArrayCreateMutable (kCFAllocatorDefault, 0, NULL)); -// [relations addObjectsFromArray:[decoder decodeObjectForKey:@"MCPrelations"]]; - joins = [[NSMutableArray alloc] init]; // Will be filled in when the relations are read in. - } - else { - NSLog(@"For some reason, unable to decode MCPAttribute from the coder!!!"); - } -// NSLog(@"MAKING a new object : %@", self); - return self; -} - -- (void) encodeWithCoder:(NSCoder *) encoder -{ - NSString *theValueClassName; - - if (! [encoder allowsKeyedCoding]) { - NSLog(@"In MCPAttribute -encodeWithCoder : Unable to encode to a non-keyed encoder!!, will not perform encoding!!"); - return; - } -// theValueClassName = (valueClass) ? [valueClass className] : nil; - theValueClassName = (valueClass) ? NSStringFromClass(valueClass) : nil; - [encoder encodeObject:[self classDescription] forKey:@"MCPclassDescription"]; - [encoder encodeObject:[self name] forKey:@"MCPname"]; - if (theValueClassName) { - [encoder encodeObject:theValueClassName forKey:@"MCPvalueClassName"]; - } - [encoder encodeObject:[self internalType] forKey:@"MCPinternalType"]; - [encoder encodeObject:[self externalName] forKey:@"MCPexternalName"]; - [encoder encodeObject:[self externalType] forKey:@"MCPexternalType"]; - [encoder encodeInt32:(int32_t)[self width] forKey:@"MCPwidth"]; - [encoder encodeBool:[self allowsNull] forKey:@"MCPallowsNull"]; - [encoder encodeBool:[self autoGenerated] forKey:@"MCPautoGenerated"]; - [encoder encodeBool:[self isPartOfKey] forKey:@"MCPisPartOfKey"]; - [encoder encodeBool:[self isPartOfIdentity] forKey:@"MCPisPartOfIdentity"]; - [encoder encodeBool:[self hasAccessor] forKey:@"MCPhasAccessor"]; - [encoder encodeObject:[self defaultValue] forKey:@"MCPdefaultValue"]; -// [encoder encodeObject:relations forKey:@"MCPrelation"]; - // We don't have to save the joins here ... the joins are saving there attributes. - // The links are recreated when the joins are decoded. -} - -#pragma mark Setters -- (void) setName:(NSString *) iName -{ - if (iName != name) { - [name release]; - name = [iName retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setValueClass:(Class) iValueClass -{ - if (iValueClass != valueClass) { - valueClass = iValueClass; - if (valueClass) { // Not nil : set the internalType accrodingly. - // [internalType release]; - // internalType = [[valueClass className] copy]; -// [self setValue:[NSString stringWithString:[valueClass className]] forKey:@"internalType"]; - [self setValue:[NSString stringWithString:NSStringFromClass(valueClass)] forKey:@"internalType"]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setInternalType:(NSString *) iInternalType -{ - if (iInternalType != internalType) { - [internalType release]; - internalType = [iInternalType retain]; - if ([MCPRecognisedInternalType containsObject:internalType]) { - [self setValueClass:NSClassFromString(internalType)]; -// By itself does NOT provide observers the update. -// but see setKeys:triggerChangeNotificationsForDependentKey... (in +initialize). - } - else { - [self setValueClass:nil]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setExternalType:(NSString *) iExternalType -{ - if (iExternalType != externalType) { - [externalType release]; - externalType = [iExternalType retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setExternalName:(NSString *) iExternalName -{ - if (iExternalName != externalName) { - [externalName release]; - externalName = [iExternalName retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setWidth:(NSUInteger) iWidth -{ - if (iWidth != width) { - width = iWidth; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setAllowsNull:(BOOL) iAllowsNull -{ - if (iAllowsNull != allowsNull) { - allowsNull = iAllowsNull; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setAutoGenerated:(BOOL) iAutoGenerated -{ - if (iAutoGenerated != autoGenerated) { - autoGenerated = iAutoGenerated; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setIsPartOfKey:(BOOL) iIsPartOfKey -{ - if (iIsPartOfKey != isPartOfKey) { - isPartOfKey = iIsPartOfKey; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setIsPartOfIdentity:(BOOL) iIsPartOfIdentity -{ - if (iIsPartOfIdentity != isPartOfIdentity) { - isPartOfIdentity = iIsPartOfIdentity; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setHasAccessor:(BOOL) iHasAccessor -{ - if (iHasAccessor != hasAccessor) { - hasAccessor = iHasAccessor; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) setDefaultValue:(id) iDefaultValue -{ - if (iDefaultValue != defaultValue) { - [defaultValue release]; - defaultValue = [iDefaultValue retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[classDescription model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:classDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPAttributeChangedNotification object:self]; - } -} - -- (void) insertObject:(MCPJoin *) iJoin inJoinsAtIndex:(NSUInteger) index -{ - [joins insertObject:iJoin atIndex:index]; -} - -- (void) removeObjectFromJoinsAtIndex:(NSUInteger) index -{ - [joins removeObjectAtIndex:index]; -} - -/* -- (void) addRelation:(MCPRelation *) iRelation -{ -// Following implementation make sure that a given relation is only added once... but I don't see the reason for that to be true. - /* if (NSNotFound == [relations indexOfObjectIdenticalTo:iRelation]) { - [relations addObject:iRelation]; - } - *//* - [relations addObject:iRelation]; -} - -- (void) removeRelation:(MCPRelation *) iRelation -{ -// Following implementation needs only one reference to a given relation to be working properly (not true) -// [relations removeObjectIdenticalTo:iRelation]; - unsigned int i; - - i = [relations indexOfObjectIdenticalTo:iRelation]; - if (NSNotFound != i) { - [relations removeObjectAtIndex:i]; - } -// If the relation is there more than once, remove it only once. -} -*/ - -#pragma mark Getters -- (MCPClassDescription *) classDescription -{ - return classDescription; -} - -- (NSString *) name -{ - return name; -} - -- (Class) valueClass -{ - return valueClass; -} - -- (NSString *) valueClassName -{ - return NSStringFromClass(valueClass); -} - -- (NSString *) internalType -{ - return internalType; -} - -- (NSString *) externalName -{ - return externalName; -} - -- (NSString *) externalType -{ - return externalType; -} - -- (NSUInteger) width -{ - return width; -} - -- (BOOL) allowsNull -{ - return allowsNull; -} - -- (BOOL) autoGenerated -{ - return autoGenerated; -} - -- (BOOL) isPartOfKey -{ - return isPartOfKey; -} - -- (BOOL) isPartOfIdentity -{ - return isPartOfIdentity; -} - -- (BOOL) hasAccessor -{ - return hasAccessor; -} - -- (id) defaultValue -{ - return defaultValue; -} - -- (NSUInteger) countOfJoins -{ - return [joins count]; -} - -- (MCPJoin *) objectInJoinsAtIndex:(NSUInteger) index -{ - return (MCPJoin *)((NSNotFound != index) ? [joins objectAtIndex:index] : nil); -} - -- (NSUInteger) indexOfJoinIdenticalTo:(id) iJoin -{ - return [joins indexOfObjectIdenticalTo:iJoin]; -} - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject -// Equal to another attribute, if they have the same name and same class description. -// Equal to a string (NSString), if the name of the attribute is equal to the string. -{ - if ([iObject isKindOfClass:[MCPAttribute class]]) { - MCPAttribute *theAttribute = (MCPAttribute *) iObject; - - return ([name isEqualToString:[theAttribute name]]) && ([classDescription isEqual:[theAttribute classDescription]]); - } - if ([iObject isKindOfClass:[NSString class]]) { - return [name isEqualToString:(NSString *)iObject]; - } - return NO; -} - -#pragma mark For debugging the retain counting -- (id) retain -{ - [super retain]; - return self; -} - -- (void) release -{ - [super release]; - return; -} - -@end - -@implementation MCPAttribute (Private) - -- (void)setValueClassName:(NSString *) iClassName -{ - if (NSClassFromString(iClassName) != valueClass) { - [self setValueClass:NSClassFromString(iClassName)]; - } -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+MCPEntreprise.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+MCPEntreprise.h deleted file mode 100644 index 052eeadb..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+MCPEntreprise.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// $Id$ -// -// MCPClassDescription+MCPEntreprise.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 01/11/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> -#import "MCPClassDescription.h" - -@interface MCPClassDescription (MCPEntreprise) - -#pragma mark Pseudo getters (for NSClassDescription overload) -- (NSArray *) attributeKeys; -- (NSString *) inverseRelationshipKey:(NSString *) relationshipKey; -- (NSArray *) toManyRelationshipKeys; -- (NSArray *) toOneRelationshipKeys; - -#pragma mark Specifics for MCPObject -- (NSArray *) primaryKeyAttributes; -- (NSArray *) identityAttributes; -- (MCPAttribute *) attributeWithName: (NSString *) iName; -- (MCPRelation *) relationWithName:(NSString *) iRelationName; -- (BOOL) singleIntAutoGenKey; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+MCPEntreprise.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+MCPEntreprise.m deleted file mode 100644 index 71a25911..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+MCPEntreprise.m +++ /dev/null @@ -1,186 +0,0 @@ -// -// $Id$ -// -// MCPClassDescription+MCPEntreprise.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 01/11/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPClassDescription+MCPEntreprise.h" - -#import "MCPAttribute.h" -#import "MCPRelation.h" - -@implementation MCPClassDescription (MCPEntreprise) - -#pragma mark Pseudo getters (for NSClassDescription overload) -- (NSArray *) attributeKeys -{ - NSArray *theRet; - NSMutableArray *theKeys =[[NSMutableArray alloc] init]; - NSUInteger i; - - for (i=0; i != [self countOfAttributes]; ++i) { - [theKeys insertObject:[(MCPAttribute *)[self objectInAttributesAtIndex:i] name] atIndex:i]; - } - theRet = [NSArray arrayWithArray:theKeys]; - [theKeys release]; - return theRet; -} - -- (NSString *) inverseRelationshipKey:(NSString *) relationshipKey -{ - NSUInteger index = [self indexOfRelation:relationshipKey]; - - if (NSNotFound != index) { - MCPRelation *theRelation; - - theRelation = (MCPRelation *)[self objectInRelationsAtIndex:index]; - return [[theRelation inverseRelation] name]; - } - return nil; -} - -- (NSArray *) toManyRelationshipKeys -{ - NSArray *theRet; - NSMutableArray *theToManyRel = [[NSMutableArray alloc] init]; - NSUInteger i, j; - - j=0; - for (i=0; i != [self countOfRelations]; ++i) { - MCPRelation *theRelation = (MCPRelation *)[self objectInRelationsAtIndex:i]; - - if ([theRelation isToMany]) { - [theToManyRel insertObject:[theRelation name] atIndex:j]; - ++j; - } - } - theRet = [NSArray arrayWithArray:theToManyRel]; - [theToManyRel release]; - return theRet; -} - -- (NSArray *) toOneRelationshipKeys; -{ - NSArray *theRet; - NSMutableArray *theToOneRel = [[NSMutableArray alloc] init]; - NSUInteger i, j; - - j=0; - for (i=0; i != [self countOfRelations]; ++i) { - MCPRelation *theRelation = (MCPRelation *)[self objectInRelationsAtIndex:i]; - - if (! [theRelation isToMany]) { - [theToOneRel insertObject:[theRelation name] atIndex:j]; - ++j; - } - } - theRet = [NSArray arrayWithArray:theToOneRel]; - [theToOneRel release]; - return theRet; -} - -#pragma mark Specifics for MCPObject -- (NSArray *) primaryKeyAttributes -{ - NSMutableArray *theRet = [NSMutableArray array]; - NSUInteger i, j; - - j = 0; - for (i=0; i != [self countOfAttributes]; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *)[self objectInAttributesAtIndex:i]; - - if ([theAttribute isPartOfKey]) { - [theRet insertObject:theAttribute atIndex:j]; - ++j; - } - } - return (NSArray *)theRet; -} - -- (NSArray *) identityAttributes -{ - NSMutableArray *theRet = [NSMutableArray array]; - NSUInteger i, j; - - j = 0; - for (i=0; i != [self countOfAttributes]; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *)[self objectInAttributesAtIndex:i]; - - if ([theAttribute isPartOfIdentity]) { - [theRet insertObject:theAttribute atIndex:j]; - ++j; - } - } - return (NSArray *)theRet; -} - -- (MCPAttribute *) attributeWithName: (NSString *) iName -{ -// This type of implementation is NOT working : most likely the isEqual method is called on iName rather than on the objects of the array -/* - unsigned int index = [self indexOfAttribute:iName]; - - return (NSNotFound != index) ? (MCPAttribute *)[self objectInAttributesAtIndex:index] : nil ; -*/ - NSUInteger i; - - for (i = 0; [attributes count] != i; ++i) { - if ([[(MCPAttribute *)[attributes objectAtIndex:i] name] isEqualToString:iName]) { - return (MCPAttribute *)[attributes objectAtIndex:i]; - } - } - return nil; -} - -- (MCPRelation *) relationWithName:(NSString *) iRelationName -{ -// This type of implementation is NOT working : most likely the isEqual method is called on iName rather than on the objects of the array -/* unsigned int index = [relations indexOfObject:iRelationName]; - - return (NSNotFound != index) ? (MCPRelation *)[relations objectAtIndex:index] : nil; -*/ - NSUInteger i; - - for (i = 0; [relations count] != i; ++i) { - if ([[(MCPRelation *)[relations objectAtIndex:i] name] isEqualToString:iRelationName]) { - return (MCPRelation *)[relations objectAtIndex:i]; - } - } - return nil; -} - -- (BOOL) singleIntAutoGenKey -{ - NSArray *theKeys = [self primaryKeyAttributes]; - - if (1 == [theKeys count]) { - MCPAttribute *theSingleKey = (MCPAttribute *)[theKeys objectAtIndex:0]; - - return [theSingleKey autoGenerated] && [[theSingleKey externalType] isEqualToString:@"INT"]; - } - return NO; -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+Private.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+Private.h deleted file mode 100644 index df86b763..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription+Private.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// $Id$ -// -// MCPClassDescription+Private.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPClassDescription.h" - -@interface MCPClassDescription (Private) - -#pragma mark Setters -- (void) setAttributes:(NSArray *) iAttributes; -- (void) setRelations:(NSArray *) iRelations; -- (void) insertObject:(MCPRelation *) iRelation inIncomingsAtIndex:(NSUInteger) index; -- (void) removeObjectFromIncomingsAtIndex:(NSUInteger) index; - -#pragma mark Getters -- (NSArray *) incomings; -- (NSUInteger) countOfIncomings; -- (MCPRelation *) objectInIncomingsAtIndex:(NSUInteger) index; -- (NSUInteger) indexOfIncoming:(id) iRelation; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription.h deleted file mode 100644 index cff3cf17..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription.h +++ /dev/null @@ -1,93 +0,0 @@ -// -// $Id$ -// -// MCPClassDescription.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -@class MCPModel; -@class MCPAttribute; -@class MCPRelation; -@class MCPRelation; - -@interface MCPClassDescription : NSClassDescription <NSCoding> -{ -@protected - MCPModel *model; // The model where we stand - NSString *name; // Name of the class (can not use className, as it is already used by NSObject). - NSString *externalName; // Name of the table for storage - NSMutableArray *attributes; // array of the attributes of the class description - NSMutableArray *relations; // array of the relations of the class description (both origin and destination) - NSMutableArray *incomings; // array if the INCOMMING relation (just to be sure we are able to invalidate those if necessary) - Class representedClass; // the class object that the description represents. -} - -// This correspond to the method singleIntAutoGenKey in the category MCPEntreprise... which name should I change... - -#pragma mark Class methods -+ (void) initialize; - -#pragma mark Life cycle -- (id) initInModel:(MCPModel *) iModel withName:(NSString *) iName; -- (void) dealloc; - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder; -- (void) encodeWithCoder:(NSCoder *) encoder; - -#pragma mark Making new attributes and relations -- (MCPAttribute *) addNewAttributeWithName:(NSString *) iName inPosition:(NSInteger) index; -- (MCPRelation *) addNewRelationTo:(MCPClassDescription *) iTo name:(NSString *) iName inPostion:(NSInteger) index; - -#pragma mark Setters -- (void) setName:(NSString *) iName; -- (void) setExternalName:(NSString *) iExternalName; -- (void) insertObject:(MCPAttribute *) iAttribute inAttributesAtIndex:(NSUInteger) index; -- (void) removeObjectFromAttributesAtIndex:(NSUInteger) index; -- (void) insertObject:(MCPRelation *) iRelation inRelationsAtIndex:(NSUInteger) index; -- (void) removeObjectFromRelationsAtIndex:(NSUInteger) index; - -#pragma mark Getters -- (MCPModel *) model; -- (NSString *) name; -- (NSString *) externalName; -- (NSArray *) attributes; -- (NSUInteger) countOfAttributes; -- (MCPAttribute *) objectInAttributesAtIndex:(NSUInteger) index; -- (NSUInteger) indexOfAttribute:(id) iAttribute; -- (NSArray *) relations; -- (NSUInteger) countOfRelations; -- (MCPRelation *) objectInRelationsAtIndex:(NSUInteger) index; -- (NSUInteger) indexOfRelation:(id) iRelation; -- (Class) representedClass; - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject; - -#pragma mark Output for logging -- (NSString *) descriptionWithLocale:(NSDictionary *) locale; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription.m deleted file mode 100644 index 9f2ad18d..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPClassDescription.m +++ /dev/null @@ -1,373 +0,0 @@ -// -// $Id$ -// -// MCPClassDescription.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPClassDescription.h" -#import "MCPClassDescription+Private.h" - -#import "MCPEntrepriseNotifications.h" - -#import "MCPModel.h" -#import "MCPAttribute.h" -#import "MCPRelation.h" - -@implementation MCPClassDescription - -#pragma mark Class methods -+ (void) initialize -{ - if (self = [MCPClassDescription class]) { - [self setVersion:010101]; // Major.Minor.Revision -> MaMiRe - } - return; -} - -#pragma mark Life cycle -- (id) initInModel:(MCPModel *) iModel withName:(NSString *) iName -{ - self = [super init]; - if (self) { - model = iModel; - [self setName:iName]; - attributes = [[NSMutableArray alloc] init]; - relations = [[NSMutableArray alloc] init]; - incomings = [[NSMutableArray alloc] init]; - representedClass = nil; - // NSLog(@"MAKING a new object : %@", self); - } - return self; -} - -- (void) dealloc -{ -// NSArray *theRelations; -// unsigned int i; - - [name release]; - [externalName release]; - [attributes release]; - while ([relations count]) { - [(MCPRelation *)[relations objectAtIndex:0] invalidateRelation]; - } - [relations release]; - while ([incomings count]) { - [(MCPRelation *)[incomings objectAtIndex:0] invalidateRelation]; - } - [incomings release]; - [super dealloc]; -} - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder -{ - self = [super init]; - if ((self) && ([decoder allowsKeyedCoding])) { - model = [decoder decodeObjectForKey:@"MCPmodel"]; -// NSLog(@"in MCPClassDescription initWithCoder, model = %@ (pointer = %p)", model, model); - [self setName:[decoder decodeObjectForKey:@"MCPname"]]; - [self setExternalName:[decoder decodeObjectForKey:@"MCPexternalName"]]; - [self setAttributes:[decoder decodeObjectForKey:@"MCPattributes"]]; -// [self setRelations:[decoder decodeObjectForKey:@"MCPrelations"]]; - relations = [[NSMutableArray alloc] init]; - incomings = [[NSMutableArray alloc] init]; - representedClass = nil; - [decoder decodeObjectForKey:@"MCPrelations"]; // The relation get linked properly while initted. - } - else { - NSLog(@"For some reason, unable to decode MCPClassDescription from the coder!!!"); - } - - return self; -} - -- (void) encodeWithCoder:(NSCoder *) encoder -{ - if (! [encoder allowsKeyedCoding]) { - NSLog(@"In MCPClassDescription -encodeWithCoder : Unable to encode to a non-keyed encoder!!, will not perform encoding!!"); - return; - } -// [encoder encodeObject:[self model] forKey:@"MCPmodel"]; - [encoder encodeConditionalObject:[self model] forKey:@"MCPmodel"]; - [encoder encodeObject:[self name] forKey:@"MCPname"]; - [encoder encodeObject:[self externalName] forKey:@"MCPexternalName"]; - [encoder encodeObject:[self attributes] forKey:@"MCPattributes"]; - [encoder encodeObject:[self relations] forKey:@"MCPrelations"]; - [encoder encodeObject:@"1.1.1" forKey:@"MCPversion"]; - return; -} - -#pragma mark Making new attributes and relations -- (MCPAttribute *) addNewAttributeWithName:(NSString *) iName inPosition:(NSInteger) index -{ - MCPAttribute *theAttribute = [[MCPAttribute alloc] initForClassDescription:self withName:iName]; - -// [self addAttribute:theAttribute]; - [self insertObject:theAttribute inAttributesAtIndex:(index < 0) ? ([self countOfAttributes] + index + 1) : index]; - [theAttribute release]; - return theAttribute; -} - -- (MCPRelation *) addNewRelationTo:(MCPClassDescription *) iTo name:(NSString *) iName inPostion:(NSInteger) index -{ - MCPRelation *theRelation = [[MCPRelation alloc] initWithName:iName from:self to:iTo]; - - [theRelation release]; - return theRelation; -} - -#pragma mark Setters -- (void) setName:(NSString *) iName -{ - if (iName != name) { - [name release]; - name = [iName retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; - representedClass = nil; - } -} - -- (void) setExternalName:(NSString *) iExternalName -{ - if (iExternalName != externalName) { - [externalName release]; - externalName = [iExternalName retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; - } -} - -- (void) insertObject:(MCPAttribute *) iAttribute inAttributesAtIndex:(NSUInteger) index -{ - [attributes insertObject:iAttribute atIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; -} - -- (void) removeObjectFromAttributesAtIndex:(NSUInteger) index -{ - [attributes removeObjectAtIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; -} - -- (void) insertObject:(MCPRelation *) iRelation inRelationsAtIndex:(NSUInteger) index -{ - [relations insertObject:iRelation atIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; -} - -- (void) removeObjectFromRelationsAtIndex:(NSUInteger) index -{ - [relations removeObjectAtIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; -} - -#pragma mark Getters -- (MCPModel *) model -{ - return model; -} - -- (NSString *) name -{ - return name; -} - -- (NSString *) externalName -{ - return externalName; -} - -- (NSArray *) attributes -{ - return [NSArray arrayWithArray:attributes]; -} - -- (NSUInteger) countOfAttributes -{ - return [attributes count]; -} - -- (MCPAttribute *) objectInAttributesAtIndex:(NSUInteger) index -{ - return (MCPAttribute *)((NSNotFound != index) ? [attributes objectAtIndex:index] : nil); -} - -- (NSUInteger) indexOfAttribute:(id) iAttribute -{ - return [attributes indexOfObject:iAttribute]; -} - -- (NSArray *) relations -{ - return [NSArray arrayWithArray:relations]; -} - -- (NSUInteger) countOfRelations -{ - return [relations count]; -} - -- (MCPRelation *) objectInRelationsAtIndex:(NSUInteger) index -{ - return (MCPRelation *)((NSNotFound != index) ? [relations objectAtIndex:index] : nil); -} - -- (NSUInteger) indexOfRelation:(id) iRelation -{ - return [relations indexOfObject:iRelation]; -} - -- (Class) representedClass -{ - if (representedClass) { - return representedClass; - } - representedClass = NSClassFromString(name); - return representedClass; -} - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject -// Equal to another class description if they have the same name. -// Equal to a string if the string is equal to the className of the class description. -{ - if ([iObject isKindOfClass:[MCPClassDescription class]]) { - return [name isEqualToString:[(MCPClassDescription *)iObject name]]; - } - if ([iObject isKindOfClass:[NSString class]]) { - return [name isEqualToString:(NSString *)iObject]; - } - return NO; -} - -/* -- (NSString *) description -{ - return [NSString stringWithFormat:@"<MCPClassDescription for class named %@ : %p>", [self name], self]; -} - -- (NSString *) descriptionWithLocale:(NSDictionary *) locale -{ - return [self description]; -} -*/ - -#pragma mark Output for logging - -- (NSString *)descriptionWithLocale:(NSDictionary *) locale -{ - NSUInteger i; - NSMutableString *theOutput = [NSMutableString string]; - - [theOutput appendFormat:@"MCPClassDescription for class : %@ (table : %@)\n", [self name], [self externalName]]; - for (i=0; [attributes count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *) [attributes objectAtIndex:i]; - - [theOutput appendFormat:@"attribute %u, name = %@, column = %@. Allows null : %c\n", i, [theAttribute name], [theAttribute externalName], ([theAttribute allowsNull] ? 'Y' : 'N')]; - } - return theOutput; -} - -#pragma mark For debugging the retain counting -- (id) retain -{ - [super retain]; - return self; -} - -- (void) release -{ - [super release]; - return; -} - -@end - -@implementation MCPClassDescription (Private) - -#pragma mark Setters -- (void) setAttributes:(NSArray *) iAttributes -{ - if (iAttributes != attributes) { - [attributes release]; - attributes = [[NSMutableArray alloc] initWithArray:iAttributes]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; - } -} - -- (void) setRelations:(NSArray *) iRelations -{ - if (iRelations != relations) { - [relations release]; - relations = [[NSMutableArray alloc] initWithArray:iRelations]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:model]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:self]; - } -} - -- (void) insertObject:(MCPRelation *) iRelation inIncomingsAtIndex:(NSUInteger) index -{ - if ([iRelation destination] == self) { - [incomings insertObject:iRelation atIndex:index]; - } - else { - NSLog(@"in -[MCPClassDescription+Private insertObject:inIncomingsAtIndex:]. ERRROR : self is NOT the destination of the relation"); - } -} - -- (void) removeObjectFromIncomingsAtIndex:(NSUInteger) index -{ - [incomings removeObjectAtIndex:index]; -} - -#pragma mark Getters -- (NSArray *) incomings -{ - return [NSArray arrayWithArray:incomings]; -} - -- (NSUInteger) countOfIncomings -{ - return [incomings count]; -} - -- (MCPRelation *) objectInIncomingsAtIndex:(NSUInteger) index -{ - return (MCPRelation *)[incomings objectAtIndex:index]; -} - -- (NSUInteger) indexOfIncoming:(id) iRelation -{ - return [incomings indexOfObject:iRelation]; -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPEntrepriseNotifications.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPEntrepriseNotifications.h deleted file mode 100644 index 1bb903c4..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPEntrepriseNotifications.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// $Id$ -// -// MCPEnterpriseNotifications.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -#pragma mark Name for notification - -extern NSString *MCPModelChangedNotification; -extern NSString *MCPClassDescriptionChangedNotification; -extern NSString *MCPAttributeChangedNotification; -extern NSString *MCPRelationChangedNotification; diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPEntrepriseNotifications.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPEntrepriseNotifications.m deleted file mode 100644 index ec4f3793..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPEntrepriseNotifications.m +++ /dev/null @@ -1,34 +0,0 @@ -// -// $Id$ -// -// MCPEnterpriseNotifications.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -NSString *MCPModelChangedNotification = @"Model has changed"; -NSString *MCPClassDescriptionChangedNotification = @"ClassDescription has changed"; -NSString *MCPAttributeChangedNotification = @"Attribute has changed"; -NSString *MCPRelationChangedNotification = @"Relation has changed"; diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPJoin.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPJoin.h deleted file mode 100644 index 05e99f8d..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPJoin.h +++ /dev/null @@ -1,74 +0,0 @@ -// -// $Id$ -// -// MCPJoin.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 18/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -@class MCPModel; -@class MCPClassDescription; -@class MCPAttribute; -@class MCPRelation; -@class MCPRelation; - -@interface MCPJoin : NSObject <NSCoding> -{ -@protected - // Note that NONE of these attributes are retained!!! - // Instead all these objects are notified of the existence of the join - // and are responsible to invalidate/delete it if necessary. - MCPRelation *relation; - MCPAttribute *origin; - MCPAttribute *destination; -} - -#pragma mark Class methods -+ (void) initialize; - -#pragma mark Life cycle -- (id) initForRelation:(MCPRelation *) iRelation from:(MCPAttribute *) iOrigin to:(MCPAttribute *) iDestination; -- (void) invalidate; -- (void) dealloc; - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder; -- (void) encodeWithCoder:(NSCoder *) encoder; - -#pragma mark Setters -// No setter for relation : should be set at init time! -- (void) setOrigin:(MCPAttribute *) iOrigin; -- (void) setDestination:(MCPAttribute *) iDestination; - -#pragma mark Getters -- (MCPRelation *) relation; -- (MCPAttribute *) origin; -- (MCPAttribute *) destination; -- (NSUInteger) index; - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPJoin.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPJoin.m deleted file mode 100644 index 576b1e10..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPJoin.m +++ /dev/null @@ -1,183 +0,0 @@ -// -// $Id$ -// -// MCPJoin.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 18/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPJoin.h" - -#import "MCPModel.h" -#import "MCPClassDescription.h" -#import "MCPAttribute.h" -#import "MCPRelation.h" -#import "MCPRelation.h" - -@implementation MCPJoin - -#pragma mark Class methods -+ (void) initialize -{ - if (self = [MCPJoin class]) { - [self setVersion:010101]; // Ma.Mi.Re -> MaMiRe - } - return; -} - -#pragma mark Life cycle -- (id) initForRelation:(MCPRelation *) iRelation from:(MCPAttribute *) iOrigin to:(MCPAttribute *) iDestination; -{ - self = [super init]; - if (self) { - relation = iRelation; - [self setOrigin:iOrigin]; - [self setDestination:iDestination]; - } - return self; -} - -- (void) invalidate -{ - [self retain]; - NSLog(@"Enterring -[MCPJoin invalidate], retain count is %ld (after retaining : should be 4)", [self retainCount]); - [origin removeObjectFromJoinsAtIndex:[origin indexOfJoinIdenticalTo:self]]; - [destination removeObjectFromJoinsAtIndex:[destination indexOfJoinIdenticalTo:self]]; - [relation removeObjectFromJoinsAtIndex:[relation indexOfJoinIdenticalTo:self]]; - NSLog(@"Enterring -[MCPJoin invalidate], retain count is %ld (before releasing : should be 1)", [self retainCount]); - [self release]; - return; -} - -- (void) dealloc -{ - // Nothing to release, because the attributes are NOT retained. - [super dealloc]; -} - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder -{ - self = [super init]; - if ((self) && ([decoder allowsKeyedCoding])) { - relation = [decoder decodeObjectForKey:@"MCPrelation"]; - [self setOrigin:[decoder decodeObjectForKey:@"MCPorigin"]]; - [self setDestination:[decoder decodeObjectForKey:@"MCPdestination"]]; - } - else { - NSLog(@"For some reason, unable to decode MCPJoin from the coder!!!"); - } - return self; -} - -- (void) encodeWithCoder:(NSCoder *) encoder -{ - if (! [encoder allowsKeyedCoding]) { - NSLog(@"In MCPJoin -encodeWithCoder : Unable to encode to a non-keyed encoder!!, will not perform encoding!!"); - return; - } - [encoder encodeObject:[self relation] forKey:@"MCPrelation"]; - [encoder encodeObject:[self origin] forKey:@"MCPorigin"]; - [encoder encodeObject:[self destination] forKey:@"MCPdestination"]; -} - -#pragma mark Setters -- (void) setOrigin:(MCPAttribute *) iOrigin -{ - if (origin != iOrigin) { - if (origin) { - [origin removeObjectFromJoinsAtIndex:[origin indexOfJoinIdenticalTo:self]]; - } - origin = iOrigin; - if (origin) { - [origin insertObject:self inJoinsAtIndex:[origin countOfJoins]]; - } - } -} - -- (void) setDestination:(MCPAttribute *) iDestination -{ - if (destination != iDestination) { - if (destination) { - [destination removeObjectFromJoinsAtIndex:[destination indexOfJoinIdenticalTo:self]]; - } - destination = iDestination; - if (destination) { - [destination insertObject:self inJoinsAtIndex:[destination countOfJoins]]; - } - } -} - -#pragma mark Getters -- (MCPRelation *) relation -{ - return relation; -} - -- (MCPAttribute *) origin -{ - return origin; -} - -- (MCPAttribute *) destination -{ - return destination; -} - -- (NSUInteger) index -{ - return [relation indexOfJoinIdenticalTo:self]; -} - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject -{ - if ([iObject isKindOfClass:[MCPJoin class]]) { - MCPJoin *theJoin = (MCPJoin *)iObject; - - return ([relation isEqual:[theJoin relation]]) && ([origin isEqual:[theJoin origin]]) && ([destination isEqual:[theJoin destination]]); - } - if ([iObject isKindOfClass:[NSDictionary class]]) { - NSDictionary *theDict = (NSDictionary *)iObject; - - return ([relation isEqual:[theDict valueForKey:@"relation"]]) && ([origin isEqual:[theDict valueForKey:@"origin"]]) && ([destination isEqual:[theDict valueForKey:@"destination"]]); - } - return NO; -} - -#pragma mark For debugging the retain counting -- (id) retain -{ - [super retain]; - - return self; -} - -- (void) release -{ - [super release]; - - return; -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel+MCPEntreprise.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel+MCPEntreprise.m deleted file mode 100644 index 2652f0dc..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel+MCPEntreprise.m +++ /dev/null @@ -1,57 +0,0 @@ -// -// $Id$ -// -// MCPModel+MCPEntreprise.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 01/11/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPModel+MCPEntreprise.h" - -#import "MCPObject.h" - -@implementation MCPModel (MCPEntreprise) - -#pragma mark Work as a class description server - -- (void) registerAsClassDescriptionServer -{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registerDescriptionForClass:) name:NSClassDescriptionNeededForClassNotification object:nil]; -} - -- (void) registerDescriptionForClass:(NSNotification *) notification -{ - Class theClass = [notification object]; - - if ([theClass isSubclassOfClass:[MCPObject class]]) { - - NSString *theClassName = NSStringFromClass(theClass); - NSUInteger index = [self indexOfClassDescription:theClassName]; - - if (NSNotFound != index) { - [NSClassDescription registerClassDescription:(NSClassDescription *)[self objectInClassDescriptionsAtIndex:index] forClass:theClass]; - } - } -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel.h deleted file mode 100644 index 0a6c6afd..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel.h +++ /dev/null @@ -1,84 +0,0 @@ -// -// $Id$ -// -// MCPModel.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -@class MCPClassDescription; -@class MCPAttribute; -@class MCPRelation; - -@interface MCPModel : NSObject <NSCoding> -{ -@protected - NSString *name; // Name of the model ... useless. - NSMutableArray *classDescriptions; // Order of the class descriptions in the model. - BOOL usesInnoDBTables; // The database should use InnoDB tables. - // Might add a string holding définition of tables. - // Might also add some sort of template for generated files (at least the header). -} - -#pragma mark Class methods -+ (void) initialize; - -#pragma mark Life cycle -- (id) initWithName:(NSString *) iName; -- (void) dealloc; - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder; -- (void) encodeWithCoder:(NSCoder *) encoder; - -#pragma mark Making new class description -- (MCPClassDescription *) addNewClassDescriptionWithName:(NSString *) iName inPosition:(NSInteger) index; - -#pragma mark Setters -- (void) setName:(NSString *) iName; -- (void) setClassDescriptions:(NSArray *) iClassDescriptions; -- (void) insertObject:(MCPClassDescription *) iClassDescription inClassDescriptionsAtIndex:(NSUInteger) index; -- (void) removeObjectFromClassDescriptionsAtIndex:(NSUInteger) index; -- (void) setUsesInnoDBTables:(BOOL) iUsesInnoDB; - -// Deprecated : non KVC -//- (void) removeClassDescription:(MCPClassDescription *) iClassDescription; -//- (void) addClassDescription:(MCPClassDescription *) iClassDescription; - -#pragma mark Getters -- (NSString *) name; -- (NSArray *) classDescriptions; -- (NSUInteger) countOfClassDescriptions; -- (MCPClassDescription *) objectInClassDescriptionsAtIndex:(NSUInteger) index; -- (NSUInteger) indexOfClassDescription:(id) iClassDescription; -- (BOOL) usesInnoDBTables; - -// Deprecated : non KVC -//- (MCPClassDescription *) classDescriptionWithClassName:(NSString *) iClassDescriptionClassName; - -#pragma mark Output for logging -- (NSString *) descriptionWithLocale:(NSDictionary *) locale; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel.m deleted file mode 100644 index 7c73eff1..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel.m +++ /dev/null @@ -1,230 +0,0 @@ -// -// $Id$ -// -// MCPModel.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 09/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPModel.h" - -#import "MCPEntrepriseNotifications.h" - -#import "MCPClassDescription.h" -#import "MCPAttribute.h" -#import "MCPRelation.h" - -@implementation MCPModel - -#pragma mark Class methods -+ (void) initialize -{ - if (self = [MCPModel class]) { - [self setVersion:010101]; // Ma.Mi.Re -> MaMiRe - } - return; -} - -#pragma mark Life cycle -- (id) initWithName:(NSString *) iName -{ - self = [super init]; - if (self) { - [self setName:iName]; - classDescriptions = [[NSMutableArray alloc] init]; - } - - return self; -} - -- (void) dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [name release]; - [classDescriptions release]; - [super dealloc]; -} - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder -{ - self = [super init]; - if ((self) && ([decoder allowsKeyedCoding])) { - [self setName:[decoder decodeObjectForKey:@"MCPname"]]; - [self setClassDescriptions:[decoder decodeObjectForKey:@"MCPclassDescriptions"]]; - [self setUsesInnoDBTables:[decoder decodeBoolForKey:@"MCPusesInnoDBTables"]]; - } - else { - NSLog(@"For some reason, unable to decode MCPModel from the coder!!!"); - } - - return self; -} - -- (void) encodeWithCoder:(NSCoder *) encoder -{ - if (! [encoder allowsKeyedCoding]) { - NSLog(@"In MCPModel -encodeWithCoder : Unable to encode to a non-keyed encoder!!, will not perform encoding!!"); - return; - } -// [super encodeWithCoder:encoder]; - [encoder encodeObject:[self name] forKey:@"MCPname"]; - [encoder encodeObject:[self classDescriptions] forKey:@"MCPclassDescriptions"]; - [encoder encodeBool:[self usesInnoDBTables] forKey:@"MCPusesInnoDBTables"]; - [encoder encodeObject:@"1.1.1" forKey:@"MCPversion"]; - return; -} - -#pragma mark Making new class description -- (MCPClassDescription *) addNewClassDescriptionWithName:(NSString *) iName inPosition:(NSInteger) index; -{ - MCPClassDescription *theClassDescription = [[MCPClassDescription alloc] initInModel:self withName:iName]; - -// [self addClassDescription:theClassDescription]; - [self insertObject:theClassDescription inClassDescriptionsAtIndex:(index < 0) ? ([self countOfClassDescriptions] + index + 1) : index]; - [theClassDescription release]; - return theClassDescription; -} - -#pragma mark Setters -- (void) setName:(NSString *) iName -{ - if (iName != name) { - [name release]; - name = [iName retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; - } -} - -- (void) setClassDescriptions:(NSArray *) iClassDescriptions -{ - if (iClassDescriptions != classDescriptions) { - [classDescriptions release]; - classDescriptions = [[NSMutableArray alloc] initWithArray:iClassDescriptions]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; - } -} - -- (void) insertObject:(MCPClassDescription *) iClassDescription inClassDescriptionsAtIndex:(NSUInteger) index -{ - [classDescriptions insertObject:iClassDescription atIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; -} - -- (void) removeObjectFromClassDescriptionsAtIndex:(NSUInteger) index -{ - [classDescriptions removeObjectAtIndex:index]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; -} - -- (void) setUsesInnoDBTables:(BOOL) iUsesInnoDB -{ - usesInnoDBTables = iUsesInnoDB; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; -} - -// Deprecated : non KVC -/* -- (void) removeClassDescription:(MCPClassDescription *) iClassDescription -{ - [classDescriptions removeObject:iClassDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; -} - - - (void) addClassDescription:(MCPClassDescription *) iClassDescription - { - [classDescriptions addObject:iClassDescription]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:self]; - } - - */ - -#pragma mark Getters -- (NSString *) name -{ - return name; -// return [NSString stringWithString:name]; -} - -- (NSArray *) classDescriptions -{ - return [NSArray arrayWithArray:classDescriptions]; -} - -- (NSUInteger) countOfClassDescriptions -{ - return [classDescriptions count]; -} - -- (MCPClassDescription *) objectInClassDescriptionsAtIndex:(NSUInteger) index -{ - return (MCPClassDescription *)((NSNotFound != index) ? [classDescriptions objectAtIndex:index] : nil); -} - -- (MCPClassDescription *) classDescriptionWithClassName:(NSString *) iClassDescriptionClassName -{ -// Given the implementation of isEqual: for the MCPClassDescription, one should be able to use NSArray method directly: - /* unsigned int i; - - for (i=0; ([classDescriptions count] != i) && (! [iClassDescriptionClassName isEqualToString:[(MCPClassDescription *) [classDescriptions objectAtIndex:i] className]]); ++i ) { - } - return (i == [classDescriptions count]) ? nil : (MCPClassDescription *)[classDescriptions objectAtIndex:i]; - */ - NSUInteger theIndex = [classDescriptions indexOfObject:iClassDescriptionClassName]; - return (NSNotFound == theIndex) ? nil : [classDescriptions objectAtIndex:theIndex]; -} - -- (NSUInteger) indexOfClassDescription:(id) iClassDescription -{ - return [classDescriptions indexOfObject:iClassDescription]; -} - -- (BOOL) usesInnoDBTables -{ - return usesInnoDBTables; -} - -// Deprecated : non KVC - -#pragma mark Output for logging -- (NSString *) descriptionWithLocale:(NSDictionary *) locale -{ - return [NSString stringWithFormat:@"<MCPModel with name %@ : %p>", [self name], self]; -} - -#pragma mark For debugging the retain counting -- (id) retain -{ - [super retain]; - - return self; -} - -- (void) release -{ - [super release]; - - return; -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPObject.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPObject.h deleted file mode 100644 index 4f126928..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPObject.h +++ /dev/null @@ -1,127 +0,0 @@ -// -// $Id$ -// -// MCPObject.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 19/05/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -/*" Possible return code on some operations of the database interaction. "*/ -enum { - MCPDBReturnUnknown = 0, /*"Unknown state, should not happen."*/ - MCPDBReturnDeleted = 1, /*"The entry have been successfuly deleted from DB."*/ - MCPDBReturnUsed = 2, /*"The entry can not be removed, because some entries are still connected to it (some delete restrict/inhibit delete)."*/ - MCPDBReturnNone = 3, /*"No entry exist with this Id."*/ - MCPDBReturnNew = 4, /*"The entry was indeed new and inserted in the database."*/ - MCPDBReturnUpdated = 5, /*"The entry was updated in the DB."*/ - MCPDBReturnIncompleteKey = 6, /*"Part of the primary key is missing, action not taken."*/ - MCPDBReturnMultiple = 7, /*"Multiple rows are found with a query supposed to return at most one row."*/ - MCPDBReturnNoIdentity = 8, /*"The object does not have attributes that defines identity."*/ - MCPDBReturnNoKey = 9, /*"There is no primary key defined for this entity."*/ - MCPDBReturnNoConnection = 10, /*"The MCPObject is not having a connection."*/ - MCPDBReturnWrongRelationOrigin = 11, /*"Looking for a relation not which origin is not of the specified class."*/ - MCPDBReturnWrongRelationCardinality = 12, /*"Using a method assuming a cardinality of the relation while the relation as the other one."*/ - MCPDBReturnNoSuchRelation = 13, /*"There is no relation with such a name starting from this class."*/ - MCPDBReturnNotTarget = 14, /*"Tried to remove an object from a relation, while the objects does NOT belong to the relation."*/ - MCPDBReturnOK = 100 /*"Everything went OK."*/ -}; -typedef NSUInteger MCPDBReturnCode; - -@class MCPConnection; -@class MCPClassDescription; -@class MCPRelation; - -@interface MCPObject : NSObject { - MCPClassDescription *classDescription; - MCPConnection *connection; -} - -#pragma mark Life of the Object -/*" Life of the object "*/ -- (id) init; -- (id) initWithDictionary:(NSDictionary *) dictionary; - -- (void) dealloc; - -- (void) setAttributesToDefault; - -#pragma mark Accessors -/*" Accessor(s) "*/ -- (MCPClassDescription *) classDescription; -- (MCPConnection *) connection; - -- (void) setConnection:(MCPConnection *) iConnection; - -#pragma mark Database interface -/*" Database interface "*/ -- (id) readFromDBRow:(NSDictionary *) iDictionary withTableName:(NSString *) iTableName; -- (MCPDBReturnCode) setPrimaryKey:(id) iDictionary andFetchFromDB:(MCPConnection *) iConnection; -//- (MCPDBReturnCode) setPrimaryKey:(NSDictionary *) iDictionary andFetchFromDB:(MCPConnection *) iConnection; -- (NSDictionary *) checkDBId; // the returned dictionary contains a MCPDBReturnCode key with the return code. -- (NSDictionary *) saveInDB; // the returned dictionary contains a MCPDBReturnCode key with the return code. -- (MCPDBReturnCode) getAutoGenerated; -- (MCPDBReturnCode) updateInDB; -- (MCPDBReturnCode) deleteInDB; -+ (MCPDBReturnCode) deleteInDBUsingConnection:(MCPConnection *) iConnection withId:(id) iId; - -#pragma mark Handling relations -/*" Handling realtions "*/ -- (id) getTargetOfRelation:(MCPRelation *) iRelation; -- (id) getTargetOfRelationNamed:(NSString *) iRelationName; -- (MCPDBReturnCode) setTarget:(id) iTarget forRelation:(MCPRelation *) iRelation; -- (MCPDBReturnCode) setTarget:(id) iTarget forRelationNamed:(NSString *) iRelationName; -- (NSUInteger) countTargetForRelation:(MCPRelation *) iRelation; -- (NSUInteger) countTargetForRelationNamed:(NSString *) iRelationName; -- (MCPObject *) getTargetOfRelation:(MCPRelation *) iRelation atIndex:(NSUInteger) iIndex; -- (MCPObject *) getTargetOfRelationNamed:(NSString *) iRelationName atIndex:(NSUInteger) iIndex; -- (MCPDBReturnCode) addTarget:(MCPObject *) iTarget toRelation:(MCPRelation *) iRelation; -- (MCPDBReturnCode) addTarget:(MCPObject *) iTarget toRelationNamed:(NSString *) iRelationName; -- (MCPDBReturnCode) removeTarget:(MCPObject *) iTarget toRelation:(MCPRelation *) iRelation; -- (MCPDBReturnCode) removeTarget:(MCPObject *) iTarget toRelationNamed:(NSString *) iRelationName; -- (MCPDBReturnCode) removeTargetToRelation:(MCPRelation *) iRelation atIndex:(NSUInteger) iIndex; -- (MCPDBReturnCode) removeTargetToRelationNamed:(NSString *) iRelationName atIndex:(NSUInteger) iIndex; -- (NSUInteger) indexOfTarget:(MCPObject *) iTarget inRelation:(MCPRelation *) iRelation; -- (NSUInteger) indexOfTarget:(MCPObject *) iTarget inRelationNamed:(NSString *) iRelationName; - -#pragma mark Utilities -/*" Utility methods "*/ -- (id) defaultValueForKey:(NSString *) iKey; -- (NSDictionary *) primaryKey; - -/*" Testing equality (VERY important for relation management)"*/ -- (BOOL) isEqual:(id) iObject; - -#pragma mark Output -/*" Output : "*/ -- (NSString *) description; -- (NSString *) descriptionWithLocale:(NSDictionary *) locale; - -#pragma mark Ordering the array for relations -- (NSString *) orderSQLForClassDescription:(MCPClassDescription *) iClassDescription; - -/*" Anti-crash method... "*/ -- (void) setNilValueForKey:(NSString *) iKey; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPObject.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPObject.m deleted file mode 100644 index dba963c6..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPObject.m +++ /dev/null @@ -1,1342 +0,0 @@ -// -// $Id$ -// -// MCPObject.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 19/05/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPObject.h" - -#import <MCPKit/MCPKit.h> - -#import "MCPClassDescription.h" -#import "MCPClassDescription+MCPEntreprise.h" -#import "MCPAttribute.h" -#import "MCPRelation.h" -#import "MCPJoin.h" - -@implementation MCPObject - -#pragma mark Life of the object -- (id) init -/*" Taking care of getting the class description for self (after passing the message up). "*/ -{ -// NSArray theAttributes; -// unsigned int i; - - if (self = [super init]) { - classDescription = [[NSClassDescription classDescriptionForClass:[self class]] retain]; - [self setAttributesToDefault]; -/* - theAttributes = [classDescription attributeKeys]; - for (i=0; [theAttributes count] != i; ++i) { // setting the attributtes with proper defaults. - NSString *theKey = (NSString *) [theAttributes objectAtIndex:i]; - - [self setValue:[self defaultValueForKey:theKey] forKey:theKey]; - } - */ - } - return self; -} - -- (id) initWithDictionary:(NSDictionary *) dictionary -/*" This method will use the class description to fetch in the dictionary the values of the attributes of the object.... - Should try to get this description a bit clearer."*/ -{ - self = [super init]; - if (self) { - NSUInteger i; - NSArray *attrArray; - - classDescription = [[NSClassDescription classDescriptionForClass:[self class]] retain]; - [self setAttributesToDefault]; - attrArray = [classDescription attributes]; - for (i=0; [attrArray count] != i; ++i) { - MCPAttribute *currentAttribute = (MCPAttribute *)[attrArray objectAtIndex:i]; - id currentValue = [dictionary objectForKey:[currentAttribute name]]; - - if (! currentValue) { - currentValue = [dictionary objectForKey:[currentAttribute externalName]]; - } - if (currentValue) { - [self setValue:currentValue forKey:[currentAttribute name]]; - } - } - } - return self; -} - -- (void) dealloc -/*" Deallocating the class description, then passes the message to super. "*/ -{ -// unsigned int i; -// NSArray *tmpAttributes = [classDescription attributes]; - -/* for (i=0; [tmpAttributes count] != i; ++i) { - MCPAttribute *tmpAttr = [tmpAttributes objectAtIndex:i]; - if ([tmpAttr valueClass]) { - [self setValue:nil forKey:[tmpAttr name]]; - } - } -*/ - [classDescription release]; - [connection release]; - [super dealloc]; -} - -- (void) setAttributesToDefault -/*" Set all the attributes to default values, except for auto-generated and primary key attributes, which are set to NULL. - - NOTE : !! In the current version the auto-generated and key are ALSO set to default values!!. - "*/ -{ - NSArray *theAttributes = [classDescription attributes]; -// NSArray *thePrimKeys = [classDescription primaryKeyAttributes]; - NSUInteger i; - - for (i=0; [theAttributes count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *) [theAttributes objectAtIndex:i]; - NSString *theKey = [theAttribute name]; - - if (! [theAttribute autoGenerated]) { - [self setValue:[self defaultValueForKey:theKey] forKey:theKey]; - } - else { // Auto-generated attribute ... set it to NULL: - [self setValue:[self defaultValueForKey:theKey] forKey:theKey]; - } - } -/* - for (i=0; [thePrimKeys count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *) [thePrimKeys objectAtIndex:i]; - if (! [theAttribute autoGenerated]) { - NSString *theKey = [theAttribute name]; - - [[self valueForKey:theKey] release]; - [self setValue:NULL forKey:theKey]; - } - } - */ - return; -} - -#pragma mark Accessor(s) -- (MCPClassDescription *) classDescription -{ - return classDescription; -} - -- (MCPConnection *) connection -{ - if ((! connection) || (! [connection checkConnection])) { - [self setConnection:nil]; - } - return connection; -} - -- (void) setConnection:(MCPConnection *) iConnection -{ - if (iConnection != connection) { - [connection release]; - connection = [iConnection retain]; - } -} - - - -#pragma mark Database interface -- (id) readFromDBRow:(NSDictionary *) iDictionary withTableName:(NSString *) iTableName -/*" Uses a query result row (described as a NSDictionary) to set the instance variables of self. If - the result contains columns from multiple tables, the iTableName can be used to specify the alias - used for the table name corresponding to the class. - -If iTableName == nil, the columns will be searched first without table name (column_name) and if - not found then with the table name in front (from the class description : table_name.column_name). - -Otherwise, the search will be performed in the following order : iTableName.column_name, column_name, - table_name.column_name. - "*/ -{ - NSArray *theAttributeKeys = [classDescription attributeKeys]; - NSArray *thePrefixArray; - NSUInteger i; - -// Depending on the value of iTableName, get the search order. - if ((nil == iTableName) || ([@"" isEqualToString:iTableName])) { - thePrefixArray = [NSArray arrayWithObjects:@"", [NSMutableString stringWithFormat:@"%@.", [classDescription externalName]], nil]; - } - else { - thePrefixArray = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@.", iTableName], [NSMutableString stringWithFormat:@"%@.", [classDescription externalName]], @"", nil]; - } - for (i=0; [theAttributeKeys count] != i; ++i) { - id theValue = nil; - MCPAttribute *theAttribute = [classDescription attributeWithName:[theAttributeKeys objectAtIndex:i]]; - NSUInteger j; - - for (j=0; [thePrefixArray count] != j; ++j) { - if (theValue = [iDictionary objectForKey:[NSString stringWithFormat:@"%@%@", [thePrefixArray objectAtIndex:j], [theAttribute externalName]]]) { - break; - } - } - if (theValue) { - [self takeValue:theValue forKey:[theAttribute name]]; - } - } - return self; -} - - -//- (MCPDBReturnCode) setPrimaryKey:(NSDictionary *) iDictionary andFetchFromDB:(MCPConnection *) iConnection -- (MCPDBReturnCode) setPrimaryKey:(id) iDictionary andFetchFromDB:(MCPConnection *) iConnection -/*" This method is used to retrieve an object from the DB given its precise primary key. It will return self. - If the object is not found in the DB, then all instance variable are set to the default - (and autogenerated/primary-key attributes are set to null)."*/ -{ - BOOL missingKey = NO; - NSArray *theKeyAttr = [classDescription primaryKeyAttributes]; - NSUInteger i; - NSMutableString *query = [NSMutableString stringWithFormat:@"SELECT * FROM %@ WHERE ", [classDescription externalName]]; - MCPResult *result; - NSDictionary *row; - - [self setConnection:iConnection]; - if (! iConnection) { - return MCPDBReturnNoConnection; - } - for (i=0; [theKeyAttr count] != i; ++i) { - MCPAttribute *theAttr = [classDescription attributeWithName:[(MCPAttribute *)[theKeyAttr objectAtIndex:i] name]]; - id theKeyValue; - -// if (theKeyValue = [iDictionary objectForKey:[theAttr name]]) { - if (theKeyValue = [iDictionary valueForKey:[theAttr name]]) { - if (i != 0) { - [query appendString:@" and "]; - } -// Implies the iDictionary IS a dictionary: -// [query appendFormat:@"(%@ = %@)", [theAttr externalName], [iConnection quoteObject:[iDictionary objectForKey:[theAttr name]]]]; -// If the iDictionary is just an object complying with NSValueCodeing: - [query appendFormat:@"(%@ = %@)", [theAttr externalName], [iConnection quoteObject:theKeyValue]]; - } - else { // Part of the primary key is missing... look for the DB name of the attribute - if (theKeyValue = [iDictionary valueForKey:[theAttr externalName]]) { - if (i != 0) { - [query appendString:@" and "]; - } - [query appendFormat:@"(%@ = %@)", [theAttr externalName], [iConnection quoteObject:theKeyValue]]; - } - else { // Not able to find the value for this attribute !!! - missingKey = YES; - NSLog(@"Unable to find the value for attribute %@ of object of class %@, will make it default", [theAttr name], [self className]); - break; - } - } - } // Now the query is prepared... or a key part is missing: - if (missingKey) { - [self setAttributesToDefault]; - return MCPDBReturnIncompleteKey; - } - result = [iConnection queryString:query]; - if ([result numOfRows] == 0) { - [self setAttributesToDefault]; - return MCPDBReturnNone; - } - row = [result fetchRowAsDictionary]; - [self readFromDBRow:row withTableName:@""]; - if ([result numOfRows] != 1) { - NSLog(@"Got more than one row when querying : %@.... will take only the first one!!! that an IMPORTANT flaw in your data model!!!", query); - return MCPDBReturnMultiple; - } - return MCPDBReturnOK; -} - - -- (NSDictionary *) checkDBId -/*" Using the identity properties of the class, this method will check if self already exists in the DB, - in which case it will set the primary key attributes to match the DB entry. If the object is not present - in the DB, the primary key attributes are set to null if they are declared as aut-generated (untouched otherwise). - -The returned dictionary contains the values of the primary key attributes. It also contains one entry with - key MCPDBReturnCode, which contains the result of the operation (was the object in DB?). - -If the identityAttributes of the class description is empty, the entry will always be considered not to be - in the DB, AND the primary key attributes of the object will be left unchnaged and returned as they are at - call time."*/ -{ - NSArray *theIdAttr = [classDescription identityAttributes]; - NSMutableDictionary *theKeys = [NSMutableDictionary dictionary]; - NSArray *theKeyAttr = [classDescription primaryKeyAttributes]; - MCPConnection *theConnection = [self connection]; - MCPResult *theResult; - NSUInteger i; - - if (! theConnection) { - return [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:MCPDBReturnNoConnection], @"MCPDBReturnCode", nil]; - } - if (! [theKeyAttr count]) { // There is no primary key for this object. - [theKeys setObject:[NSNumber numberWithInteger:MCPDBReturnNoKey] forKey:@"MCPDBReturnCode"]; - return [NSDictionary dictionaryWithDictionary:theKeys]; - } - if (! [theIdAttr count]) { // Identity is not defined for this object. - [theKeys setObject:[NSNumber numberWithInteger:MCPDBReturnNoIdentity] forKey:@"MCPDBReturnCode"]; - for (i=0; [theKeyAttr count] != i; ++i) { - NSString *theKey = [(MCPAttribute*)[theKeyAttr objectAtIndex:i] name]; - [theKeys setObject:[self valueForKey:theKey] forKey:theKey]; - } - return [NSDictionary dictionaryWithDictionary:theKeys]; - } -// Do the fetch in the DB. - NSMutableString *theQuery = [NSMutableString stringWithString:@"SELECT "]; - - for (i = 0; [theKeyAttr count] != i; ++i) { - if (i) { - [theQuery appendString:@", "]; - } - [theQuery appendString:[(MCPAttribute *)[theKeyAttr objectAtIndex:i] externalName]]; - } - [theQuery appendFormat:@" FROM %@ WHERE ", [classDescription externalName]]; - for (i = 0; [theIdAttr count] != i; ++i) { - if (i) { - [theQuery appendString:@" AND "]; - } -/* - if ([[(MCPAttribute *)[theIdAttr objectAtIndex:i] valueClass] isSubclassOfClass:[NSString class]]) { - if ([(MCPAttribute *)[theIdAttr objectAtIndex:i] width] != 0) { - [theQuery appendFormat:@"(BINARY %@ = SUBSTRING(%@ FROM 1 FOR %u)", [(MCPAttribute *)[theIdAttr objectAtIndex:i] externalName], [theConnection quoteObject:[self valueForKey:[(MCPAttribute *)[theIdAttr objectAtIndex:i] name]]], [(MCPAttribute *)[theIdAttr objectAtIndex:i] width]]; - } - else { - [theQuery appendFormat:@"(BINARY %@ = %@)", [(MCPAttribute *)[theIdAttr objectAtIndex:i] externalName], [theConnection quoteObject:[self valueForKey:[(MCPAttribute *)[theIdAttr objectAtIndex:i] name]]]]; - } - } - */ - if (([[(MCPAttribute *)[theIdAttr objectAtIndex:i] valueClass] isSubclassOfClass:[NSString class]]) && ([(MCPAttribute *)[theIdAttr objectAtIndex:i] width] != 0)) { - [theQuery appendFormat:@"(%@ = SUBSTRING(%@ FROM 1 FOR %ld))", [(MCPAttribute *)[theIdAttr objectAtIndex:i] externalName], [theConnection quoteObject:[self valueForKey:[(MCPAttribute *)[theIdAttr objectAtIndex:i] name]]], [(MCPAttribute *)[theIdAttr objectAtIndex:i] width]]; - } - else { - [theQuery appendFormat:@"(%@ = %@)", [(MCPAttribute *)[theIdAttr objectAtIndex:i] externalName], [theConnection quoteObject:[self valueForKey:[(MCPAttribute *)[theIdAttr objectAtIndex:i] name]]]]; - } - } - [theQuery appendString:@" ORDER BY "]; - for (i = 0; [theKeyAttr count] != i; ++i) { - if (i) { - [theQuery appendString:@", "]; - } - [theQuery appendString:[(MCPAttribute *)[theKeyAttr objectAtIndex:i] externalName]]; - } - theResult = [theConnection queryString:theQuery]; - if ([theResult numOfRows]) { // the object was found. - NSDictionary *theFirstRow = [theResult fetchRowAsDictionary]; - if ([theResult numOfRows] != 1) { - NSLog(@"in MCPObject -checkDBIdWithConnection: method.... not only one (as expected) but %ld results were found, will take the first one."); - [theKeys setObject:[NSNumber numberWithInteger:MCPDBReturnMultiple] forKey:@"MCPDBReturnCode"]; - } - else { - [theKeys setObject:[NSNumber numberWithInteger:MCPDBReturnOK] forKey:@"MCPDBReturnCode"]; - } - [theKeys addEntriesFromDictionary:theFirstRow]; -// Setting the value of self for the primary key to the one just found. - for (i=0; [theKeyAttr count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *) [theKeyAttr objectAtIndex:i]; - - [self setValue:[theFirstRow objectForKey:[theAttribute externalName]] forKey:[theAttribute name]]; - } - } - else { // Object not found in the DB. - for (i = 0; [theKeyAttr count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *)[theKeyAttr objectAtIndex:i]; - - if ([theAttribute autoGenerated]) { - [self setValue:[self defaultValueForKey:[theAttribute name]] forKey:[theAttribute name]]; - } - [theKeys setObject:[self valueForKey:[theAttribute name]] forKey:[theAttribute name]]; - } - [theKeys setObject:[NSNumber numberWithInteger:MCPDBReturnNone] forKey:@"MCPDBReturnCode"]; -// Setting the value of self for the primary key to the default values. -/* - for (i=0; [theKeyAttr count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *) [theKeyAttr objectAtIndex:i]; - - [self setValue:[self defaultValueForKey:[theAttribute name]] forKey:[theAttribute name]]; - } -*/ - } - return [NSDictionary dictionaryWithDictionary:theKeys]; -} - - -- (NSDictionary *) saveInDB -/*" First will use the checkDBIdWithConnection method to check if the entry is already in the database. If this is the case, - it will use the updateInDB... method to update the current DB instance. Otherwise it will make an insert into the database - to save the entry, than it makes a select to get the value of autogenerated column, and use them (if necessary) to return - the primary key (as NSDictionary). - - As for checkDBId... the returned dictionary also have a MCPDBReturnCode key with a NSNumber as value containing the - return code of the operation."*/ -{ - MCPConnection *theConnection = [self connection]; - NSDictionary *theCheckReturn = [self checkDBId]; - NSMutableDictionary *theRet; - NSInteger theCheckCode = [(NSNumber *)[theCheckReturn objectForKey:@"MCPDBReturnCode"] integerValue]; - NSUInteger i; - NSUInteger j; - NSMutableString *theQuery = [NSMutableString string]; - NSArray *theAttr = [classDescription attributes]; - - switch (theCheckCode) { - case MCPDBReturnNoIdentity : // For this object the identity is not set... so we try to save. - break; - - case MCPDBReturnOK : // Object already in the DB (found using checkDBId... method). - // NSLog(@"in saveUsingConnection: the entry already existed so will update the one with key : %@", theCheckReturn); - theCheckCode = [self updateInDB]; - theRet = [NSMutableDictionary dictionaryWithDictionary:[self primaryKey]]; - [theRet setObject:[NSNumber numberWithInteger:theCheckCode] forKey:@"MCPDBReturnCode"]; - return [NSDictionary dictionaryWithDictionary:theRet]; - break; - - case MCPDBReturnMultiple : // Multiple were found, the first one will be updated. - NSLog(@"Multiple entries found with the same identity ... will update the first one."); - theCheckCode = [self updateInDB]; - theRet = [NSMutableDictionary dictionaryWithDictionary:[self primaryKey]]; - [theRet setObject:[NSNumber numberWithInteger:theCheckCode] forKey:@"MCPDBReturnCode"]; - return [NSDictionary dictionaryWithDictionary:theRet]; - break; - - case MCPDBReturnNone : // The entry is not already in the DB, save it... - break; - - case MCPDBReturnNoConnection : // Self does not have a connection. - NSLog(@"Can not save when the connection is not working..."); - break; - - default : // We should not arrive here anyway. - NSLog(@"For some resons we got a unexpected result from checkDBId : %ld", theCheckCode); - break; - } - -// Generate the INSERT query: - [theQuery appendFormat:@"INSERT INTO %@ (", [classDescription externalName]]; - j = 0; - for (i=0; [theAttr count] != i; ++i) { - if (! [(MCPAttribute *)[theAttr objectAtIndex:i] autoGenerated]) { - if (j) { - [theQuery appendString:@", "]; - } - [theQuery appendString:[(MCPAttribute *)[theAttr objectAtIndex:i] externalName]]; - ++j; - } - } - [theQuery appendString:@") VALUES ("]; - j = 0; - for (i=0; [theAttr count] != i; ++i) { - if (! [(MCPAttribute *)[theAttr objectAtIndex:i] autoGenerated]) { - if (j) { - [theQuery appendString:@", "]; - } - [theQuery appendString:[theConnection quoteObject:[self valueForKey:[(MCPAttribute *)[theAttr objectAtIndex:i] name]]]]; - ++j; - } - } - [theQuery appendString:@")"]; -// Finished preparing the query. - -// Now we perform the query... - [theConnection queryString:theQuery]; - if (1 != (i = [theConnection affectedRows])) { // More than one row affected ... Should NEVER occure. - NSLog(@"Problem while saving a MCPObject to the database : number of inserted rows is : %ld !!!", i); - NSLog(@"Maybe there is an error : %@ ", [theConnection getLastErrorMessage]); - NSLog(@"The class of the object is : %@, and it's description is :\n%@", [self className], [self descriptionWithLocale:nil]); - theCheckCode = (i == 0) ? MCPDBReturnNone : MCPDBReturnMultiple; - } - else { - theCheckCode = MCPDBReturnOK; - } - -// Finally we get the primary key of the inserted object: - if ([classDescription singleIntAutoGenKey]) { - NSString *thePrimKey = [(MCPAttribute *) [[classDescription primaryKeyAttributes] objectAtIndex:0] name]; - - [self setValue:[NSNumber numberWithLongLong:[theConnection insertId]] forKey:thePrimKey]; - } - [self getAutoGenerated]; - theRet = [NSMutableDictionary dictionaryWithDictionary:[self primaryKey]]; - [theRet setObject:[NSNumber numberWithInteger:theCheckCode] forKey:@"MCPDBReturnCode"]; - - return [NSDictionary dictionaryWithDictionary:theRet]; -} - - - -- (MCPDBReturnCode) getAutoGenerated -/*" This method will use the Identity attributes of the object to retrieve the autogenerated -attributes from the database. - -If the identity is not defined for this class/entity, then it will try to use the primary key -to get the auto-generated values. - -Obviously this might generate a bug if one of the Identity attributes is autogenerated. -This will create a trouble if some object does not have an identity defined but still contains -some auto-generated attributes. -"*/ -{ - NSMutableArray *theAutoAttr = [NSMutableArray array]; - NSArray *theAttr = [classDescription attributes]; - NSArray *theKeyAttr = [classDescription primaryKeyAttributes]; - NSUInteger i,j; - NSMutableString *theQuery; - NSInteger theCheckCode; - MCPResult *theResult; - NSDictionary *theRow; - MCPConnection *theConnection = [self connection]; - - if (! theConnection) { - return MCPDBReturnNoConnection; - } - - if (0 != [[classDescription identityAttributes] count]) { - theCheckCode = [(NSNumber *)[[self checkDBId] objectForKey:@"MCPDBReturnCode"] integerValue]; - if ((MCPDBReturnOK != theCheckCode) && (MCPDBReturnMultiple != theCheckCode)) { - NSLog(@"Unable to get the primary key for the object, will abort now the fetch of autoGenerated attributes (left unchanged)!"); - return theCheckCode; - } - if (MCPDBReturnMultiple == theCheckCode) { - NSLog(@"Will get the autoGenerated values for the first entry...."); - } - } - j = 0; - for (i=0; [theAttr count] != i; ++i) { // generate the array with autoGenerated attributes. - if ([(MCPAttribute *)[theAttr objectAtIndex:i] autoGenerated]) { - [theAutoAttr insertObject:[theAttr objectAtIndex:i] atIndex:j]; - ++j; - } - } - if (0 == [theAutoAttr count]) { - return MCPDBReturnOK; - } - -// Make the query: - theQuery = [NSMutableString stringWithString:@"SELECT "]; - for (i=0; [theAutoAttr count] != i; ++i) { - if (i) { - [theQuery appendString:@", "]; - } - [theQuery appendString:[(MCPAttribute *)[theAutoAttr objectAtIndex:i] externalName]]; - } - [theQuery appendFormat:@" FROM %@ WHERE ", [classDescription externalName]]; -// Preparing the Where Clause: - for (i=0; [theKeyAttr count] != i; ++i) { - if (i) { - [theQuery appendString:@" AND "]; - } - [theQuery appendFormat:@"( %@ = %@ )", [(MCPAttribute*)[theKeyAttr objectAtIndex:i] externalName], [theConnection quoteObject:[self valueForKey:[(MCPAttribute*)[theKeyAttr objectAtIndex:i] name]]]]; - } -// Query is ready: - theResult = [theConnection queryString:theQuery]; - if (! theResult) { - NSLog(@"While fetching the auto-generated part of the object, got an error -a nil MCPResult-. Will report that as a MCPDBReturnNone."); - return MCPDBReturnNone; - } - if (0 == [theResult numOfRows]) { // The entry was not found in the DB. - if (0 == [[classDescription identityAttributes] count]) { - NSLog(@"It seems that the object is not in the DB... but the identity is not defined so there might be a trouble with having the proper ID."); - } - return MCPDBReturnNone; - } -// Getting the values from the DB select: - theRow = [theResult fetchRowAsDictionary]; - for (i=0; [theAutoAttr count] != i; ++i) { - [self setValue:[theRow objectForKey:[(MCPAttribute*)[theAutoAttr objectAtIndex:i] externalName]] forKey:[(MCPAttribute*)[theAutoAttr objectAtIndex:i] name]]; - } -// Returning the proper value: - if (1 != [theResult numOfRows]) { - NSLog(@"Multiple entries (or none : %llu), got the values for the first one...", [theResult numOfRows]); - return MCPDBReturnMultiple; - } - return MCPDBReturnOK; -} - - -- (MCPDBReturnCode) updateInDB -/*"This method will use the primary key value held by the object to modify the object that is saved in the DB. - - (NO YET IMPLEMENTED) If the primary key is not complete (some of the attributes are to null or 0) and the identityAttributes - (from class description) is not an empty list then it will perform a checkDBId... to try to retrieve the - missing part of the primary key. - "*/ -{ - NSArray *theAttributes = [classDescription attributes]; - NSArray *thePrimKeyAttributes = [classDescription primaryKeyAttributes]; - NSMutableString *theQuery = [NSMutableString string]; - NSInteger theCheckCode; - NSUInteger i, j; - MCPConnection *theConnection = [self connection]; - - if (! theConnection) { - return MCPDBReturnNoConnection; - } -// Generate the query - [theQuery appendFormat:@"UPDATE %@ SET ", [classDescription externalName]]; - // Prepare the value key pairs: - j=0; - for (i=0 ; [theAttributes count] != i; ++i) { - id theValue = [self valueForKey:[(MCPAttribute *)[theAttributes objectAtIndex:i] name]]; - - if ((theValue) && (! [(MCPAttribute *)[theAttributes objectAtIndex:i] autoGenerated])) { - if (j) { - [theQuery appendString:@", "]; - } - [theQuery appendFormat:@"%@ = %@ ", [(MCPAttribute *)[theAttributes objectAtIndex:i] externalName], [theConnection quoteObject:theValue]]; - ++j; - } - } - if (0 == j) { // Nothing has to be updated in this entry.... - NSLog(@"Tried to update a row from an object that does NOT contain any information!!"); - return MCPDBReturnNone; - } - // Prepare the WHERE clause: - [theQuery appendFormat:@" WHERE "]; - j = 0; - for (i=0; [thePrimKeyAttributes count] != i; ++i) { - id theValue = [self valueForKey:[(MCPAttribute *)[thePrimKeyAttributes objectAtIndex:i] name]]; - - if (j) { - [theQuery appendString:@" AND "]; - } - if (theValue) { - [theQuery appendFormat:@"%@ = %@", [(MCPAttribute *)[thePrimKeyAttributes objectAtIndex:i] externalName], [theConnection quoteObject:theValue]]; - ++j; - } - } -// Perform the update: - if (j == [thePrimKeyAttributes count]) { - [theConnection queryString:theQuery]; - i = [theConnection affectedRows]; - switch (i) { - case 0 : - theCheckCode = MCPDBReturnNone; - break; - case 1 : - theCheckCode = MCPDBReturnOK; - break; - default : - theCheckCode = MCPDBReturnMultiple; - break; - } - } - else { - NSDictionary *theKeyCheck = [self checkDBId]; - NSInteger theIdCheckCode = [(NSNumber *) [theKeyCheck objectForKey:@"MCPDBReturnCode"] integerValue]; - - if (MCPDBReturnOK == theIdCheckCode) { - theCheckCode = [self updateInDB]; - } - else { - theCheckCode = MCPDBReturnNoKey; - } - } -// Return proper code: - return theCheckCode; -} - - -- (MCPDBReturnCode) deleteInDB -/*" Uses the connection to delete the object from the DB. In this process the autoGenerated attributes are set to null. - If the primary key is not completely set, this method calls checkDBId... method to try to complete it - (if the identityAttributes of the class description is not empty)."*/ -{ - NSArray *theKeyAttributes = [classDescription primaryKeyAttributes]; - NSArray *theAttributes = [classDescription attributes]; - NSUInteger i; -// NSMutableDictionary *theKeyValue = [NSMutableDictionary dictionary]; - NSInteger theCheckCode = MCPDBReturnOK; - MCPConnection *theConnection = [self connection]; - - if (! theConnection) { - return MCPDBReturnNoConnection; - } -// Get the value of the primary key: - for (i=0; [theKeyAttributes count] != i; ++i) { - id theValue = [self valueForKey:[(MCPAttribute*) [theKeyAttributes objectAtIndex:i] name]]; - if ((! theValue) || ([theValue isKindOfClass:[NSNumber class]] && (0 == [theValue integerValue]))) { - theCheckCode = MCPDBReturnIncompleteKey; - break; - } - } -// If incomplete, try to find the rest, and perform again: - if (MCPDBReturnIncompleteKey == theCheckCode) { - if (MCPDBReturnOK == [(NSNumber *)[[self checkDBId] objectForKey:@"MCPDBReturnCode"] integerValue]) { - return [self deleteInDB]; - } - else { - return MCPDBReturnIncompleteKey; - } - } - -// Perform the deletion from the DB: - theCheckCode = [[self class] deleteInDBUsingConnection:theConnection withId:self]; - -// set the auto-generated attributes to proper values: - for (i=0 ; [theAttributes count] != i; ++i) { - MCPAttribute *theAttribute = (MCPAttribute *) [theAttributes objectAtIndex:i]; - if ([theAttribute autoGenerated]) { -// [self setValue:NULL forKey:[theAttribute name]]; - [self setValue:[self defaultValueForKey:[theAttribute name]] forKey:[theAttribute name]]; - } - } - -// Finished... just have to return the proper value: - return theCheckCode; -} - - -+ (MCPDBReturnCode) deleteInDBUsingConnection:(MCPConnection *) iConnection withId:(id) iId -/*" Uses the connection to remove from the DB the entry corresponding to the primary key id given by iId. - If any part of the primary key is missing, nothing is done."*/ -{ - NSMutableString *theQuery = [NSMutableString string]; - MCPClassDescription *theClassDescription = (MCPClassDescription *) [NSClassDescription classDescriptionForClass:[self class]]; - NSArray *theKeyAttributes = [theClassDescription primaryKeyAttributes]; - NSUInteger i; - - if (! [iConnection checkConnection]) { - return MCPDBReturnNoConnection; - } -// Generate the query: - [theQuery appendFormat:@"DELETE FROM %@ WHERE ", [theClassDescription externalName]]; -// Prepare the WHERE STATEMENT: - for (i=0; [theKeyAttributes count] != i; ++i) { - if (i) { - [theQuery appendString:@" AND "]; - } -// [theQuery appendFormat:@"( %@ = %@ )", [(MCPAttribute*)[theKeyAttributes objectAtIndex:i] externalName], [iConnection quoteObject:[iId objectForKey:[(MCPAttribute*)[theKeyAttributes objectAtIndex:i] name]]]]; - [theQuery appendFormat:@"( %@ = %@ )", [(MCPAttribute*)[theKeyAttributes objectAtIndex:i] externalName], [iConnection quoteObject:[iId valueForKey:[(MCPAttribute*)[theKeyAttributes objectAtIndex:i] name]]]]; - } -// Perform the query: - [iConnection queryString:theQuery]; -// Return the proper code: - i = [iConnection affectedRows]; - - if (1 < i) { - return MCPDBReturnMultiple; - } - if (0 == i) { - return MCPDBReturnNone; - } - return MCPDBReturnOK; -} - - -#pragma mark Handling realtions -- (id) getTargetOfRelation:(MCPRelation *) iRelation -/*" This method is using the information from iRelation to fetch the targe of the relation in the DB. - -If iRelation is flagged as a to-one, then the return type is the type of the target object (value might be nil, if the target was not found). -If iRelation is flagged as a to-many, then the return type is NSArray (and might be empty if no target were found). - -In any case this method is first checking that iRelation is starting from the class of self, and that self is connected to the DB. -Also the returned object is ALWAYS autoreleased before being returned. -"*/ -{ - NSMutableString *query; - MCPClassDescription *destinationDesc; - NSArray *joins; - NSArray *keys; - NSArray *ids; - MCPResult *result; - NSUInteger i; - NSDictionary *theRow; - id theRet; - - if (! iRelation) { - NSLog(@"Tried to get the target of a relation... but the relation object is nil"); - } - else { -// NSLog(@"Trying to get the target of the realtion : %@", [iRelation descriptionWithLocale:nil]); - } - if ((! [connection isConnected]) || (! [classDescription isEqual:[iRelation origin]])) { // Error condition. - return nil; - } -// Generating the query: - destinationDesc = [iRelation destination]; - keys = [destinationDesc primaryKeyAttributes]; - joins = [iRelation joins]; - ids = [destinationDesc identityAttributes]; - query = [[NSMutableString alloc] initWithString:@"SELECT "]; - for (i=0; [keys count] != i; ++i) { - if (i) { - [query appendString:@", "]; - } - [query appendString:[(MCPAttribute *)[keys objectAtIndex:i] externalName]]; - } - [query appendFormat:@" FROM %@ WHERE ", [destinationDesc externalName]]; - for (i=0; [joins count] != i; ++i) { - MCPJoin *theJoin = (MCPJoin *)[joins objectAtIndex:i]; - - if (i) { - [query appendString:@" and "]; - } - [query appendFormat:@"(%@ = %@)", [[theJoin destination] externalName], [connection quoteObject:[self valueForKey:[[theJoin origin] name]]]]; - } -// NSLog(@"in -[MCPObject getTargetOfRelation:%@]; query is %@...", [iRelation descriptionWithLocale:nil], query); - [query appendString:[self orderSQLForClassDescription:destinationDesc]]; -// NSLog(@"in -[MCPObject getTargetOfRelation:%@]; query is %@...", [iRelation descriptionWithLocale:nil], query); -/* - [query appendString:@" ORDER BY "]; - for (i=0; [ids count] != i; ++i) { // Generating the order : - if (i) { - [query appendString:@", "]; - } - [query appendString:[(MCPAttribute *)[ids objectAtIndex:i] externalName]]; - } -*/ - result = [connection queryString:query]; - [query release]; - -// Getting the results in proper objects: - if ([iRelation isToMany]) { // To-Many relation - NSMutableArray *theArrayRet = [[NSMutableArray alloc] init]; - - theRet = theArrayRet; - while (theRow = [result fetchRowAsDictionary]) { - MCPObject *theTarget = [[[destinationDesc representedClass] alloc] init]; - - [theTarget setPrimaryKey:theRow andFetchFromDB:connection]; - [theArrayRet insertObject:theTarget atIndex:[theArrayRet count]]; - [theTarget release]; - } - } - else { // To-One relation - theRow = [result fetchRowAsDictionary]; - if (theRow) { - theRet = [[[destinationDesc representedClass] alloc] init]; - [theRet setPrimaryKey:theRow andFetchFromDB:connection]; - } - else { - theRet = nil; - } - } - [theRet autorelease]; - return theRet; -} - -- (id) getTargetOfRelationNamed:(NSString *) iRelationName -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self getTargetOfRelation:theRelation] : nil; -} - -- (MCPDBReturnCode) setTarget:(id) iTarget forRelation:(MCPRelation *) iRelation -/*" This method will modify the DB content so that the corresponding relation is deleted. - If any value corresping to an attribute of self is modified in the DB, then it will update all attributes of self to reflect DB status. - -Obviuosly this method is taking care of only to-one relation. It will hence check that iRelation is a to-one relation starting from self. -Finally, you can use setTarget:nil forRelation:... to 'delete' a previously establlished relation (if the model and DB permit it)."*/ -{ - NSUInteger i; - MCPObject *oldTarget; - - if (! [connection isConnected]) { - return MCPDBReturnNoConnection; - } - if (! [classDescription isEqual:[iRelation origin]]) { - return MCPDBReturnWrongRelationOrigin; - } - if ([iRelation isToMany]) { - return MCPDBReturnWrongRelationCardinality; - } - - oldTarget = [self getTargetOfRelation:iRelation]; - if ((oldTarget) && ([iTarget isEqual:oldTarget])) { // No need to change the relation's target. - return MCPDBReturnOK; - } - for (i=0; [iRelation countOfJoins] != i; ++i) { - MCPJoin *theJoin = [iRelation objectInJoinsAtIndex:i]; - - if (([[theJoin origin] isPartOfKey]) && (![[theJoin destination] isPartOfKey])) { // Will change the destination... - [iTarget setValue:[self valueForKey:[[theJoin origin] name]] forKey:[[theJoin destination] name]]; - [oldTarget setValue:[oldTarget defaultValueForKey:[[theJoin destination] name]] forKey:[[theJoin destination] name]]; - } - else { // Will change the origin - [self setValue:[iTarget valueForKey:[[theJoin destination] name]] forKey:[[theJoin origin] name]]; - } - } - if ([iRelation ownsDestination]) { - [oldTarget deleteInDB]; - } - return MCPDBReturnOK; -} - -- (MCPDBReturnCode) setTarget:(id) iTarget forRelationNamed:(NSString *) iRelationName -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self setTarget:iTarget forRelation:theRelation] : MCPDBReturnNoSuchRelation; -} - -- (NSUInteger) countTargetForRelation:(MCPRelation *) iRelation -{ - NSMutableString *theQuery; - NSUInteger i; - NSArray *theJoinArray; - MCPResult *theResult; - NSDictionary *theRow; - - if ((! [connection isConnected]) || (! [classDescription isEqual:[iRelation origin]])){ - return 0; - } - theJoinArray = [iRelation joins]; - theQuery = [[NSMutableString alloc] initWithFormat:@"SELECT COUNT(1) FROM %@ WHERE ", [[iRelation destination] externalName]]; - for (i=0; [theJoinArray count] != i; ++i) { - MCPJoin *theJoin = (MCPJoin *)[theJoinArray objectAtIndex:i]; - if (i) { - [theQuery appendString:@" AND "]; - } - [theQuery appendFormat:@"( %@ = %@ )", [[theJoin destination] externalName], [connection quoteObject:[self valueForKey:[[theJoin origin] name]]]]; - } - theResult = [connection queryString:theQuery]; - [theQuery release]; - theRow = [theResult fetchRowAsDictionary]; - return [(NSNumber *)[theRow objectForKey:@"COUNT(1)"] unsignedIntegerValue]; -} - -- (NSUInteger) countTargetForRelationNamed:(NSString *) iRelationName -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self countTargetForRelation:theRelation] : 0; -} - - -- (MCPObject *) getTargetOfRelation:(MCPRelation *) iRelation atIndex:(NSUInteger) iIndex -/*" This method will return the specific object which is the iIndex'th object of th relation (after ordering the object using the destination identity). - -This method (like other assuming order in the relation targets) will be doubtfull if the class does NOT have a single identity attribute."*/ -{ - NSMutableString *query; - MCPClassDescription *destinationDesc; - NSArray *joins; - NSArray *keys; - NSArray *ids; - MCPResult *result; - NSUInteger i; - NSDictionary *theRow; - MCPObject *theRet; - - if (! iRelation) { - NSLog(@"Tried to get the target of a relation... but the relation object is nil"); - } - else { -// NSLog(@"Trying to get the target of the realtion : %@", [iRelation descriptionWithLocale:nil]); - } - if ((! [connection isConnected]) || (! [classDescription isEqual:[iRelation origin]])) { // Error condition. - return nil; - } - if (! [iRelation isToMany]) { - NSLog(@"Tried to use the -[MCPObject getTargetOfRelation:atIndex:] on a to-one relation... this does NOT works!!! You should use -[MCPObject getTargetOfRelation:] instead!!!"); - return [self getTargetOfRelation:iRelation]; - } -// Generating the query: - destinationDesc = [iRelation destination]; - keys = [destinationDesc primaryKeyAttributes]; - joins = [iRelation joins]; - ids = [destinationDesc identityAttributes]; - query = [[NSMutableString alloc] initWithString:@"SELECT "]; - for (i=0; [keys count] != i; ++i) { - if (i) { - [query appendString:@", "]; - } - [query appendString:[(MCPAttribute *)[keys objectAtIndex:i] externalName]]; - } - [query appendFormat:@" FROM %@ WHERE ", [destinationDesc externalName]]; - for (i=0; [joins count] != i; ++i) { - MCPJoin *theJoin = (MCPJoin *)[joins objectAtIndex:i]; - - if (i) { - [query appendString:@" and "]; - } - [query appendFormat:@"(%@ = %@)", [[theJoin destination] externalName], [connection quoteObject:[self valueForKey:[[theJoin origin] name]]]]; - } - [query appendString:[self orderSQLForClassDescription:destinationDesc]]; -/* - [query appendString:@" ORDER BY "]; - for (i=0; [ids count] != i; ++i) { // Generating the order : - if (i) { - [query appendString:@", "]; - } - [query appendString:[(MCPAttribute *)[ids objectAtIndex:i] externalName]]; - } -*/ - [query appendFormat:@" LIMIT 1 OFFSET %ld", iIndex]; - result = [connection queryString:query]; - [query release]; - -// Getting the results in proper objects: - theRow = [result fetchRowAsDictionary]; - if (theRow) { - theRet = (MCPObject *)[[[destinationDesc representedClass] alloc] init]; - [theRet setPrimaryKey:theRow andFetchFromDB:connection]; - [theRet autorelease]; - } - else { - theRet = nil; - } - return theRet; -} - -- (MCPObject *) getTargetOfRelationNamed:(NSString *) iRelationName atIndex:(NSUInteger) iIndex -/*"This is the equivalent of the getTargetOfRelation:atIndex:, but giving a relation name instead of the MCPRelation object itself."*/ -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self getTargetOfRelation:theRelation atIndex:iIndex]: nil; -} - -- (MCPDBReturnCode) addTarget:(MCPObject *) iTarget toRelation:(MCPRelation *) iRelation -/*" This method will modify the DB content so that the corresponding relation is added. -If any value corresping to an attribute of self i modified in the DB, then it will update all attributes of self to reflect DB status. - -Obviuosly this method is taking care of only to-many relation. It will hence check that iRelation is a to-many relation starting from self."*/ -{ - NSArray *joins; - NSUInteger i; - NSDictionary *saveReturn; - - if (! [connection isConnected]) { - return MCPDBReturnNoConnection; - } - if (! [classDescription isEqual:[iRelation origin]]) { - return MCPDBReturnWrongRelationOrigin; - } - if (! [iRelation isToMany]) { - return MCPDBReturnWrongRelationCardinality; - } - joins = [iRelation joins]; - for (i=0; [joins count] != i; ++i) { // Will change only values of iTarget, because it is a to-many relation. - MCPJoin *join = (MCPJoin *)[joins objectAtIndex:i]; - - [iTarget setValue:[self valueForKey:[[join origin] name]] forKey:[[join destination] name]]; - } - if (! [[iTarget connection] isConnected]) { - [iTarget setConnection:connection]; - } - saveReturn = [iTarget saveInDB]; - return (MCPDBReturnCode)[(NSNumber *)[saveReturn objectForKey:@"MCPDBReturnCode"] unsignedIntegerValue]; -} - -- (MCPDBReturnCode) addTarget:(MCPObject *) iTarget toRelationNamed:(NSString *) iRelationName -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self addTarget:iTarget toRelation:theRelation] : MCPDBReturnNoSuchRelation; -} - -- (MCPDBReturnCode) removeTarget:(MCPObject *) iTarget toRelation:(MCPRelation *) iRelation -/*" This method will modify the DB content so that the corresponding relation is removed. -If any value corresping to an attribute of self i modified in the DB, then it will update all attributes of self to reflect DB status. - -Obviuosly this method is taking care of only to-many relation. It will hence check that iRelation is a to-many relation starting from self."*/ -{ - NSArray *joins; - NSUInteger i; -// NSDictionary *saveReturn; - BOOL targetIsTarget = YES; - MCPDBReturnCode returnCode; - - if (! [connection isConnected]) { - return MCPDBReturnNoConnection; - } - if (! [classDescription isEqual:[iRelation origin]]) { - return MCPDBReturnWrongRelationOrigin; - } - if (! [iRelation isToMany]) { - return MCPDBReturnWrongRelationCardinality; - } - joins = [iRelation joins]; - for (i=0; [joins count] != i; ++i) { - MCPJoin *join = (MCPJoin *)[joins objectAtIndex:i]; - targetIsTarget = targetIsTarget && [[iTarget valueForKey:[[join destination] name]] isEqual:[self valueForKey:[[join origin] name]]]; - } - if (! targetIsTarget) { - return MCPDBReturnNotTarget; - } - if ([iRelation ownsDestination]) { // just delete the target from the DB. - returnCode = [iTarget deleteInDB]; - } - for (i=0; [joins count] != i; ++i) { // Put all the destination to default... - MCPJoin *join = (MCPJoin *)[joins objectAtIndex:i]; - - [iTarget setValue:[[join destination] defaultValue] forKey:[[join destination] name]]; - } - if (! [iRelation ownsDestination]) { - returnCode = [(NSNumber *)[[iTarget saveInDB] objectForKey:@"MCPDBReturnCode"] unsignedIntegerValue]; - } - return returnCode; -} - -- (MCPDBReturnCode) removeTarget:(MCPObject *) iTarget toRelationNamed:(NSString *) iRelationName -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self removeTarget:iTarget toRelation:theRelation] : MCPDBReturnNoSuchRelation; -} - -- (MCPDBReturnCode) removeTargetToRelation:(MCPRelation *) iRelation atIndex:(NSUInteger) iIndex -/*" This method will use an index t first query the object that it should remove from the relation, then uses the -[MCPObject removeTarget:toRelation:] - method to remove the object from the relation. If the index is out of bound (the returned object is nil), it will return MCPDBReturnNone, to signal - there was no object with this index in the relation."*/ -{ - MCPObject *target; - - if (! [connection isConnected]) { - return MCPDBReturnNoConnection; - } - if (! [classDescription isEqual:[iRelation origin]]) { - return MCPDBReturnWrongRelationOrigin; - } - if (! [iRelation isToMany]) { - return MCPDBReturnWrongRelationCardinality; - } - target = [self getTargetOfRelation:iRelation atIndex:iIndex]; - if (target) { - return [self removeTarget:target toRelation:iRelation]; - } - else { - return MCPDBReturnNone; - } -} - -- (MCPDBReturnCode) removeTargetToRelationNamed:(NSString *) iRelationName atIndex:(NSUInteger) iIndex -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self removeTargetToRelation:theRelation atIndex:iIndex] : MCPDBReturnNoSuchRelation; -} - -- (NSUInteger) indexOfTarget:(MCPObject *) iTarget inRelation:(MCPRelation *) iRelation -/*" Returns the index of the target object within the relation. Return NSNotFound if the objkect is NOT in the relation!!"*/ -{ - NSMutableString *query; - NSArray *joins; - NSArray *keys; - NSArray *ids; - NSUInteger i; - MCPResult *result; - NSDictionary *row; - NSMutableDictionary *targetKey; - BOOL targetIsTarget = YES; - - if ((! [connection isConnected]) || (! [classDescription isEqual:[iRelation origin]]) || (! [iRelation isToMany])) { // Checking the realtion object. - return NSNotFound; - } - query = [[NSMutableString alloc] initWithString:@"SELECT "]; - joins = [iRelation joins]; -// keys = [[iRelation destination] attributeKeys]; - keys = [[iRelation destination] primaryKeyAttributes]; - ids = [[iRelation destination] identityAttributes]; - for (i=0; [keys count] != i; ++i) { - if (i) { - [query appendString:@", "]; - } - [query appendString:[(MCPAttribute *)[keys objectAtIndex:i] externalName]]; - } - [query appendFormat:@"FROM %@ WHERE ", [[iRelation destination] externalName]]; - for (i=0; [joins count] != i; ++i) { - MCPJoin *join = (MCPJoin *)[joins objectAtIndex:i]; - - targetIsTarget = targetIsTarget && [[iTarget valueForKey:[[join destination] name]] isEqual:[self valueForKey:[[join origin] name]]]; - if (i) { - [query appendString:@" AND "]; - } - [query appendFormat:@"( %@ = %@ )", [[join destination] externalName], [connection quoteObject:[self valueForKey:[[join origin] name]]]]; - } - if (! targetIsTarget) { // Checking that iTarget belongs to the relation. - [query release]; - return NSNotFound; - } - [query appendString:[self orderSQLForClassDescription:[iRelation destination]]]; -/* - [query appendString:@" ORDER BY "]; - for (i=0; [ids count] != i; ++i) { - if (i) { - [query appendString:@", "]; - } - [query appendString:[(MCPAttribute *)[ids objectAtIndex:i] externalName]]; - } -*/ - targetKey = [[NSMutableDictionary alloc] init]; - for (i=0; [keys count] != i; ++i) { // Setting the targetKey to the row that should gives the target. - MCPAttribute *attribute = (MCPAttribute *)[keys objectAtIndex:i]; - - [targetKey setObject:[iTarget valueForKey:[attribute name]] forKey:[attribute externalName]]; - } - result = [connection queryString:query]; - [query release]; - i = 0; - while (row = [result fetchRowAsDictionary]) { - if ([targetKey isEqualToDictionary:row]) { // We have found the proper object return i (after cleaning up); - [targetKey release]; - return i; - } - ++i; - } - return NSNotFound; -} - -- (NSUInteger) indexOfTarget:(MCPObject *) iTarget inRelationNamed:(NSString *) iRelationName -/*" The equivalent of -[MCPObject indexOfTarget:inRelation:] but using relation name instead of a MCPRelation -object. Indeed after getting the MCPRelation object corresponding to the name, this method will only return -the result of the corresponding call to -[MCPObject indexOfTarget:inRelation:]."*/ -{ - MCPRelation *theRelation = [classDescription relationWithName:iRelationName]; - return (theRelation) ? [self indexOfTarget:iTarget inRelation:theRelation] : NSNotFound; -} - -#pragma mark Utility methods -- (id) defaultValueForKey:(NSString *) iKey -/*" This method will return the default value (object) for the given key."*/ -{ - MCPAttribute *theAttribute = [classDescription attributeWithName:iKey]; - - if ([theAttribute allowsNull]) { -// return [NSNull null]; - return nil; - } - else { - Class theAttrClass = [theAttribute valueClass]; - id theRet; - - if ([theAttrClass isSubclassOfClass:[NSNumber class]]) { - return [NSNumber numberWithInteger:0]; - } - theRet = [[[theAttrClass alloc] init] autorelease]; - if (nil == theRet) { - NSLog(@"in MCPObject defaultValueForKey:%@ , for object of class %@, (attribute of class %@) the return value will be nil!!!", iKey, [self className], theAttrClass); - } - return theRet; - } -} - - -- (NSDictionary *) primaryKey -/*" Returns a dictionary with the values of the primary key. "*/ -{ - NSMutableDictionary *theRet = [NSMutableDictionary dictionary]; - NSArray *theIdAttr = [classDescription primaryKeyAttributes]; - NSUInteger i; - - for (i=0; [theIdAttr count] != i; ++i) { - NSString *theKey = [(MCPAttribute *)[theIdAttr objectAtIndex:i] name]; - - if ([self valueForKey:theKey]) { - [theRet setObject:[self valueForKey:theKey] forKey:theKey]; - } - else { - [theRet setObject:[NSNull null] forKey:theKey]; - } - } - return [NSDictionary dictionaryWithDictionary:theRet]; -} - -#pragma mark Testing equality (VERY important for relation management) -- (BOOL) isEqual:(id) iObject -{ - NSArray *theIdAttr; - NSUInteger i; - BOOL theRet; - - if (self == iObject) { - return YES; - } - if ([self class] != [iObject class]) { - return NO; - } - theIdAttr = [classDescription identityAttributes]; - for (i = 0; [theIdAttr count] != i; ++i) { - MCPAttribute *theAttr = [theIdAttr objectAtIndex:i]; - - theRet = theRet && [[self valueForKey:[theAttr name]] isEqual:[iObject valueForKey:[theAttr name]]]; - } - return theRet; -} - - -#pragma mark Output -- (NSString *) description -{ - return [self descriptionWithLocale:nil]; -} - -- (NSString *) descriptionWithLocale:(NSDictionary *) locale -{ - NSMutableString *theOutput = [NSMutableString string]; - NSUInteger i; - NSArray *theAttributes = [classDescription attributes]; - BOOL trunc = [MCPConnection truncateLongField]; - - [theOutput appendFormat:@"MCPObject subclass : %@\n", [self className]]; - - for (i = 0; [theAttributes count] != i; ++i) - { - MCPAttribute *theAttribute = (MCPAttribute *) [theAttributes objectAtIndex:i]; - id theValue = [self valueForKey:[theAttribute name]]; - - if (trunc) { - if (([theValue isKindOfClass:[NSString class]]) && (kLengthOfTruncationForLog < [(NSString *)theValue length])) { - theValue = [theValue substringToIndex:kLengthOfTruncationForLog]; - } - else if (([theValue isKindOfClass:[NSData class]]) && (kLengthOfTruncationForLog < [(NSData *)theValue length])) { - theValue = [NSData dataWithBytes:[theValue bytes] length:kLengthOfTruncationForLog]; - } - } - - [theOutput appendFormat:@"\tAttribute %ld : name = %@, value = %@\n", i, [theAttribute name], theValue]; - } - - [theOutput appendString:@"\n"]; - - return theOutput; -} - -#pragma mark Ordering the array for relations -- (NSString *) orderSQLForClassDescription:(MCPClassDescription *) iClassDescription -{ - NSMutableArray *theAttributes = [[NSMutableArray alloc] initWithArray:[iClassDescription identityAttributes]]; - NSMutableString *theReturn = [NSMutableString string]; - NSUInteger i; - - for (i = 0; [[iClassDescription primaryKeyAttributes] count] != i; ++i) { - [theAttributes insertObject:[[iClassDescription primaryKeyAttributes] objectAtIndex:i] atIndex:[theAttributes count]]; - } - for (i = 0; [theAttributes count] != i; ++i) { - if (i) { - [theReturn appendString:@", "]; - } - else { - [theReturn appendString:@" ORDER BY "]; - } - [theReturn appendString:[(MCPAttribute *)[theAttributes objectAtIndex:i] externalName]]; - } - return theReturn; -} - -#pragma mark Anti-crash method... -- (void) setNilValueForKey:(NSString *) iKey -{ - NSLog(@"Try to set %@ to nil .... not possible, will set it to zero instead...", iKey); - [self setValue:[NSNumber numberWithInteger:0] forKey:iKey]; -} - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation+Private.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation+Private.h deleted file mode 100644 index 2d3a7d8d..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation+Private.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// $Id$ -// -// MCPRelation+Private.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 11/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPRelation.h" - -@interface MCPRelation (Private) - -#pragma mark Making some work -- (void) invalidateJoins; // Check that the joins are realistics. - -#pragma mark Setters -- (void) setOrigin:(MCPClassDescription *) iOrigin; -//- (void) setJoins:(NSArray *) iJoins; - -#pragma mark Getters -- (MCPModel *) model; - -#pragma mark Fro the controller layer and the UI -- (void) addNewDefaultJoin; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation.h b/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation.h deleted file mode 100644 index 118734eb..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation.h +++ /dev/null @@ -1,112 +0,0 @@ -// -// $Id$ -// -// MCPRelation.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 11/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -@class MCPModel; -@class MCPClassDescription; -@class MCPAttribute; -@class MCPJoin; - -typedef enum { - OnDeleteNullify = 1, - OnDeleteDeny = 2, - OnDeleteCascade = 3, - OnDeleteDefault = 4, - OnDeleteNoAction = 5 -} MCPRelationDeleteRule; - -@interface MCPRelation : NSObject <NSCoding> -{ -@protected - NSString *name; // Name of the relation - MCPRelationDeleteRule deleteRule; // Delete rule : what to do of the destination when origin is deleted - MCPRelation *inverseRelation; // The inverse relation (or nil if no inverse present) - MCPClassDescription *origin; // The class description from which the relation originate - MCPClassDescription *destination; // The class description to which the relation arrives - NSMutableArray *joins; // Joining attributes (array of MCPJoin) - BOOL isToMany; // Is the relation to many (or to one) - BOOL isMandatory; // Is the relation mandatory for the class description (origin) - BOOL ownsDestination; // The origin class description owns the destination class description(ies) -} - -#pragma mark Class methods -+ (void) initialize; - -+ (NSArray *) existingDeleteRules; -- (NSArray *) existingDeleteRules; - -#pragma mark Life cycle -- (id) initWithName:(NSString *) iName from:(MCPClassDescription *) iFrom to:(MCPClassDescription *) iTo; -- (void) invalidateRelation; -- (void) dealloc; - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder; -- (void) encodeWithCoder:(NSCoder *) encoder; - -#pragma mark Managing joins -//- (MCPJoin *) addNewJoin; -- (MCPJoin *) addJoinFrom:(MCPAttribute *) iFrom to:(MCPAttribute *) iTo; -- (void) removeJoinFrom:(MCPAttribute *) iFrom to:(MCPAttribute *) iTo; -//- (void) unjoinAttribute:(MCPAttribute *) iAttribute; - -#pragma mark Setters -- (void) setDestination:(MCPClassDescription *) iDestination; -- (void) setName:(NSString *) iName; -- (void) setDeleteRule:(MCPRelationDeleteRule) iDeleteRule; -- (void) setInverseRelation:(MCPRelation *) iInverseRelation; -- (void) insertObject:(MCPJoin *) iJoin inJoinsAtIndex:(NSUInteger) index; -- (void) removeObjectFromJoinsAtIndex:(NSUInteger) index; -- (void) setIsToMany:(BOOL) iIsToMany; -- (void) setIsMandatory:(BOOL) iIsMandatory; -- (void) setOwnsDestintation:(BOOL) iOwnsDestination; - -#pragma mark Getters -- (NSString *) name; -- (MCPRelationDeleteRule) deleteRule; -- (MCPRelation *) inverseRelation; -- (MCPClassDescription *) origin; -- (MCPClassDescription *) destination; -- (NSArray *) joins; -- (NSUInteger) countOfJoins; -- (MCPJoin *) objectInJoinsAtIndex:(NSUInteger) index; -- (NSUInteger) indexOfJoinIdenticalTo:(id) iJoin; -- (BOOL) isToMany; -- (BOOL) isMandatory; -- (BOOL) ownsDestination; - -#pragma mark Some Usefull methods -- (MCPAttribute *) destinationAttributeForOrigin:(MCPAttribute *) iFrom; -- (MCPAttribute *) originAttributeForDestination:(MCPAttribute *) iTo; - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject; -- (NSString *) descriptionWithLocale:(NSDictionary *) locale; - -@end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation.m b/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation.m deleted file mode 100644 index 6d1e58f4..00000000 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPRelation.m +++ /dev/null @@ -1,486 +0,0 @@ -// -// $Id$ -// -// MCPRelation.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 11/08/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPRelation.h" -#import "MCPRelation+Private.h" - -#import "MCPEntrepriseNotifications.h" - -#import "MCPModel.h" -#import "MCPClassDescription.h" -#import "MCPClassDescription+Private.h" -#import "MCPAttribute.h" - -#import "MCPJoin.h" - -static NSArray *MCPexistingDeleteRules; - -@implementation MCPRelation - -#pragma mark Class methods -+ (void) initialize -{ - if (self = [MCPRelation class]) { - NSMutableArray *theExistingDeleteRules = [[NSMutableArray alloc] init]; - - [self setVersion:010101]; // Ma.Mi.Re -> MaMiRe - - [theExistingDeleteRules addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInteger:OnDeleteNullify], @"tag", @"Nullify", @"name", nil]]; - [theExistingDeleteRules addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInteger:OnDeleteDeny], @"tag", @"Deny", @"name", nil]]; - [theExistingDeleteRules addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInteger:OnDeleteCascade], @"tag", @"Cascade", @"name", nil]]; - [theExistingDeleteRules addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInteger:OnDeleteDefault], @"tag", @"Default", @"name", nil]]; - [theExistingDeleteRules addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInteger:OnDeleteNoAction], @"tag", @"No Action", @"name", nil]]; - MCPexistingDeleteRules = [[NSArray alloc] initWithArray:theExistingDeleteRules]; - [theExistingDeleteRules release]; - } - return; -} - -+ (NSArray *) existingDeleteRules -{ - return MCPexistingDeleteRules; -} - -- (NSArray *) existingDeleteRules -{ - return [MCPRelation existingDeleteRules]; -} - - -#pragma mark Life cycle -- (id) initWithName:(NSString *) iName from:(MCPClassDescription *) iFrom to:(MCPClassDescription *) iTo -{ - self = [super init]; - if (self) { - [self setName:iName]; - [self setOrigin:iFrom]; - [self setDestination:iTo]; - joins = [[NSMutableArray alloc] init]; - } - return self; -} - -- (void) invalidateRelation -{ - [self retain]; // To be sure not to be released before the end of the method - [self invalidateJoins]; // Remove each of the joins (so that attributes get notified) -/* - [origin removeObjectFromRelationsAtIndex:[[origin relations] indexOfObjectIdenticalTo:self]]; - origin = nil; - [destination removeObjectFromIncomingsAtIndex:[[destination incomings] indexOfObjectIdenticalTo:self]]; - destination = nil; -*/ - [self setOrigin:nil]; - [self setDestination:nil]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - [self release]; -} - -- (void) dealloc -{ - [joins release]; // Should be empty by now... - [name release]; -// The inverse relation don't have an inverse relation any more... -// [inverseRelation setInverseRelation:nil]; - [self setInverseRelation:nil]; -// Other are weak references. - [super dealloc]; -} - -#pragma mark NSCoding protocol -- (id) initWithCoder:(NSCoder *) decoder -{ - self = [super init]; - if ((self) && ([decoder allowsKeyedCoding])) { - [self setName:[decoder decodeObjectForKey:@"MCPname"]]; - [self setDeleteRule:(MCPRelationDeleteRule)[decoder decodeInt32ForKey:@"MCPdeleteRule"]]; - if ([decoder containsValueForKey:@"MCPinverseRelation"]) { - [self setInverseRelation:[decoder decodeObjectForKey:@"MCPinverseRelation"]]; - } - else { - [self setInverseRelation:nil]; - } - [self setOrigin:[decoder decodeObjectForKey:@"MCPorigin"]]; - [self setDestination:[decoder decodeObjectForKey:@"MCPdestination"]]; -// [self setJoins:[decoder decodeObjectForKey:@"MCPjoins"]]; - joins = [[NSMutableArray alloc] initWithArray:[decoder decodeObjectForKey:@"MCPjoins"]]; - [self setIsToMany:[decoder decodeBoolForKey:@"MCPisToMany"]]; - [self setIsMandatory:[decoder decodeBoolForKey:@"MCPisMandatory"]]; - [self setOwnsDestintation:[decoder decodeBoolForKey:@"MCPownsDestination"]]; - } - - return self; -} - -- (void) encodeWithCoder:(NSCoder *) encoder -{ - if (! [encoder allowsKeyedCoding]) { - NSLog(@"In MCPRelation -encodeWithCoder : Unable to encode to a non-keyed encoder!!, will not perform encoding!!"); - return; - } - [encoder encodeObject:[self name] forKey:@"MCPname"]; - [encoder encodeInt32:(int32_t)[self deleteRule] forKey:@"MCPdeleteRule"]; - if ([self inverseRelation]) { - [encoder encodeObject:[self inverseRelation] forKey:@"MCPinverseRelation"]; - } - [encoder encodeObject:[self origin] forKey:@"MCPorigin"]; - [encoder encodeObject:[self destination] forKey:@"MCPdestination"]; - [encoder encodeObject:[self joins] forKey:@"MCPjoins"]; - [encoder encodeBool:[self isToMany] forKey:@"MCPisToMany"]; - [encoder encodeBool:[self isMandatory] forKey:@"MCPisMandatory"]; - [encoder encodeBool:[self ownsDestination] forKey:@"MCPownsDestination"]; -} - -#pragma mark Making new joins -/* -- (MCPJoin *) addNewJoin // Usefull for the interface, to be able to create a new join by just using a binding. -{ - [self addJoinFrom:[origin objectInAttributesAtIndex:0] to:[destination objectInAttributesAtIndex:0]]; -} -*/ - -- (MCPJoin *) addJoinFrom:(MCPAttribute *) iFrom to:(MCPAttribute *) iTo -{ - MCPJoin *theJoin; - - if ([iFrom classDescription] != [self origin]) { - NSLog(@"Tried to make a join starting from an attribute (%@) that does NOT belong to the origin class description (%@)! Will not perform the link", iFrom, [self origin]); - return nil; - } - if ([iTo classDescription] != [self destination]) { - NSLog(@"Tried to make a join arriving to an attribute (%@) that does NOT belong to the destination class description (%@)! Will not perform the link", iTo, [self destination]); - return nil; - } - theJoin = [[MCPJoin alloc] initForRelation:self from:iFrom to:iTo]; -// theJoin = [[MCPJoin alloc] initFrom:iFrom to:iTo]; -// [joins addObject:theJoin]; - [joins insertObject:theJoin atIndex:[joins count]]; - [theJoin release]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - return theJoin; -} - -- (void) removeJoinFrom:(MCPAttribute *) iFrom to:(MCPAttribute *) iTo -{ - NSDictionary *theJoinDict = [[NSDictionary alloc] initWithObjectsAndKeys:self, @"relation", iFrom, @"origin", iTo, @"destination", nil]; - NSUInteger i = [joins indexOfObject:theJoinDict]; - - if (NSNotFound != i) { - [[self objectInJoinsAtIndex:i] invalidate]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } - [theJoinDict release]; -} - -/* -- (void) unjoinAttribute:(MCPAttribute *) iAttribute -{ - unsigned int i = 0; - -#warning HAVE to rewrite this code!!! - if ([[iAttribute classDescription] isEqual:origin]) { - for (i=0; ([joins count] != i) && ([iAttribute isEqual:[(MCPJoin *)[joins objectAtIndex:i] origin]]); ++i) { - } - } - if ([[iAttribute classDescription] isEqual:destination]) { - for (i=0; ([joins count] != i) && ([iAttribute isEqual:[(MCPJoin *)[joins objectAtIndex:i] destination]]); ++i) { - } - } - if ((0 == i) || ([joins count] == i)) { // No joins found using this attribute. - return; - } - [self removeJoinFrom:[(MCPJoin *)[joins objectAtIndex:i] origin] to:[(MCPJoin *)[joins objectAtIndex:i] destination]]; -} -*/ - -#pragma mark Setters -- (void) setDestination:(MCPClassDescription *) iDestination -{ - if (iDestination != destination) { - [destination removeObjectFromIncomingsAtIndex:[[destination incomings] indexOfObjectIdenticalTo:self]]; - destination = iDestination; - [destination insertObject:self inIncomingsAtIndex:0]; - [self invalidateJoins]; - } -} - - -- (void) setName:(NSString *) iName -{ - if (iName != name) { - [name release]; - name = [iName retain]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[origin model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:origin]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} - -- (void) setDeleteRule:(MCPRelationDeleteRule) iDeleteRule -{ - if (iDeleteRule != deleteRule) { // Don't do the notification for nothing!!! - deleteRule = iDeleteRule; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[origin model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:origin]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} - -- (void) setInverseRelation:(MCPRelation *) iInverseRelation -{ - if (iInverseRelation != inverseRelation) { - [inverseRelation release]; - inverseRelation = [iInverseRelation retain]; - [inverseRelation setInverseRelation:self]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[origin model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:origin]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} - -- (void) insertObject:(MCPJoin *) iJoin inJoinsAtIndex:(NSUInteger) index -{ - [joins insertObject:iJoin atIndex:index]; -} - -- (void) removeObjectFromJoinsAtIndex:(NSUInteger) index -{ - [joins removeObjectAtIndex:index]; -} - -- (void) setIsToMany:(BOOL) iIsToMany -{ - if (iIsToMany != isToMany) { // Don't do the notification for nothing!!! - isToMany = iIsToMany; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[origin model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:origin]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} - -- (void) setIsMandatory:(BOOL) iIsMandatory -{ - if (iIsMandatory != isMandatory) { // Don't do the notification for nothing!!! - isMandatory = iIsMandatory; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[origin model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:origin]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} - -- (void) setOwnsDestintation:(BOOL) iOwnsDestination -{ - if (iOwnsDestination != ownsDestination) { // Don't do the notification for nothing!!! - ownsDestination = iOwnsDestination; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPModelChangedNotification object:[origin model]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPClassDescriptionChangedNotification object:origin]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} - -#pragma mark Getters -- (NSString *) name -{ - return name; -} - -- (MCPRelationDeleteRule) deleteRule -{ - return deleteRule; -} - -- (MCPRelation *) inverseRelation -{ - return inverseRelation; -} - -- (MCPClassDescription *) origin -{ - return origin; -} - -- (MCPClassDescription *) destination -{ - return destination; -} - -- (NSArray *) joins -{ - return [NSArray arrayWithArray:joins]; -} - -- (NSUInteger) countOfJoins -{ - return [joins count]; -} - -- (MCPJoin *) objectInJoinsAtIndex:(NSUInteger) index -{ - return (MCPJoin *)((NSNotFound != index) ? [joins objectAtIndex:index] : nil); -} - -- (NSUInteger) indexOfJoinIdenticalTo:(id) iJoin -{ - return [joins indexOfObjectIdenticalTo:iJoin]; -} - -- (BOOL) isToMany -{ - return isToMany; -} - -- (BOOL) isMandatory -{ - return isMandatory; -} - -- (BOOL) ownsDestination -{ - return ownsDestination; -} - -#pragma mark Some Usefull methods - -- (MCPAttribute *) destinationAttributeForOrigin:(MCPAttribute *) iFrom -{ - NSUInteger i; - - for (i=0; ([joins count] != i) && ([[(MCPJoin *)[joins objectAtIndex:i] origin] isEqual:iFrom]); ++i) { - } - return ([joins count] == i) ? nil : [(MCPJoin *)[joins objectAtIndex:i] destination]; -} - -- (MCPAttribute *) originAttributeForDestination:(MCPAttribute *) iTo -{ - NSUInteger i; - - for (i=0; ([joins count] != i) && ([[(MCPJoin *)[joins objectAtIndex:i] destination] isEqual:iTo]); ++i) { - } - return ([joins count] == i) ? nil : [(MCPJoin *)[joins objectAtIndex:i] origin]; -} - - -#pragma mark Some general methods: -- (BOOL) isEqual:(id) iObject -// Equal to another relation, if they have the same name and same origin and destination class descriptions (they have the same names). -// Equal to a string (NSString), if the name of the relation is equal to the string. -{ - if ([iObject isKindOfClass:[MCPRelation class]]) { - MCPRelation *theRelation = (MCPRelation *) iObject; - - return ([name isEqualToString:[theRelation name]]) && ([[self origin] isEqual:[theRelation origin]]) && ([[self destination] isEqual:[theRelation destination]]); - } - if ([iObject isKindOfClass:[NSString class]]) { - return [name isEqualToString:(NSString *)iObject]; - } - return NO; -} - -- (NSString *) descriptionWithLocale:(NSDictionary *) locale -{ - NSMutableString *theRet = [NSMutableString stringWithFormat:@"MCPRelation named %@, going from %@ to %@. Joins :\n", name, [origin name], [destination name]]; - NSUInteger i; - - for (i = 0; [joins count] != i; ++i) { - MCPJoin *tmpJoin = (MCPJoin *)[joins objectAtIndex:i]; - [theRet appendFormat:@"\t\t%@ == %@\n", [[tmpJoin origin] name], [[tmpJoin destination] name]]; - } - return theRet; -} - - -#pragma mark For debugging the retain counting -- (id) retain -{ - [super retain]; - return self; -} - -- (void) release -{ - [super release]; - return; -} - -@end - -@implementation MCPRelation (Private) - -#pragma mark Making some work -- (void) invalidateJoins -{ - while ([joins count]) { - [[self objectInJoinsAtIndex:0] invalidate]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; -} - -#pragma mark Setters -- (void) setOrigin:(MCPClassDescription *) iOrigin -{ - if (iOrigin != origin) { - [origin removeObjectFromRelationsAtIndex:[[origin relations] indexOfObjectIdenticalTo:self]]; - origin = iOrigin; - [origin insertObject:self inRelationsAtIndex:[origin countOfRelations]]; - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - [self invalidateJoins]; - } -} - -/* -- (void) setJoins:(NSArray *) iJoins -{ - if (iJoins != joins) { - unsigned int i; - if (joins) { - [self invalidateJoins]; - } - else { - joins = [[NSMutableArray alloc] init]; - } - for (i=0; [iJoins count] != i; ++i) { - [self addJoinFrom:[(MCPJoin *)[iJoins objectAtIndex:i] origin] to:[(MCPJoin *)[iJoins objectAtIndex:i] destination]]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:MCPRelationChangedNotification object:self]; - } -} -*/ - -#pragma mark Getters -- (MCPModel *) model -{ - return [origin model]; -} - -#pragma mark Fro the controller layer and the UI -- (void) addNewDefaultJoin // Usefull for the interface, to be able to create a new join by just using a binding. -{ - [self addJoinFrom:[origin objectInAttributesAtIndex:0] to:[destination objectInAttributesAtIndex:0]]; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h deleted file mode 100644 index 0b3f932b..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.h +++ /dev/null @@ -1,282 +0,0 @@ -// -// $Id$ -// -// MCPConnection.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2001. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> -#import <pthread.h> - -#import "MCPConstants.h" -#import "mysql.h" - -typedef struct { - MYSQL *mySQLConnection; - BOOL *pingActivePointer; - BOOL *lastPingSuccessPointer; -} MCPConnectionPingDetails; - -@class MCPResult, MCPStreamingResult; -@protocol MCPConnectionProxy, MCPConnectionDelegate; - -@interface MCPConnection : NSObject -{ - MYSQL *mConnection; - BOOL mConnected; - NSStringEncoding mEncoding; - NSTimeZone *mTimeZone; - NSUInteger mConnectionFlags; - - id <MCPConnectionDelegate> delegate; - - // Anything that performs a mysql_net_read is not thread-safe: mysql queries, pings - // Always lock the connection first. Don't use this lock directly, use the lockConnection method! - NSConditionLock *connectionLock; - - BOOL useKeepAlive; - BOOL isDisconnecting; - BOOL isReconnecting; - BOOL userTriggeredDisconnect; - NSInteger connectionTimeout; - CGFloat keepAliveInterval; - - NSObject <MCPConnectionProxy> *connectionProxy; - NSString *connectionLogin; - NSString *connectionPassword; - NSString *connectionHost; - NSUInteger connectionPort; - NSString *connectionSocket; - NSUInteger maxAllowedPacketSize; - unsigned long connectionThreadId; - - BOOL useSSL; - NSString *sslKeyFilePath; - NSString *sslCertificatePath; - NSString *sslCACertificatePath; - - NSString *encoding, *previousEncoding; - NSStringEncoding stringEncoding; - BOOL encodingUsesLatin1Transport, previousEncodingUsesLatin1Transport; - - NSInteger currentProxyState; - - double lastQueryExecutionTime; - double lastQueryExecutedAtTime; - NSString *lastQueryErrorMessage; - NSUInteger lastQueryErrorId; - my_ulonglong lastQueryAffectedRows; - MCPConnectionCheck lastDelegateDecisionForLostConnection; - - BOOL isMaxAllowedPacketEditable; - - NSString *serverVersionString; - NSMutableDictionary *structure; - NSMutableArray *allKeysofDbStructure; - - pthread_t pingThread; - NSInteger pingFailureCount; - BOOL pingThreadActive; - BOOL lastPingSuccess; - BOOL lastPingBlocked; - NSTimer *keepAliveTimer; - double lastKeepAliveTime; - uint64_t connectionStartTime; - - BOOL retryAllowed; - BOOL queryCancelled; - BOOL queryCancelUsedReconnect; - BOOL delegateQueryLogging; - BOOL delegateResponseToWillQueryString; - BOOL delegateSupportsConnectionLostDecisions; - NSInteger isQueryingDbStructure; - BOOL cancelQueryingDbStructure; - BOOL lockQuerying; - NSInteger automaticReconnectAttempts; - - // Pointers - IMP cStringPtr; - IMP willQueryStringPtr; - IMP timeConnectedPtr; - - // Selectors - SEL cStringSEL; - SEL willQueryStringSEL; - SEL timeConnectedSEL; -} - -// Readonly properties -@property (readonly) double lastQueryExecutionTime; - -// Read/write properties -@property (readwrite, assign) BOOL useKeepAlive; -@property (readwrite, assign) BOOL delegateQueryLogging; -@property (readwrite, assign) NSInteger connectionTimeout; -@property (readwrite, assign) CGFloat keepAliveInterval; - -// Initialisation -- (id)initToHost:(NSString *)host withLogin:(NSString *)login usingPort:(NSUInteger)port; -- (id)initToSocket:(NSString *)socket withLogin:(NSString *)login; - -// Delegate -- (id)delegate; -- (void)setDelegate:(id)connectionDelegate; -- (MCPConnectionCheck)delegateDecisionForLostConnection; - -// Connection details -- (BOOL)setPort:(NSUInteger)thePort; -- (BOOL)setPassword:(NSString *)thePassword; -- (void) setSSL:(BOOL)shouldUseSSL usingKeyFilePath:(NSString *)keyFilePath certificatePath:(NSString *)certificatePath certificateAuthorityCertificatePath:(NSString *)caCertificatePath; - -// Proxy -- (BOOL)setConnectionProxy:(id <MCPConnectionProxy>)proxy; -- (void)connectionProxyStateChange:(id <MCPConnectionProxy>)proxy; - -// Connection -- (BOOL)connect; -- (void)disconnect; -- (BOOL)reconnect; -- (BOOL)isConnected; -- (BOOL)isConnectedViaSSL; -- (BOOL)userTriggeredDisconnect; -- (BOOL)checkConnection; -- (void)restoreConnectionDetails; -- (void)setAllowQueryRetries:(BOOL)allow; -- (double)timeConnected; - -// Pinging and keepalive -- (BOOL)pingConnectionUsingLoopDelay:(NSUInteger)loopDelay; -void backgroundPingTask(void *ptr); -void forceThreadExit(int signalNumber); -void pingThreadCleanup(void *pingDetails); -- (void)keepAlive:(NSTimer *)theTimer; -- (void)threadedKeepAlive; - -// Server versions -- (NSString *)serverVersionString; -- (NSInteger)serverMajorVersion; -- (NSInteger)serverMinorVersion; -- (NSInteger)serverReleaseVersion; - -// MySQL defaults -+ (NSDictionary *)getMySQLLocales; -+ (NSStringEncoding)encodingForMySQLEncoding:(const char *)mysqlEncoding; -+ (NSString *) mySQLEncodingForStringEncoding:(NSStringEncoding)stringEncoding; -+ (NSStringEncoding)defaultMySQLEncoding; -+ (BOOL)isErrorNumberConnectionError:(NSInteger)theErrorNumber; - -// Class maintenance -+ (void)setTruncateLongFieldInLogs:(BOOL)iTruncFlag; -+ (BOOL)truncateLongField; -- (BOOL)setConnectionOption:(NSInteger)option toValue:(BOOL)value; -- (BOOL)connectWithLogin:(NSString *)login password:(NSString *)pass host:(NSString *)host port:(NSUInteger)port socket:(NSString *)socket; - -- (BOOL)selectDB:(NSString *)dbName; - -// Error information -- (BOOL)queryErrored; -- (NSString *)getLastErrorMessage; -- (void)setLastErrorMessage:(NSString *)theErrorMessage; -- (NSUInteger)getLastErrorID; -+ (BOOL)isErrorNumberConnectionError:(NSInteger)theErrorNumber; -- (void)updateErrorStatuses; - -// Queries -- (NSString *)prepareBinaryData:(NSData *)theData; -- (NSString *)prepareString:(NSString *)theString; -- (NSString *)quoteObject:(id)theObject; -- (MCPResult *)queryString:(NSString *)query; -- (MCPStreamingResult *)streamingQueryString:(NSString *)query; -- (MCPStreamingResult *)streamingQueryString:(NSString *)query useLowMemoryBlockingStreaming:(BOOL)fullStream; -- (id)queryString:(NSString *)query usingEncoding:(NSStringEncoding)encoding streamingResult:(NSInteger)streamResult; -- (my_ulonglong)affectedRows; -- (my_ulonglong)insertId; -- (void)cancelCurrentQuery; -- (BOOL)queryCancelled; -- (BOOL)queryCancellationUsedReconnect; -- (void)flushMultiResults; - -// Locking -- (void)lockConnection; -- (BOOL)tryLockConnection; -- (void)unlockConnection; - -// Database structure -- (MCPResult *)listDBs; -- (MCPResult *)listDBsLike:(NSString *)dbsName; -- (MCPResult *)listTables; -- (MCPResult *)listTablesLike:(NSString *)tablesName; -- (NSArray *)listTablesFromDB:(NSString *)dbName; -- (NSArray *)listTablesFromDB:(NSString *)dbName like:(NSString *)tablesName; -- (MCPResult *)listFieldsFromTable:(NSString *)tableName; -- (MCPResult *)listFieldsFromTable:(NSString *)tableName like:(NSString *)fieldsName; - -// Structure querying -- (void)queryDbStructureWithUserInfo:(NSDictionary*)userInfo; -- (NSDictionary *)getDbStructure; -- (NSArray *)getAllKeysOfDbStructure; -- (BOOL)isQueryingDatabaseStructure; -- (void)incrementQueryingDbStructure; -- (void)decrementQueryingDbStructure; -- (void)lockQuerying; -- (void)unlockQuerying; -- (void)updateGlobalVariablesWith:(NSDictionary*)object; - -// Server information -- (NSString *)clientInfo; -- (NSString *)hostInfo; -- (NSString *)serverInfo; -- (NSNumber *)protoInfo; -- (MCPResult *)listProcesses; -- (BOOL)killProcess:(unsigned long)pid; -- (NSString *)findSocketPath; - -// Encoding -- (BOOL)setEncoding:(NSString *)theEncoding; -- (NSString *)encoding; -- (NSStringEncoding)stringEncoding; -- (BOOL)setEncodingUsesLatin1Transport:(BOOL)useLatin1; -- (BOOL)encodingUsesLatin1Transport; -- (void)storeEncodingForRestoration; -- (void)restoreStoredEncoding; - -// Time zone -- (void)setTimeZone:(NSTimeZone *)iTimeZone; -- (NSTimeZone *)timeZone; - -// Packet size -- (BOOL)fetchMaxAllowedPacket; -- (NSUInteger)getMaxAllowedPacket; -- (BOOL)isMaxAllowedPacketEditable; -- (NSUInteger)setMaxAllowedPacketTo:(NSUInteger)newSize resetSize:(BOOL)reset; - -// Data conversion -- (const char *)cStringFromString:(NSString *)theString; -- (const char *)cStringFromString:(NSString *)theString usingEncoding:(NSStringEncoding)encoding; -- (NSString *)stringWithCString:(const char *)theCString; -- (NSString *)stringWithCString:(const char *)theCString usingEncoding:(NSStringEncoding)encoding; -- (NSString *)stringWithText:(NSData *)theTextData; -- (NSString *)stringWithUTF8CString:(const char *)theCString; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m b/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m deleted file mode 100644 index 04dcf50d..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnection.m +++ /dev/null @@ -1,3402 +0,0 @@ -// -// $Id$ -// -// MCPConnection.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2001. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPConnection.h" -#import "MCPResult.h" -#import "MCPNumber.h" -#import "MCPNull.h" -#import "MCPStreamingResult.h" -#import "MCPConnectionProxy.h" -#import "MCPConnectionDelegate.h" -#import "MCPStringAdditions.h" -#import "RegexKitLite.h" // TODO: Remove along with queryDbStructureWithUserInfo -#import "NSNotificationAdditions.h" - -#include <unistd.h> -#include <mach/mach_time.h> -#include <SystemConfiguration/SystemConfiguration.h> - -const NSUInteger kMCPConnectionDefaultOption = CLIENT_COMPRESS | CLIENT_REMEMBER_OPTIONS | CLIENT_MULTI_RESULTS | CLIENT_INTERACTIVE; -const char *kMCPConnectionDefaultSocket = MYSQL_UNIX_ADDR; -const char *kMCPSSLCipherList = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RSA-AES128-SHA:AES128-SHA:AES256-RMD:AES128-RMD:DES-CBC3-RMD:DHE-RSA-AES256-RMD:DHE-RSA-AES128-RMD:DHE-RSA-DES-CBC3-RMD:RC4-SHA:RC4-MD5:DES-CBC3-SHA:DES-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC-SHA"; -const NSUInteger kMCPConnection_Not_Inited = 1000; -const NSUInteger kLengthOfTruncationForLog = 100; - -static BOOL sTruncateLongFieldInLogs = YES; - -/** - * Privte API - */ -@interface MCPConnection (PrivateAPI) - -- (void)_updateConnectionVariables; -- (BOOL)_isCurrentHostReachable; -- (void)_setupKeepalivePingTimer; - -@end - -/** - * Note that these aren't actually delegate methods, but are defined because queryDbStructureWithUserInfo needs - * them. We define them here to supress compiler warnings. - * - * TODO: Remove along with queryDbStructureWithUserInfo - */ -@interface MCPConnection (MCPConnectionDelegate) - -- (NSString *)database; -- (NSString *)connectionID; - -- (NSArray *)allDatabaseNames; -- (NSArray *)allSystemDatabaseNames; -- (NSArray *)allTableNames; -- (NSArray *)allViewNames; -- (NSArray *)allSchemaKeys; - -@end - -@implementation MCPConnection - -// Synthesize ivars -@synthesize useKeepAlive; -@synthesize delegateQueryLogging; -@synthesize connectionTimeout; -@synthesize keepAliveInterval; -@synthesize lastQueryExecutionTime; - -#pragma mark - -#pragma mark Initialisation - -/** - * Initialise a MySQLConnection without making a connection, most likely useless, except with !{setConnectionOption:withArgument:}. - * - * Because this method is not making a connection to any MySQL server, it can not know already what the DB server encoding will be, - * hence the encoding is set to some default (at present this is NSISOLatin1StringEncoding). Obviously this is reset to a proper - * value as soon as a DB connection is performed. - */ -- (id)init -{ - if ((self = [super init])) { - mConnection = mysql_init(NULL); - mConnected = NO; - - if (mConnection == NULL) { - [self autorelease]; - - return nil; - } - - encoding = [[NSString alloc] initWithString:@"utf8"]; - previousEncoding = nil; - stringEncoding = NSUTF8StringEncoding; - encodingUsesLatin1Transport = NO; - previousEncodingUsesLatin1Transport = NO; - mConnectionFlags = kMCPConnectionDefaultOption; - - // Anything that performs a mysql_net_read is not thread-safe: mysql queries, pings - // Always lock the connection first. Don't use this lock directly, use the lockConnection method! - connectionLock = [[NSConditionLock alloc] initWithCondition:MCPConnectionIdle]; - [connectionLock setName:@"MCPConnection connectionLock"]; - - connectionHost = nil; - connectionLogin = nil; - connectionSocket = nil; - connectionPassword = nil; - useSSL = NO; - sslKeyFilePath = nil; - sslCertificatePath = nil; - sslCACertificatePath = nil; - lastKeepAliveTime = 0; - pingThread = NULL; - connectionProxy = nil; - connectionStartTime = 0; - lastQueryExecutedAtTime = CGFLOAT_MAX; - lastDelegateDecisionForLostConnection = NSNotFound; - queryCancelled = NO; - queryCancelUsedReconnect = NO; - serverVersionString = nil; - mTimeZone = nil; - isDisconnecting = NO; - isReconnecting = NO; - userTriggeredDisconnect = NO; - automaticReconnectAttempts = 0; - lastPingSuccess = NO; - lastPingBlocked = NO; - pingThreadActive = NO; - pingFailureCount = 0; - - // Initialize ivar defaults - connectionTimeout = 10; - useKeepAlive = YES; - keepAliveInterval = 60; - - structure = [[NSMutableDictionary alloc] initWithCapacity:1]; - allKeysofDbStructure = [[NSMutableArray alloc] initWithCapacity:20]; - isQueryingDbStructure = 0; - lockQuerying = NO; - - connectionThreadId = 0; - maxAllowedPacketSize = 1048576; - lastQueryExecutionTime = 0; - lastQueryErrorId = 0; - lastQueryErrorMessage = nil; - lastQueryAffectedRows = 0; - lastPingSuccess = NO; - delegate = nil; - delegateSupportsConnectionLostDecisions = NO; - delegateResponseToWillQueryString = NO; - - // Enable delegate query logging by default - delegateQueryLogging = YES; - - // Default to allowing queries to be reattempted if they fail due to connection issues - retryAllowed = YES; - - // Obtain SEL references - willQueryStringSEL = @selector(willQueryString:connection:); - cStringSEL = @selector(cStringFromString:); - - // Obtain pointers - cStringPtr = [self methodForSelector:cStringSEL]; - - // Start the keepalive timer - if ([NSThread isMainThread]) - [self _setupKeepalivePingTimer]; - else - [self performSelectorOnMainThread:@selector(_setupKeepalivePingTimer) withObject:nil waitUntilDone:YES]; - } - - return self; -} - -/** - * Inialize connection using the supplied host details. - */ -- (id)initToHost:(NSString *)host withLogin:(NSString *)login usingPort:(NSUInteger)port -{ - if ((self = [self init])) { - if (!host) host = @""; - if (!login) login = @""; - - connectionHost = [[NSString alloc] initWithString:host]; - connectionLogin = [[NSString alloc] initWithString:login]; - connectionPort = port; - connectionSocket = nil; - } - - return self; -} - -/** - * Inialize connection using the supplied socket details. - */ -- (id)initToSocket:(NSString *)aSocket withLogin:(NSString *)login -{ - if ((self = [self init])) { - if (!aSocket || ![aSocket length]) { - aSocket = [self findSocketPath]; - if (!aSocket) aSocket = @""; - } - - if (!login) login = @""; - - connectionHost = nil; - connectionLogin = [[NSString alloc] initWithString:login]; - connectionSocket = [[NSString alloc] initWithString:aSocket]; - connectionPort = 0; - } - - return self; -} - -#pragma mark - -#pragma mark Delegate - -/** - * Get the connection's current delegate. - */ -- (id)delegate -{ - return delegate; -} - -/** - * Set the connection's delegate to the supplied object. - */ -- (void)setDelegate:(id)connectionDelegate -{ - delegate = connectionDelegate; - - // Check that the delegate implements willQueryString:connection: and cache the result as its used very frequently. - delegateResponseToWillQueryString = [delegate respondsToSelector:@selector(willQueryString:connection:)]; - - // Check whether the delegate supports returning a connection lost action decision - delegateSupportsConnectionLostDecisions = [delegate respondsToSelector:@selector(connectionLost:)]; -} - -/** - * Ask the delegate for the connection lost decision. This can be called from - * any thread, and will call itself on the main thread if necessary, updating a global - * variable which is then returned on the child thread. - */ -- (MCPConnectionCheck)delegateDecisionForLostConnection -{ - - // Return the "Disconnect" decision if the delegate doesn't support connectionLost: checks - if (!delegateSupportsConnectionLostDecisions) return MCPConnectionCheckDisconnect; - - lastDelegateDecisionForLostConnection = NSNotFound; - - // If on the main thread, ask the delegate directly. - // This is wrapped in a NSLock to ensure variables are completely committed for - // thread-safe access, even though the lock is constrained to this code block. - if ([NSThread isMainThread]) { - NSLock *delegateDecisionLock = [[NSLock alloc] init]; - [delegateDecisionLock lock]; - lastDelegateDecisionForLostConnection = [delegate connectionLost:self]; - [delegateDecisionLock unlock]; - [delegateDecisionLock release]; - - // Otherwise call ourself on the main thread, waiting until the reply is received. - } else { - - // First check whether the application is in a modal state; if so, wait - while ([NSApp modalWindow]) usleep(100000); - - [self performSelectorOnMainThread:@selector(delegateDecisionForLostConnection) withObject:nil waitUntilDone:YES]; - } - - return lastDelegateDecisionForLostConnection; -} - -#pragma mark - -#pragma mark Connection details - -/** - * Sets or updates the connection port - for use with tunnels. - */ -- (BOOL)setPort:(NSUInteger)thePort -{ - connectionPort = thePort; - - return YES; -} - -/** - * Sets the password to be stored locally. - * Providing a keychain name is much more secure. - */ -- (BOOL)setPassword:(NSString *)thePassword -{ - if (connectionPassword) [connectionPassword release], connectionPassword = nil; - - if (!thePassword) thePassword = @""; - - connectionPassword = [[NSString alloc] initWithString:thePassword]; - - return YES; -} - -/** - * Set the connection to establish secure connections using SSL; must be - * called before connect:. - * This will always attempt to activate SSL if set, but depending on server - * setup connection may sometimes proceed without SSL enabled even if requested; - * it is suggested that after connection, -[MCPConnection isConnectedViaSSL] - * is checked to determine whether SSL is actually active. - */ -- (void) setSSL:(BOOL)shouldUseSSL usingKeyFilePath:(NSString *)keyFilePath certificatePath:(NSString *)certificatePath certificateAuthorityCertificatePath:(NSString *)caCertificatePath -{ - useSSL = shouldUseSSL; - - // Reset the old SSL details - if (sslKeyFilePath) [sslKeyFilePath release], sslKeyFilePath = nil; - if (sslCertificatePath) [sslCertificatePath release], sslCertificatePath = nil; - if (sslCACertificatePath) [sslCACertificatePath release], sslCACertificatePath = nil; - - // Set new details if provided - if (keyFilePath) sslKeyFilePath = [[NSString alloc] initWithString:[keyFilePath stringByExpandingTildeInPath]]; - if (certificatePath) sslCertificatePath = [[NSString alloc] initWithString:[certificatePath stringByExpandingTildeInPath]]; - if (caCertificatePath) sslCACertificatePath = [[NSString alloc] initWithString:[caCertificatePath stringByExpandingTildeInPath]]; -} - -#pragma mark - -#pragma mark Connection proxy - -/* - * Set a connection proxy object to connect through. This object will be retained locally, - * and will be automatically connected/connection checked/reconnected/disconnected - * together with the main connection. - */ -- (BOOL)setConnectionProxy:(id <MCPConnectionProxy>)proxy -{ - connectionProxy = proxy; - [connectionProxy retain]; - - currentProxyState = [connectionProxy state]; - [connectionProxy setConnectionStateChangeSelector:@selector(connectionProxyStateChange:) delegate:self]; - - return YES; -} - -/** - * Handle any state changes in the associated connection proxy. - */ -- (void)connectionProxyStateChange:(id <MCPConnectionProxy>)proxy -{ - NSInteger newState = [proxy state]; - - // Restart the tunnel if it dies - use a new thread to allow the main thread to process - // events as required. - if (mConnected && newState == PROXY_STATE_IDLE && currentProxyState == PROXY_STATE_CONNECTED) { - currentProxyState = newState; - [connectionProxy setConnectionStateChangeSelector:nil delegate:nil]; - - // Trigger a reconnect - if (!isDisconnecting) [NSThread detachNewThreadSelector:@selector(reconnect) toTarget:self withObject:nil]; - - return; - } - - currentProxyState = newState; -} - -#pragma mark - -#pragma mark Connection - -/** - * Add a new connection method, intended for use with the init methods above. - * Uses the stored details to instantiate a connection to the specified server, - * including custom timeouts - used for pings, not for long-running commands. - */ -- (BOOL)connect -{ - const char *theLogin = [self cStringFromString:connectionLogin]; - const char *theHost; - const char *thePass = NULL; - const char *theSocket; - void *theRet; - - // Disconnect if a connection is already active - if (mConnected) { - [self disconnect]; - mConnection = mysql_init(NULL); - if (mConnection == NULL) return NO; - } - - [self lockConnection]; - - if (mConnection != NULL) { - - // Ensure the custom timeout option is set - mysql_options(mConnection, MYSQL_OPT_CONNECT_TIMEOUT, (const void *)&connectionTimeout); - - // ensure that automatic reconnection is explicitly disabled - now handled manually. - my_bool falseBool = FALSE; - mysql_options(mConnection, MYSQL_OPT_RECONNECT, &falseBool); - - // Set the connection encoding to utf8 - mysql_options(mConnection, MYSQL_SET_CHARSET_NAME, [encoding UTF8String]); - } - - // Set the host as appropriate - if (!connectionHost || ![connectionHost length]) { - theHost = NULL; - } else { - theHost = [self cStringFromString:connectionHost]; - } - - // Use the default socket if none is set, or set appropriately - if (connectionSocket == nil || ![connectionSocket length]) { - theSocket = kMCPConnectionDefaultSocket; - } else { - theSocket = [self cStringFromString:connectionSocket]; - } - - // Apply SSL if appropriate - if (useSSL) { - mysql_ssl_set(mConnection, - sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, - sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, - sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, - NULL, - kMCPSSLCipherList); - } - - // Select the password from the provided method - if (!connectionPassword) { - if (delegate && [delegate respondsToSelector:@selector(keychainPasswordForConnection:)]) { - thePass = [self cStringFromString:[delegate keychainPasswordForConnection:self]]; - } - } else { - thePass = [self cStringFromString:connectionPassword]; - } - - // Connect - theRet = mysql_real_connect(mConnection, theHost, theLogin, thePass, NULL, (unsigned int)connectionPort, theSocket, mConnectionFlags); - thePass = NULL; - - // If the connection failed, record the error state and return - if (theRet != mConnection) { - [self unlockConnection]; - [self setLastErrorMessage:nil]; - - lastQueryErrorId = mysql_errno(mConnection); - - return mConnected = NO; - } - - // Set and reset connection flags - mConnected = YES; - userTriggeredDisconnect = NO; - connectionStartTime = mach_absolute_time(); - lastKeepAliveTime = 0; - automaticReconnectAttempts = 0; - pingFailureCount = 0; - connectionThreadId = mConnection->thread_id; - [self setLastErrorMessage:nil]; - - [self unlockConnection]; - - // Update connection variables - server version, time zone, and connection encoding - [self _updateConnectionVariables]; - - // Only attempt to set the max allowed packet if we have a connection - // The fetches may fail, in which case the class default (which should match - // the MySQL default) will be used. - if (mConnection != NULL) { - isMaxAllowedPacketEditable = [self isMaxAllowedPacketEditable]; - [self fetchMaxAllowedPacket]; - } - else { - mConnected = NO; - isMaxAllowedPacketEditable = NO; - } - - return mConnected; -} - -/** - * Disconnect the current connection. - */ -- (void)disconnect -{ - if (isDisconnecting) return; - isDisconnecting = YES; - - if (mConnected) { - [self cancelCurrentQuery]; - mConnected = NO; - - // Allow any pings or query cleanups to complete - within a time limit. - uint64_t startTime_t, currentTime_t; - Nanoseconds elapsedNanoseconds; - startTime_t = mach_absolute_time(); - do { - usleep(100000); - - currentTime_t = mach_absolute_time() - startTime_t ; - elapsedNanoseconds = AbsoluteToNanoseconds(*(AbsoluteTime *)&(currentTime_t)); - if (((double)UnsignedWideToUInt64(elapsedNanoseconds)) * 1e-9 > 10) break; - } while (![self tryLockConnection]); - [self unlockConnection]; - - // Only close the connection if it appears to still be active, and not reading or - // writing. This may result in a leak, but minimises crashes. - if (!mConnection->net.reading_or_writing && mConnection->net.vio && mConnection->net.buff) mysql_close(mConnection); - mConnection = NULL; - } - - isDisconnecting = NO; - - if (connectionProxy) { - [connectionProxy performSelectorOnMainThread:@selector(disconnect) withObject:nil waitUntilDone:YES]; - } - - if (serverVersionString) [serverVersionString release], serverVersionString = nil; - if (structure) [structure release], structure = nil; - if (allKeysofDbStructure) [allKeysofDbStructure release], allKeysofDbStructure = nil; - if (pingThread != NULL) pthread_cancel(pingThread), pingThread = NULL; -} - -/** - * Reconnect to the currently "active" - but possibly disconnected - connection, using the - * stored details. - * Error checks extensively - if this method fails, it will ask how to proceed and loop depending - * on the status, not returning control until either a connection has been established or - * the connection and document have been closed. - * Runs its own autorelease pool as sometimes called in a thread following proxy changes - * (where the return code doesn't matter). - */ -- (BOOL)reconnect -{ - NSAutoreleasePool *reconnectionPool = [[NSAutoreleasePool alloc] init]; - NSString *currentEncoding = [NSString stringWithString:encoding]; - BOOL currentEncodingUsesLatin1Transport = encodingUsesLatin1Transport; - NSString *currentDatabase = nil; - - // Check whether a reconnection attempt is already being made - if so, wait and return the status of that reconnection attempt. - if (isReconnecting) { - NSDate *eventLoopStartDate; - while (isReconnecting) { - eventLoopStartDate = [NSDate date]; - [[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - if ([[NSDate date] timeIntervalSinceDate:eventLoopStartDate] < 0.1) { - usleep((useconds_t)(100000 - (1000000 * [[NSDate date] timeIntervalSinceDate:eventLoopStartDate]))); - } - } - [reconnectionPool drain]; - return mConnected; - } - - isReconnecting = YES; - - // Store the currently selected database so it can be re-set if reconnection was successful - if (delegate && [delegate respondsToSelector:@selector(onReconnectShouldSelectDatabase:)] && [delegate onReconnectShouldSelectDatabase:self]) { - currentDatabase = [NSString stringWithString:[delegate onReconnectShouldSelectDatabase:self]]; - } - - // Close the connection if it exists. - if (mConnected) { - mConnected = NO; - - // Allow any pings or query cleanups to complete - within a time limit. - uint64_t startTime_t, currentTime_t; - Nanoseconds elapsedNanoseconds; - startTime_t = mach_absolute_time(); - do { - usleep(100000); - - currentTime_t = mach_absolute_time() - startTime_t ; - elapsedNanoseconds = AbsoluteToNanoseconds(*(AbsoluteTime *)&(currentTime_t)); - if (((double)UnsignedWideToUInt64(elapsedNanoseconds)) * 1e-9 > 10) break; - } while (![self tryLockConnection]); - [self unlockConnection]; - - // Only close the connection if it's not reading or writing - this may result - // in leaks, but minimises crashes. - if (!mConnection->net.reading_or_writing) mysql_close(mConnection); - mConnection = NULL; - } - - isDisconnecting = NO; - [self lockConnection]; - - // If no network is present, loop for a short period waiting for one to become available - uint64_t elapsedTime_t, networkWaitStartTime_t = mach_absolute_time(); - Nanoseconds elapsedTime; - while (![self _isCurrentHostReachable]) { - elapsedTime_t = mach_absolute_time() - networkWaitStartTime_t; - elapsedTime = AbsoluteToNanoseconds(*(AbsoluteTime *)&(elapsedTime_t)); - if (((double)UnsignedWideToUInt64(elapsedTime)) * 1e-9 > 5) break; - usleep(250000); - } - - // If there is a proxy, ensure it's disconnected and attempt to reconnect it in blocking fashion - if (connectionProxy) { - [connectionProxy setConnectionStateChangeSelector:nil delegate:nil]; - if ([connectionProxy state] != PROXY_STATE_IDLE) [connectionProxy disconnect]; - - // Loop until the proxy has disconnected or the connection timeout has passed - NSDate *proxyDisconnectStartDate = [NSDate date], *eventLoopStartDate; - while ([connectionProxy state] != PROXY_STATE_IDLE - && [[NSDate date] timeIntervalSinceDate:proxyDisconnectStartDate] < connectionTimeout) - { - eventLoopStartDate = [NSDate date]; - [[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; - if ([[NSDate date] timeIntervalSinceDate:eventLoopStartDate] < 0.25) { - usleep((useconds_t)(250000 - (1000000 * [[NSDate date] timeIntervalSinceDate:eventLoopStartDate]))); - } - } - - // Reconnect the proxy, looping up to the connection timeout - [connectionProxy connect]; - - NSDate *proxyStartDate = [NSDate date], *interfaceInteractionTimer; - while (1) { - - // If the proxy has connected, break out of the loop - if ([connectionProxy state] == PROXY_STATE_CONNECTED) { - connectionPort = [connectionProxy localPort]; - break; - } - - // If the proxy connection attempt time has exceeded the timeout, abort. - if ([[NSDate date] timeIntervalSinceDate:proxyStartDate] > (connectionTimeout + 1)) { - [connectionProxy disconnect]; - break; - } - - // Process events for a short time, allowing dialogs to be shown but waiting for - // the proxy. Capture how long this interface action took, standardising the - // overall time and extending the connection timeout by any interface time. - interfaceInteractionTimer = [NSDate date]; - [[NSRunLoop mainRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; - //[[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; - if ([[NSDate date] timeIntervalSinceDate:interfaceInteractionTimer] < 0.25) { - usleep((useconds_t)(250000 - (1000000 * [[NSDate date] timeIntervalSinceDate:interfaceInteractionTimer]))); - } - if ([connectionProxy state] == PROXY_STATE_WAITING_FOR_AUTH) { - proxyStartDate = [proxyStartDate addTimeInterval:[[NSDate date] timeIntervalSinceDate:interfaceInteractionTimer]]; - } - } - - currentProxyState = [connectionProxy state]; - [connectionProxy setConnectionStateChangeSelector:@selector(connectionProxyStateChange:) delegate:self]; - } - - [self unlockConnection]; - if (!connectionProxy || [connectionProxy state] == PROXY_STATE_CONNECTED) { - - // Attempt to reinitialise the connection - if this fails, it will still be set to NULL. - if (mConnection == NULL) { - mConnection = mysql_init(NULL); - } - - if (mConnection != NULL) { - - // Attempt to reestablish the connection - [self connect]; - } - } - - // If the connection was successfully established, reselect the old database and encoding if appropriate. - if (mConnected) { - if (currentDatabase) { - [self selectDB:currentDatabase]; - } - - if (currentEncoding) { - [self setEncoding:currentEncoding]; - [self setEncodingUsesLatin1Transport:currentEncodingUsesLatin1Transport]; - } - } - else { - [self setLastErrorMessage:nil]; - - // Default to retry - MCPConnectionCheck failureDecision = MCPConnectionCheckReconnect; - - // Ask delegate what to do - if (delegateSupportsConnectionLostDecisions) { - failureDecision = [self delegateDecisionForLostConnection]; - } - - switch (failureDecision) { - case MCPConnectionCheckDisconnect: - [self setLastErrorMessage:NSLocalizedString(@"User triggered disconnection", @"User triggered disconnection")]; - userTriggeredDisconnect = YES; - [reconnectionPool release]; - isReconnecting = NO; - return NO; - default: - [reconnectionPool release]; - isReconnecting = NO; - return [self reconnect]; - } - } - - [reconnectionPool release]; - isReconnecting = NO; - return mConnected; -} - -/** - * Returns YES if the MCPConnection is connected to a DB, NO otherwise. - */ -- (BOOL)isConnected -{ - return mConnected; -} - -/** - * Returns YES if the MCPConnection is connected to a server via SSL, NO otherwise. - */ -- (BOOL)isConnectedViaSSL -{ - if (![self isConnected]) return NO; - return (mysql_get_ssl_cipher(mConnection))?YES:NO; -} - -/** - * Returns YES if the user chose to disconnect at the last "connection failure" - * prompt, NO otherwise. - */ -- (BOOL)userTriggeredDisconnect -{ - return userTriggeredDisconnect; -} - -/** - * Checks if the connection to the server is still on. - * If not, tries to reconnect (changing no parameters from the MYSQL pointer). - * This method just uses mysql_ping(). - */ -- (BOOL)checkConnection -{ - if (!mConnected) return NO; - - BOOL connectionVerified = FALSE; - - // If the connection is currently locked, it's probably in use - no need to check - // the connection. - if ([connectionLock condition] == MCPConnectionBusy) { - - // However if a ping thread is active, might be a background ping - wait for it - // to complete, then check the connection. - if (pingThreadActive) { - while (pingThreadActive) { - usleep(10000); - } - return [self checkConnection]; - } - - return YES; - } - - // Check whether the connection is still operational via a wrapped version of MySQL ping. - connectionVerified = [self pingConnectionUsingLoopDelay:400]; - - // If the connection doesn't appear to be responding, and we can still attempt an automatic - // reconnect (only once each connection - eg an automatic reconnect failure prevents loops, - // but an automatic reconnect success resets the flag for another attempt in future) - if (!connectionVerified && automaticReconnectAttempts < 1) { - automaticReconnectAttempts++; - - // Note that a return of "NO" here has already asked the user, so if reconnect fails, - // return failure. - if ([self reconnect]) { - return YES; - } - return NO; - } - - // If automatic reconnect cannot be used, show a dialog asking how to proceed - if (!connectionVerified) { - - // Ask delegate what to do, defaulting to "disconnect". - MCPConnectionCheck failureDecision = MCPConnectionCheckDisconnect; - if (delegateSupportsConnectionLostDecisions) { - failureDecision = [self delegateDecisionForLostConnection]; - } - - switch (failureDecision) { - - // 'Reconnect' has been selected. Request a reconnect, and retry. - case MCPConnectionCheckReconnect: - [self reconnect]; - - return [self checkConnection]; - - // 'Disconnect' has been selected. The parent window should already have - // triggered UI-specific actions, and may have disconnected already; if - // not, disconnect, and clean up. - case MCPConnectionCheckDisconnect: - if (mConnected) [self disconnect]; - [self setLastErrorMessage:NSLocalizedString(@"User triggered disconnection", @"User triggered disconnection")]; - userTriggeredDisconnect = YES; - return NO; - - // 'Retry' has been selected - return a recursive call. - case MCPConnectionCheckRetry: - return [self checkConnection]; - } - - // If a connection exists, check whether the thread id differs; if so, the connection has - // probably been reestablished and we need to reset the connection encoding - } else if (connectionThreadId != mConnection->thread_id) [self restoreConnectionDetails]; - - return connectionVerified; -} - -/** - * Restore the connection encoding details as necessary based on the delegate-provided - * details. - */ -- (void)restoreConnectionDetails -{ - connectionThreadId = mConnection->thread_id; - connectionStartTime = mach_absolute_time(); - [self fetchMaxAllowedPacket]; - - [self setEncoding:encoding]; - [self setEncodingUsesLatin1Transport:encodingUsesLatin1Transport]; -} - -/** - * Allow controlling over whether queries are allowed to retry after a connection failure. - * This defaults to YES on init, and is intended to allow temporary disabling in situations - * where the query result is checked and displayed to the user without any repurcussions on - * failure. - */ -- (void)setAllowQueryRetries:(BOOL)allow -{ - retryAllowed = allow; -} - -/** - * Retrieve the time elapsed since the connection was established, in seconds. - * This time is retrieved in a monotonically increasing fashion and is high - * precision; it is used internally for query timing, and is reset on reconnections. - */ -- (double)timeConnected -{ - if (connectionStartTime == 0) return -1; - - uint64_t currentTime_t = mach_absolute_time() - connectionStartTime; - Nanoseconds elapsedTime = AbsoluteToNanoseconds(*(AbsoluteTime *)&(currentTime_t)); - - return (((double)UnsignedWideToUInt64(elapsedTime)) * 1e-9); -} - -#pragma mark - -#pragma mark Pinging and keepalive - -/** - * This function provides a method of pinging the remote server while also enforcing - * the specified connection time. This is required because low-level net reads can - * block indefinitely if the remote server disappears or on network issues - setting - * the MYSQL_OPT_READ_TIMEOUT (and the WRITE equivalent) would "fix" ping, but cause - * long queries to be terminated. - * The supplied loop delay number controls how tight the thread checking loop is, in - * microseconds, to allow differentiating foreground and background pings. - * Unlike mysql_ping, this function returns FALSE on failure and TRUE on success. - */ -- (BOOL)pingConnectionUsingLoopDelay:(NSUInteger)loopDelay -{ - if (!mConnected) return NO; - - uint64_t pingStartTime_t, currentTime_t; - Nanoseconds elapsedNanoseconds; - BOOL threadCancelled = NO; - - // Set up a query lock - [self lockConnection]; - - lastPingSuccess = NO; - lastPingBlocked = NO; - pingThreadActive = YES; - - // Use a ping timeout defaulting to thirty seconds, but using the connection timeout if set - NSInteger pingTimeout = 30; - if (connectionTimeout > 0) pingTimeout = connectionTimeout; - - // Set up a struct containing details the ping task will need - MCPConnectionPingDetails pingDetails; - pingDetails.mySQLConnection = mConnection; - pingDetails.lastPingSuccessPointer = &lastPingSuccess; - pingDetails.pingActivePointer = &pingThreadActive; - - // Create a pthread for the ping - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&pingThread, &attr, (void *)&backgroundPingTask, &pingDetails); - - // Record the ping start time - pingStartTime_t = mach_absolute_time(); - - // Loop until the ping completes - do { - usleep((useconds_t)loopDelay); - - // If the ping timeout has been exceeded, force a timeout; double-check that the - // thread is still active. - currentTime_t = mach_absolute_time() - pingStartTime_t ; - elapsedNanoseconds = AbsoluteToNanoseconds(*(AbsoluteTime *)&(currentTime_t)); - if (((double)UnsignedWideToUInt64(elapsedNanoseconds)) * 1e-9 > pingTimeout && pingThreadActive && !threadCancelled) { - pthread_cancel(pingThread); - threadCancelled = YES; - - // If the timeout has been exceeded by an additional two seconds, and the thread is - // still active, kill the thread. This can occur in certain network conditions causing - // a blocking read. - } else if (((double)UnsignedWideToUInt64(elapsedNanoseconds)) * 1e-9 > (pingTimeout + 2) && pingThreadActive) { - pthread_kill(pingThread, SIGUSR1); - pingThreadActive = NO; - lastPingBlocked = YES; - } - } while (pingThreadActive); - - // Clean up - pingThread = NULL; - pthread_attr_destroy(&attr); - - // Unlock the connection - [self unlockConnection]; - - return lastPingSuccess; -} - -/** - * Actually perform a keepalive ping - intended for use within a pthread. - */ -void backgroundPingTask(void *ptr) -{ - MCPConnectionPingDetails *pingDetails = (MCPConnectionPingDetails *)ptr; - - // Set up a cleanup routine - pthread_cleanup_push(pingThreadCleanup, pingDetails); - - // Set up a signal handler for SIGUSR1, to handle forced timeouts. - signal(SIGUSR1, forceThreadExit); - - // Perform a ping - *(pingDetails->lastPingSuccessPointer) = (BOOL)(!mysql_ping(pingDetails->mySQLConnection)); - - // Call the cleanup routine - pthread_cleanup_pop(1); -} - -/** - * Support forcing a thread to exit as a result of a signal. - */ -void forceThreadExit(int signalNumber) -{ - pthread_exit(NULL); -} - -void pingThreadCleanup(void *pingDetails) -{ - MCPConnectionPingDetails *pingDetailsStruct = pingDetails; - *(pingDetailsStruct->pingActivePointer) = NO; -} - -/** - * Keeps a connection alive by running a ping. - * This method is called every ten seconds and spawns a thread which determines - * whether or not it should perform a ping. - */ -- (void)keepAlive:(NSTimer *)theTimer -{ - - // Do nothing if not connected or if keepalive is disabled - if (!mConnected || !useKeepAlive) return; - - // Check to see whether a ping is required. First, compare the last query - // and keepalive times against the keepalive interval. - // Compare against interval-1 to allow default keepalive intervals to repeat - // at the correct intervals (eg no timer interval delay). - double timeConnected = [self timeConnected]; - if (timeConnected - lastQueryExecutedAtTime < keepAliveInterval - 1 - || timeConnected - lastKeepAliveTime < keepAliveInterval - 1) - { - return; - } - - // Attempt to lock the connection. If the connection is currently busy, - // we don't need a ping. - if (![self tryLockConnection]) return; - [self unlockConnection]; - - // Store the ping time - lastKeepAliveTime = timeConnected; - - [NSThread detachNewThreadSelector:@selector(threadedKeepAlive) toTarget:self withObject:nil]; -} - -/** - * A threaded keepalive to avoid blocking the interface. Performs safety - * checks, and then creates a child pthread to actually ping the connection, - * forcing the thread to close after the timeout if it hasn't closed already. - */ -- (void)threadedKeepAlive -{ - - // If the maximum number of ping failures has been reached, trigger a reconnect - if (lastPingBlocked || pingFailureCount >= 3) { - NSAutoreleasePool *connectionPool = [[NSAutoreleasePool alloc] init]; - [self reconnect]; - [connectionPool drain]; - return; - } - - // Otherwise, perform a background ping. - BOOL pingResult = [self pingConnectionUsingLoopDelay:10000]; - if (pingResult) { - pingFailureCount = 0; - } else { - pingFailureCount++; - } -} - -#pragma mark - -#pragma mark Server versions - -/** - * Return the server version string, or nil on failure. - */ -- (NSString *)serverVersionString -{ - if (serverVersionString) { - return [NSString stringWithString:serverVersionString]; - } - - return nil; -} - -/** - * rReturn the server major version or -1 on fail - */ -- (NSInteger)serverMajorVersion -{ - - if (serverVersionString != nil) { - return [[[serverVersionString componentsSeparatedByString:@"."] objectAtIndex:0] integerValue]; - } - - return -1; -} - -/** - * Return the server minor version or -1 on fail - */ -- (NSInteger)serverMinorVersion -{ - if (serverVersionString != nil) { - return [[[serverVersionString componentsSeparatedByString:@"."] objectAtIndex:1] integerValue]; - } - - return -1; -} - -/** - * Return the server release version or -1 on fail - */ -- (NSInteger)serverReleaseVersion -{ - if (serverVersionString != nil) { - NSString *s = [[serverVersionString componentsSeparatedByString:@"."] objectAtIndex:2]; - return [[[s componentsSeparatedByString:@"-"] objectAtIndex:0] integerValue]; - } - - return -1; -} - -#pragma mark - -#pragma mark MySQL defaults - -/** - * This class is used to keep a connection with a MySQL server, it correspond to the MYSQL structure of the C API, or the database handle of the PERL DBI/DBD interface. - * - * You have to start any work on a MySQL server by getting a working MCPConnection object. - * - * Most likely you will use this kind of code: - * - * - * MCPConnection *theConnec = [MCPConnection alloc]; - * MCPResult *theRes; - * - * theConnec = [theConnec initToHost:@"albert.com" withLogin:@"toto" password:@"albert" usingPort:0]; - * [theConnec selectDB:@"db1"]; - * theRes = [theConnec queryString:@"select * from table1"]; - * ... - * - * Failing to properly release your MCPConnection(s) object might cause a MySQL crash!!! (recovered if the server was started using mysqld_safe). - * - * Gets a proper Locale dictionary to use formater to parse strings from MySQL. - * For example strings representing dates should give a proper Locales for use with methods such as NSDate::dateWithNaturalLanguageString: locales: - */ -+ (NSDictionary *)getMySQLLocales -{ - NSMutableDictionary *theLocalDict = [NSMutableDictionary dictionaryWithCapacity:12]; - - [theLocalDict setObject:@"." forKey:@"NSDecimalSeparator"]; - - return [NSDictionary dictionaryWithDictionary:theLocalDict]; -} - -/** - * Gets a proper NSStringEncoding according to the given MySQL charset. - */ -+ (NSStringEncoding) encodingForMySQLEncoding:(const char *)mysqlEncoding -{ - // Unicode encodings: - if (!strncmp(mysqlEncoding, "utf8", 4)) { - return NSUTF8StringEncoding; - } - if (!strncmp(mysqlEncoding, "ucs2", 4)) { - return NSUnicodeStringEncoding; - } - - // Roman alphabet encodings: - if (!strncmp(mysqlEncoding, "ascii", 5)) { - return NSASCIIStringEncoding; - } - if (!strncmp(mysqlEncoding, "latin1", 6)) { - return NSISOLatin1StringEncoding; - } - if (!strncmp(mysqlEncoding, "macroman", 8)) { - return NSMacOSRomanStringEncoding; - } - - // Roman alphabet with central/east european additions: - if (!strncmp(mysqlEncoding, "latin2", 6)) { - return NSISOLatin2StringEncoding; - } - if (!strncmp(mysqlEncoding, "cp1250", 6)) { - return NSWindowsCP1250StringEncoding; - } - if (!strncmp(mysqlEncoding, "win1250", 7)) { - return NSWindowsCP1250StringEncoding; - } - if (!strncmp(mysqlEncoding, "cp1257", 6)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsBalticRim); - } - - // Additions for Turkish: - if (!strncmp(mysqlEncoding, "latin5", 6)) { - return NSWindowsCP1254StringEncoding; - } - - // Greek: - if (!strncmp(mysqlEncoding, "greek", 5)) { - return NSWindowsCP1253StringEncoding; - } - - // Cyrillic: - if (!strncmp(mysqlEncoding, "win1251ukr", 6)) { - return NSWindowsCP1251StringEncoding; - } - if (!strncmp(mysqlEncoding, "cp1251", 6)) { - return NSWindowsCP1251StringEncoding; - } - if (!strncmp(mysqlEncoding, "koi8_ru", 6)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingKOI8_R); - } - if (!strncmp(mysqlEncoding, "koi8_ukr", 6)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingKOI8_R); - } - - // Arabic: - if (!strncmp(mysqlEncoding, "cp1256", 6)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsArabic); - } - - // Hebrew: - if (!strncmp(mysqlEncoding, "hebrew", 6)) { - CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatinHebrew); - } - - // Asian: - if (!strncmp(mysqlEncoding, "ujis", 4)) { - return NSJapaneseEUCStringEncoding; - } - if (!strncmp(mysqlEncoding, "sjis", 4)) { - return NSShiftJISStringEncoding; - } - if (!strncmp(mysqlEncoding, "big5", 4)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5); - } - if (!strncmp(mysqlEncoding, "euc_kr", 6)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR); - } - if (!strncmp(mysqlEncoding, "euckr", 5)) { - return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR); - } - - // Default to iso latin 1, even if it is not exact (throw an exception?) - NSLog(@"WARNING: unknown name for MySQL encoding '%s'!\n\t\tFalling back to iso-latin1.", mysqlEncoding); - - return NSISOLatin1StringEncoding; -} - -/** - * Gets a MySQL charset for the given NSStringEncoding. - * If the NSStringEncoding was not matched, nil is returned. - */ -+ (NSString *) mySQLEncodingForStringEncoding:(NSStringEncoding)stringEncoding -{ - switch (stringEncoding) { - - // Unicode encodings: - case NSUTF8StringEncoding: - return @"utf8"; - case NSUnicodeStringEncoding: - return @"ucs2"; - - // Roman alphabet encodings: - case NSASCIIStringEncoding: - return @"ascii"; - case NSISOLatin1StringEncoding: - case NSWindowsCP1252StringEncoding: - return @"latin1"; - case NSMacOSRomanStringEncoding: - return @"macroman"; - - // Roman alphabet with central/east european additions: - case NSISOLatin2StringEncoding: - return @"latin2"; - case NSWindowsCP1250StringEncoding: - return @"cp1250"; - - // Turkish - case NSWindowsCP1254StringEncoding: - return @"latin5"; - - // Greek: - case NSWindowsCP1253StringEncoding: - return @"greek"; - - // Cyrillic: - case NSWindowsCP1251StringEncoding: - return @"cp1251"; - - // Asian: - case NSJapaneseEUCStringEncoding: - return @"ujis"; - case NSShiftJISStringEncoding: - return @"sjis"; - - default: - return nil; - } -} - -/** - * Returns the default charset of the library mysqlclient used. - */ -+ (NSStringEncoding)defaultMySQLEncoding -{ - return [MCPConnection encodingForMySQLEncoding:"utf8_general_ci"]; -} - -#pragma mark - -#pragma mark Class maintenance - -/** - * - */ -+ (void)setTruncateLongFieldInLogs:(BOOL)iTruncFlag -{ - sTruncateLongFieldInLogs = iTruncFlag; -} - -/** - * - */ -+ (BOOL)truncateLongField -{ - return sTruncateLongFieldInLogs; -} - -/** - * This method is to be used for getting special option for a connection, in which case the MCPConnection - * has to be inited with the init method, then option are selected, finally connection is done using one - * of the connect methods: - * - * MCPConnection *theConnect = [[MCPConnection alloc] init]; - * - * [theConnect setConnectionOption: option toValue: value]; - * [theConnect connectToHost:albert.com withLogin:@"toto" password:@"albert" port:0]; - * - */ -- (BOOL)setConnectionOption:(NSInteger)option toValue:(BOOL)value -{ - // So far do nothing except for testing if it's proper time for setting option - // What about if some option where setted and a connection is made again with connectTo... - if ((mConnected) || (! mConnection)) { - return FALSE; - } - - if (value) { //Set this option to true - mConnectionFlags |= option; - } - else { //Set this option to false - mConnectionFlags &= (! option); - } - - return YES; -} - -/** - * Trigger a connection to a server using the supplied details. Any details supplied are - * stored for automatic reconnection attempts. - * - * - login is the user name - * - pass is the password corresponding to the user name - * - host is the hostname or IP adress - * - port is the TCP port to use to connect. If port = 0, uses the default port from mysql.h - * - socket is the path to the socket (for the localhost) - * - * The socket is used if the host is set to !{@"localhost"}, to an empty or a !{nil} string - */ -- (BOOL)connectWithLogin:(NSString *)login password:(NSString *)pass host:(NSString *)host port:(NSUInteger)port socket:(NSString *)aSocket -{ - - // Reset any stored connection settings - if (connectionHost) [connectionHost release], connectionHost = nil; - if (connectionLogin) [connectionLogin release], connectionLogin = nil; - if (connectionPassword) [connectionPassword release], connectionPassword = nil; - if (connectionSocket) [connectionSocket release], connectionSocket = nil; - - // Determine whether a socket connection should be made - if (!host || ![host length] || [host isEqualToString:@"localhost"]) { - if (!aSocket || ![aSocket length]) { - aSocket = [self findSocketPath]; - if (!aSocket) aSocket = @""; - } - connectionSocket = [[NSString alloc] initWithString:aSocket]; - connectionPort = 0; - - // Otherwise, use host and port details - } else { - connectionHost = [[NSString alloc] initWithString:host]; - connectionPort = port; - } - - // Store the username - connectionLogin = [[NSString alloc] initWithString:(login?login:@"")]; - - // Store the password if supplied. It is more secure to allow MCPConnection to ask the - // delegate to retrieve details - see delegate method keychainPasswordForConnection:) - if (pass) connectionPassword = [[NSString alloc] initWithString:pass]; - - // Trigger a connection and return the resulting status - return [self connect]; -} - -/** - * Selects a database to work with. - * - * The MCPConnection object needs to be properly inited and connected to a server. - * If a connection is not yet set or the selection of the database didn't work, returns NO. Returns YES in normal cases where the database is properly selected. - * - * So far, if dbName is a nil pointer it will return NO (as if it cannot connect), most likely this will throw an exception in the future. - */ -- (BOOL)selectDB:(NSString *) dbName -{ - if (!mConnected) return NO; - - if (![self checkConnection]) return NO; - - // Here we should throw an exception, impossible to select a databse if the string is indeed a nil pointer - if (dbName == nil) return NO; - - if (mConnected) { - - // Ensure the change is made in UTF8 to avoid encoding problems - BOOL changeEncoding = ![[self encoding] isEqualToString:@"utf8"]; - if (changeEncoding) { - [self storeEncodingForRestoration]; - [self setEncoding:@"utf8"]; - } - - const char *theDBName = [self cStringFromString:dbName]; - [self lockConnection]; - if (0 == mysql_select_db(mConnection, theDBName)) { - [self unlockConnection]; - return YES; - } - [self unlockConnection]; - - if (changeEncoding) [self restoreStoredEncoding]; - } - - [self setLastErrorMessage:nil]; - - lastQueryErrorId = mysql_errno(mConnection); - - if (connectionProxy) { - [connectionProxy disconnect]; - } - - return NO; -} - -#pragma mark - -#pragma mark Error information - -/** - * Returns whether the last query errored or not. - */ -- (BOOL)queryErrored -{ - return (lastQueryErrorMessage)?YES:NO; -} - -/** - * Returns a string with the last MySQL error message on the connection. - */ -- (NSString *)getLastErrorMessage -{ - return lastQueryErrorMessage; -} - -/** - * Sets the string for the last MySQL error message on the connection, - * managing memory as appropriate. Supply a nil string to store the - * last error on the connection. - */ -- (void)setLastErrorMessage:(NSString *)theErrorMessage -{ - if (!theErrorMessage) theErrorMessage = [self stringWithCString:mysql_error(mConnection)]; - - if (lastQueryErrorMessage) [lastQueryErrorMessage release], lastQueryErrorMessage = nil; - if (theErrorMessage && [theErrorMessage length]) lastQueryErrorMessage = [[NSString alloc] initWithString:theErrorMessage]; -} - -/** - * Returns the ErrorID of the last MySQL error on the connection. - */ -- (NSUInteger)getLastErrorID -{ - return lastQueryErrorId; -} - -/** - * Determines whether a supplied error number can be classed as a connection error. - */ -+ (BOOL)isErrorNumberConnectionError:(NSInteger)theErrorNumber -{ - switch (theErrorNumber) { - case 2001: // CR_SOCKET_CREATE_ERROR - case 2002: // CR_CONNECTION_ERROR - case 2003: // CR_CONN_HOST_ERROR - case 2004: // CR_IPSOCK_ERROR - case 2005: // CR_UNKNOWN_HOST - case 2006: // CR_SERVER_GONE_ERROR - case 2007: // CR_VERSION_ERROR - case 2009: // CR_WRONG_HOST_INFO - case 2012: // CR_SERVER_HANDSHAKE_ERR - case 2013: // CR_SERVER_LOST - case 2027: // CR_MALFORMED_PACKET - case 2032: // CR_DATA_TRUNCATED - case 2047: // CR_CONN_UNKNOW_PROTOCOL - case 2048: // CR_INVALID_CONN_HANDLE - case 2050: // CR_FETCH_CANCELED - case 2055: // CR_SERVER_LOST_EXTENDED - return YES; - } - - return NO; -} - -/** - * Update error messages - for example after a streaming result has finished processing. - */ -- (void)updateErrorStatuses -{ - [self setLastErrorMessage:nil]; - lastQueryErrorId = mysql_errno(mConnection); -} - -#pragma mark - -#pragma mark Queries - -/** - * Takes a NSData object and transform it in a proper string for sending to the server in between quotes. - */ -- (NSString *)prepareBinaryData:(NSData *)theData -{ - const char *theCDataBuffer = [theData bytes]; - unsigned long theLength = [theData length]; - char *theCEscBuffer = (char *)calloc(sizeof(char),(theLength*2) + 1); - NSString *theReturn; - - // mysql_hex_string requires an active connection. - // If no connection is present, and no automatic reconnections can be made, return nil. - if (!mConnected && ![self checkConnection]) { - - // Inform the delegate that there is no connection available - if (delegate && [delegate respondsToSelector:@selector(noConnectionAvailable:)]) { - [delegate noConnectionAvailable:self]; - } - - return nil; - } - - // If thirty seconds have elapsed since the last query, check the connection. - // This minimises the impact of continuous additional connection checks, but handles - // most network issues and keeps high read/write timeouts for long queries. - if ([self timeConnected] - lastQueryExecutedAtTime > 30) { - if (![self checkConnection]) return nil; - lastQueryExecutedAtTime = [self timeConnected]; - } - - // Using the mysql_hex_string function : (NO other solution found to be able to support blobs while using UTF-8 charset). - mysql_hex_string(theCEscBuffer, theCDataBuffer, theLength); - theReturn = [NSString stringWithFormat:@"%s", theCEscBuffer]; - free (theCEscBuffer); - return theReturn; -} - -/** - * Takes a string and escape any special character (like single quote : ') so that the string can be used directly in a query. - */ -- (NSString *)prepareString:(NSString *)theString -{ - NSData *theCData = [theString dataUsingEncoding:stringEncoding allowLossyConversion:YES]; - unsigned long theLength = [theCData length]; - char *theCEscBuffer; - NSString *theReturn; - unsigned long theEscapedLength; - - if (theString == nil) { - // In the mean time, no one should call this method on a nil string, the test should be done before by the user of this method. - return @""; - } - - // mysql_real_escape_string requires an active connection. - // If no connection is present, and no automatic reconnections can be made, return nil. - if (!mConnected && ![self checkConnection]) { - - // Inform the delegate that there is no connection available - if (delegate && [delegate respondsToSelector:@selector(noConnectionAvailable:)]) { - [delegate noConnectionAvailable:self]; - } - - return nil; - } - - // If thirty seconds have elapsed since the last query, check the connection. - // This minimises the impact of continuous additional connection checks, but handles - // most network issues and keeps high read/write timeouts for long queries. - if ([self timeConnected] - lastQueryExecutedAtTime > 30) { - if (![self checkConnection]) return nil; - lastQueryExecutedAtTime = [self timeConnected]; - } - - theCEscBuffer = (char *)calloc(sizeof(char),(theLength * 2) + 1); - theEscapedLength = mysql_real_escape_string(mConnection, theCEscBuffer, [theCData bytes], theLength); - theReturn = [[NSString alloc] initWithData:[NSData dataWithBytes:theCEscBuffer length:theEscapedLength] encoding:stringEncoding]; - free(theCEscBuffer); - - return [theReturn autorelease]; -} - -/** - * Use the class of the theObject to know how it should be prepared for usage with the database. - * If theObject is a string, this method will put single quotes to both its side and escape any necessary - * character using prepareString: method. If theObject is NSData, the prepareBinaryData: method will be - * used instead. - * - * For NSNumber object, the number is just quoted, for calendar dates, the calendar date is formatted in - * the preferred format for the database. - */ -- (NSString *)quoteObject:(id)theObject -{ - if ((! theObject) || ([theObject isNSNull])) { - return @"NULL"; - } - - if ([theObject isKindOfClass:[NSData class]]) { - return [NSString stringWithFormat:@"X'%@'", [self prepareBinaryData:(NSData *) theObject]]; - } - - if ([theObject isKindOfClass:[NSString class]]) { - return [NSString stringWithFormat:@"'%@'", [self prepareString:(NSString *) theObject]]; - } - - if ([theObject isKindOfClass:[NSNumber class]]) { - return [NSString stringWithFormat:@"%@", theObject]; - } - - if ([theObject isKindOfClass:[NSCalendarDate class]]) { - return [NSString stringWithFormat:@"'%@'", [(NSCalendarDate *)theObject descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"]]; - } - - return [NSString stringWithFormat:@"'%@'", [self prepareString:[theObject description]]]; -} - -/** - * Takes a query string and return an MCPResult object holding the result of the query. - * The returned MCPResult is not retained, the client is responsible for that (it's autoreleased before being returned). If no field are present in the result (like in an insert query), will return nil (#{difference from previous version implementation}). Though, if their is at least one field the result will be non nil (even if no row are selected). - * - * Note that if you want to use this method with binary data (in the query), you should use !{prepareBinaryData:} to include the binary data in the query string. Also if you want to include in your query a string containing any special character (\, ', " ...) then you should use !{prepareString}. - */ -- (MCPResult *)queryString:(NSString *)query -{ - return [self queryString:query usingEncoding:stringEncoding streamingResult:MCPStreamingNone]; -} - -/** - * Takes a query string and returns an MCPStreamingResult representing the result of the query. - * If no fields are present in the result, nil will be returned. - * Uses safe/fast mode, which may use more memory as results are downloaded. - */ -- (MCPStreamingResult *)streamingQueryString:(NSString *)query -{ - return [self queryString:query usingEncoding:stringEncoding streamingResult:MCPStreamingFast]; -} - -/** - * Takes a query string and returns an MCPStreamingResult representing the result of the query. - * If no fields are present in the result, nil will be returned. - * Can be used in either fast/safe mode, where data is downloaded as fast as possible to avoid - * blocking the server, or in full streaming mode for lowest memory usage but potentially blocking - * the table. - */ -- (MCPStreamingResult *)streamingQueryString:(NSString *)query useLowMemoryBlockingStreaming:(BOOL)fullStream -{ - return [self queryString:query usingEncoding:stringEncoding streamingResult:(fullStream?MCPStreamingLowMem:MCPStreamingFast)]; -} - -/** - * Error checks connection extensively - if this method fails due to a connection error, it will ask how to - * proceed and loop depending on the status, not returning control until either the query has been executed - * and the result can be returned or the connection and document have been closed. - */ -- (id)queryString:(NSString *) query usingEncoding:(NSStringEncoding)aStringEncoding streamingResult:(NSInteger) streamResultType -{ - MCPResult *theResult = nil; - double queryStartTime, queryExecutionTime; - const char *theCQuery; - unsigned long theCQueryLength; - NSInteger queryResultCode; - NSInteger queryErrorId = 0; - my_ulonglong queryAffectedRows = 0; - NSInteger currentMaxAllowedPacket = -1; - BOOL isQueryRetry = NO; - NSString *queryErrorMessage = nil; - - // Reset the query cancelled boolean - queryCancelled = NO; - - // If no connection is present, and no automatic reconnections can be made, return nil. - if (!mConnected && ![self checkConnection]) { - // Write a log entry - if ([delegate respondsToSelector:@selector(queryGaveError:connection:)]) [delegate queryGaveError:@"No connection available!" connection:self]; - - // Notify that the query has been performed - [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"SMySQLQueryHasBeenPerformed" object:delegate]; - - // Inform the delegate that there is no connection available - if (delegate && [delegate respondsToSelector:@selector(noConnectionAvailable:)]) { - [delegate noConnectionAvailable:self]; - } - - return nil; - } - - // Inform the delegate about the query if logging is enabled and delegate responds to willQueryString:connection: - if (delegateQueryLogging && delegateResponseToWillQueryString) { - [delegate willQueryString:query connection:self]; - } - - // If thirty seconds have elapsed since the last query, check the connection. - // This minimises the impact of continuous additional connection checks, but handles - // most network issues and keeps high read/write timeouts for long queries. - if ([self timeConnected] - lastQueryExecutedAtTime > 30 - && ![self checkConnection]) - { - return nil; - } - - // Derive the query string in the correct encoding - NSData *d = NSStringDataUsingLossyEncoding(query, aStringEncoding, 1); - theCQuery = [d bytes]; - // Set the length of the current query - theCQueryLength = [d length]; - - // Check query length against max_allowed_packet; if it is larger, the - // query would error, so if max_allowed_packet is editable for the user - // increase it for the current session and reconnect. - if (maxAllowedPacketSize < theCQueryLength) { - - if (isMaxAllowedPacketEditable) { - - currentMaxAllowedPacket = maxAllowedPacketSize; - [self setMaxAllowedPacketTo:strlen(theCQuery)+1024 resetSize:NO]; - [self reconnect]; - - } - else { - NSString *errorMessage = [NSString stringWithFormat:NSLocalizedString(@"The query length of %lu bytes is larger than max_allowed_packet size (%lu).", - @"error message if max_allowed_packet < query size"), - (unsigned long)theCQueryLength, maxAllowedPacketSize]; - - // Write a log entry and update the connection error messages for those uses that check it - if ([delegate respondsToSelector:@selector(queryGaveError:connection:)]) [delegate queryGaveError:errorMessage connection:self]; - [self setLastErrorMessage:errorMessage]; - - // Notify that the query has been performed - [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"SMySQLQueryHasBeenPerformed" object:delegate]; - - // Show an error alert while resetting - if ([delegate respondsToSelector:@selector(showErrorWithTitle:message:)]) - [delegate showErrorWithTitle:NSLocalizedString(@"Error", @"error") message:errorMessage]; - else - NSRunAlertPanel(NSLocalizedString(@"Error", @"error"), errorMessage, @"OK", nil, nil); - - return nil; - } - } - - // In a loop to allow one reattempt, perform the query. - while (1) { - - // If this query has failed once already, check the connection - if (isQueryRetry) { - if (![self checkConnection]) { - if (queryErrorMessage) [queryErrorMessage release], queryErrorMessage = nil; - - // Notify that the query has been performed - [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:@"SMySQLQueryHasBeenPerformed" object:delegate]; - return nil; - } - } - - [self lockConnection]; - - // Run (or re-run) the query, timing the execution time of the query - note - // that this time will include network lag. - queryStartTime = [self timeConnected]; - queryResultCode = mysql_real_query(mConnection, theCQuery, theCQueryLength); - lastQueryExecutedAtTime = [self timeConnected]; - queryExecutionTime = lastQueryExecutedAtTime - queryStartTime; - - // On success, capture the results - if (0 == queryResultCode) { - - queryAffectedRows = mysql_affected_rows(mConnection); - - if (mysql_field_count(mConnection) != 0) { - - // For normal result sets, fetch the results and unlock the connection - if (streamResultType == MCPStreamingNone) { - theResult = [[MCPResult alloc] initWithMySQLPtr:mConnection encoding:stringEncoding timeZone:mTimeZone]; - if (!queryCancelled || !queryCancelUsedReconnect) { - [self unlockConnection]; - } - - // For streaming result sets, fetch the result pointer and leave the connection locked - } else if (streamResultType == MCPStreamingFast) { - theResult = [[MCPStreamingResult alloc] initWithMySQLPtr:mConnection encoding:stringEncoding timeZone:mTimeZone connection:self withFullStreaming:NO]; - } else if (streamResultType == MCPStreamingLowMem) { - theResult = [[MCPStreamingResult alloc] initWithMySQLPtr:mConnection encoding:stringEncoding timeZone:mTimeZone connection:self withFullStreaming:YES]; - } - - // Ensure no problem occurred during the result fetch - if (mysql_errno(mConnection) != 0) { - queryErrorMessage = [self stringWithCString:mysql_error(mConnection)]; - if (queryErrorMessage) [queryErrorMessage retain]; - queryErrorId = mysql_errno(mConnection); - break; - } - } else { - [self unlockConnection]; - } - - queryErrorMessage = [[NSString alloc] initWithString:@""]; - queryErrorId = 0; - if (streamResultType == MCPStreamingNone && queryAffectedRows == (my_ulonglong)~0) { - queryAffectedRows = mysql_affected_rows(mConnection); - } - - // On failure, set the error messages and IDs - } else { - if (!queryCancelled || !queryCancelUsedReconnect) { - [self unlockConnection]; - } - - if (queryCancelled) { - if (queryErrorMessage) [queryErrorMessage release], queryErrorMessage = nil; - queryErrorMessage = [[NSString alloc] initWithString:NSLocalizedString(@"Query cancelled.", @"Query cancelled error")]; - queryErrorId = 1317; - } else { - if (queryErrorMessage) [queryErrorMessage release], queryErrorMessage = nil; - queryErrorMessage = [self stringWithCString:mysql_error(mConnection)]; - if (queryErrorMessage) [queryErrorMessage retain]; - queryErrorId = mysql_errno(mConnection); - - // If the error was a connection error, retry once - if (!isQueryRetry && retryAllowed && [MCPConnection isErrorNumberConnectionError:queryErrorId]) { - isQueryRetry = YES; - continue; - } - } - } - - break; - } - - if (streamResultType == MCPStreamingNone) { - - // If the mysql thread id has changed as a result of a connection error, - // ensure connection details are still correct - if (connectionThreadId != mConnection->thread_id) [self restoreConnectionDetails]; - - // If max_allowed_packet was changed, reset it to default - if(currentMaxAllowedPacket > -1) - [self setMaxAllowedPacketTo:currentMaxAllowedPacket resetSize:YES]; - } - - // Update error strings and IDs - lastQueryErrorId = queryErrorId; - - if (queryErrorMessage) { - [self setLastErrorMessage:queryErrorMessage]; - - [queryErrorMessage release]; - } - - lastQueryAffectedRows = queryAffectedRows; - lastQueryExecutionTime = queryExecutionTime; - - // If an error occurred, inform the delegate - if (queryResultCode & delegateResponseToWillQueryString) - [delegate queryGaveError:lastQueryErrorMessage connection:self]; - - if (!theResult) return nil; - return [theResult autorelease]; -} - -/** - * Returns the number of affected rows by the last query. Only actual queries - * supplied via queryString:, streamingQueryString:, streamingQueryString:useLowMemoryBlockingStreaming: - * or queryString:usingEncoding:streamingResult: will have their affected rows - * returned, not any "meta" type queries. - */ -- (my_ulonglong)affectedRows -{ - if (mConnected) return lastQueryAffectedRows; - - return 0; -} - -/** - * If the last query was an insert in a table having a autoindex column, returns the ID - * (autoindexed field) of the last row inserted. - */ -- (my_ulonglong)insertId -{ - if (mConnected) { - return mysql_insert_id(mConnection); - } - - return 0; -} - -/** - * Cancel the currently running query. This tries to kill the current query, and if that - * isn't possible, resets the connection. - */ -- (void) cancelCurrentQuery -{ - - // If not connected, return. - if (![self isConnected]) return; - - // Check whether a query is actually being performed - if not, also return. - if ([self tryLockConnection]) { - [self unlockConnection]; - return; - } - - // Set queryCancelled to prevent query retries - queryCancelled = YES; - - // Set up a new connection, and running a KILL QUERY via it. - MYSQL *killerConnection = mysql_init(NULL); - if (killerConnection) { - const char *theLogin = [self cStringFromString:connectionLogin]; - const char *theHost; - const char *thePass = NULL; - const char *theSocket; - void *connectionSetupStatus; - - mysql_options(killerConnection, MYSQL_OPT_CONNECT_TIMEOUT, (const void *)&connectionTimeout); - mysql_options(killerConnection, MYSQL_SET_CHARSET_NAME, "utf8"); - - // Set up the host, socket and password as per the connect method - if (!connectionHost || ![connectionHost length]) { - theHost = NULL; - } else { - theHost = [connectionHost UTF8String]; - } - if (connectionSocket == nil || ![connectionSocket length]) { - theSocket = kMCPConnectionDefaultSocket; - } else { - theSocket = [connectionSocket UTF8String]; - } - if (!connectionPassword) { - if (delegate && [delegate respondsToSelector:@selector(keychainPasswordForConnection:)]) { - thePass = [[delegate keychainPasswordForConnection:self] UTF8String]; - } - } else { - thePass = [connectionPassword UTF8String]; - } - if (useSSL) { - mysql_ssl_set(mConnection, - sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, - sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, - sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, - NULL, - kMCPSSLCipherList); - } - - // Connect - connectionSetupStatus = mysql_real_connect(killerConnection, theHost, theLogin, thePass, NULL, (unsigned int)connectionPort, theSocket, mConnectionFlags); - thePass = NULL; - if (connectionSetupStatus) { - - // Set up a KILL query. For MySQL 5+, kill just the query; otherwise, kill the thread. - NSStringEncoding killerConnectionEncoding = [MCPConnection encodingForMySQLEncoding:mysql_character_set_name(killerConnection)]; - NSString *killQueryString; - if ([self serverMajorVersion] >= 5) { - killQueryString = [NSString stringWithFormat:@"KILL QUERY %lu", mConnection->thread_id]; - } else { - killQueryString = [NSString stringWithFormat:@"KILL %lu", mConnection->thread_id]; - } - NSData *encodedKillQueryData = NSStringDataUsingLossyEncoding(killQueryString, killerConnectionEncoding, 1); - const char *killQueryCString = [encodedKillQueryData bytes]; - unsigned long killQueryCStringLength = [encodedKillQueryData length]; - int killerReturnError = mysql_real_query(killerConnection, killQueryCString, killQueryCStringLength); - mysql_close(killerConnection); - if (killerReturnError == 0) { - queryCancelUsedReconnect = NO; - return; - } - NSLog(@"Task cancellation: kill query failed (Returned status %d)", killerReturnError); - } else { - NSLog(@"Task cancellation connection failed (error %u)", mysql_errno(killerConnection)); - } - } else { - NSLog(@"Task cancelletion MySQL init failed."); - } - - // As the attempt may have taken up to the connection timeout, check lock status - // again, returning if nothing is required. - if ([self tryLockConnection]) { - [self unlockConnection]; - return; - } - - // Reset the connection - [self unlockConnection]; - if (!isDisconnecting) [self reconnect]; - - // Set queryCancelled again to handle requery cleanups, and return. - queryCancelled = YES; - queryCancelUsedReconnect = YES; -} - -/** - * Return whether the last query was cancelled - */ -- (BOOL)queryCancelled -{ - return queryCancelled; -} - -/** - * If the last query was cancelled, returns whether that cancellation - * required a connection reset. If the last query was not cancelled - * the behaviour is undefined. - */ -- (BOOL)queryCancellationUsedReconnect -{ - return queryCancelUsedReconnect; -} - -/** - * Retrieves all remaining results and discards them. - * Necessary if we only retrieve one result, and want to discard all the others. - */ -- (void)flushMultiResults -{ - // repeat as long as there are results - while(!mysql_next_result(mConnection)) - { - MYSQL_RES *result = mysql_use_result(mConnection); - // check if the result is really a result - if (result) { - // retrieve all rows - while (mysql_fetch_row(result)); - mysql_free_result(result); - } - } -} - -#pragma mark - -#pragma mark Connection locking - -/** - * Lock the connection. This must be done before performing any operation - * that is not thread safe, eg. performing queries or pinging. - */ -- (void)lockConnection -{ - // We can only start a query as soon as the condition is MCPConnectionIdle - [connectionLock lockWhenCondition:MCPConnectionIdle]; - - // We now set the condition to MCPConnectionBusy - [connectionLock unlockWithCondition:MCPConnectionBusy]; -} - -/** - * Try locking the connection. If the connection is idle (unlocked), this method - * locks the connection and returns YES. The connection must afterwards be unlocked - * using unlockConnection. If the connection is currently busy (locked), this - * method immediately returns NO and doesn't lock the connection. - */ -- (BOOL)tryLockConnection -{ - // check if the condition is MCPConnectionIdle - if ([connectionLock tryLockWhenCondition:MCPConnectionIdle]) { - // We're allowed to use the connection! - [connectionLock unlockWithCondition:MCPConnectionBusy]; - return YES; - } else { - // Someone else is using the connection right now - return NO; - } -} - - -/** - * Unlock the connection. - */ -- (void)unlockConnection -{ - // We don't care if the connection is busy or not - [connectionLock lock]; - - // We check if the connection actually was busy. If it wasn't busy, - // it means we probably tried to unlock the connection twice. This is - // potentially dangerous, therefore we log this to the console - if ([connectionLock condition] != MCPConnectionBusy) { - NSLog(@"Tried to unlock the connection, but it wasn't locked."); - } - - // Since we connected with CLIENT_MULTI_RESULT, we must make sure there are nor more results! - // This is still a bit of a dirty hack - if (mConnected && mConnection && mConnection->net.vio && mConnection->net.buff && mysql_more_results(mConnection)) { - NSLog(@"Discarding unretrieved results. This is currently normal when using CALL."); - [self flushMultiResults]; - } - - // We tell everyone that the connection is available again! - [connectionLock unlockWithCondition:MCPConnectionIdle]; -} - -#pragma mark - -#pragma mark Database structure - -/** - * Just a fast wrapper for the more complex !{listDBsWithPattern:} method. - */ -- (MCPResult *)listDBs -{ - return [self listDBsLike:nil]; -} - -/** - * Returns a list of database which name correspond to the SQL regular expression in 'pattern'. - * The comparison is done with wild card extension : % and _. - * The result should correspond to the queryString:@"SHOW databases [LIKE wild]"; but implemented with mysql_list_dbs. - * If an empty string or nil is passed as pattern, all databases will be shown. - */ -- (MCPResult *)listDBsLike:(NSString *)dbsName -{ - if (!mConnected) return NO; - - MCPResult *theResult = nil; - MYSQL_RES *theResPtr; - - if (![self checkConnection]) return [[[MCPResult alloc] init] autorelease]; - - // Ensure UTF8 - where supported - when getting database list. - NSString *currentEncoding = [NSString stringWithString:encoding]; - BOOL currentEncodingUsesLatin1Transport = encodingUsesLatin1Transport; - [self setEncoding:@"utf8"]; - - [self lockConnection]; - if ((dbsName == nil) || ([dbsName isEqualToString:@""])) { - if ((theResPtr = mysql_list_dbs(mConnection, NULL))) { - theResult = [[MCPResult alloc] initWithResPtr: theResPtr encoding:stringEncoding timeZone:mTimeZone]; - } - else { - theResult = [[MCPResult alloc] init]; - } - } - else { - const char *theCDBsName = (const char *)[self cStringFromString:dbsName]; - - if ((theResPtr = mysql_list_dbs(mConnection, theCDBsName))) { - theResult = [[MCPResult alloc] initWithResPtr:theResPtr encoding:stringEncoding timeZone:mTimeZone]; - } - else { - theResult = [[MCPResult alloc] init]; - } - } - [self unlockConnection]; - - // Restore the connection encoding if necessary - [self setEncoding:currentEncoding]; - [self setEncodingUsesLatin1Transport:currentEncodingUsesLatin1Transport]; - - if (theResult) { - [theResult autorelease]; - } - - return theResult; -} - -/** - * Make sure a DB is selected (with !{selectDB:} method) first. - */ -- (MCPResult *)listTables -{ - return [self listTablesLike:nil]; -} - -/** - * From within a database, give back the list of table which name correspond to tablesName - * (with wild card %, _ extension). Correspond to queryString:@"SHOW tables [LIKE wild]"; uses mysql_list_tables function. - * - * If an empty string or nil is passed as tablesName, all tables will be shown. - * - * WARNING: #{produce an error if no databases are selected} (with !{selectDB:} for example). - */ -- (MCPResult *)listTablesLike:(NSString *)tablesName -{ - if (!mConnected) return NO; - - MCPResult *theResult = nil; - MYSQL_RES *theResPtr; - - if (![self checkConnection]) return [[[MCPResult alloc] init] autorelease]; - - [self lockConnection]; - if ((tablesName == nil) || ([tablesName isEqualToString:@""])) { - if ((theResPtr = mysql_list_tables(mConnection, NULL))) { - theResult = [[MCPResult alloc] initWithResPtr: theResPtr encoding:stringEncoding timeZone:mTimeZone]; - } - else { - theResult = [[MCPResult alloc] init]; - } - } - else { - const char *theCTablesName = (const char *)[self cStringFromString:tablesName]; - if ((theResPtr = mysql_list_tables(mConnection, theCTablesName))) { - theResult = [[MCPResult alloc] initWithResPtr: theResPtr encoding:stringEncoding timeZone:mTimeZone]; - } - else { - theResult = [[MCPResult alloc] init]; - } - } - - [self unlockConnection]; - - if (theResult) { - [theResult autorelease]; - } - - return theResult; -} - -- (NSArray *)listTablesFromDB:(NSString *)dbName { - return [self listTablesFromDB:dbName like:nil]; -} - -/** - * List tables in DB specified by dbName and corresponding to pattern. - * This method indeed issues a !{SHOW TABLES FROM dbName LIKE ...} query to the server. - * This is done this way to make sure the selected DB is not changed by this method. - */ -- (NSArray *)listTablesFromDB:(NSString *)dbName like:(NSString *)tablesName { - MCPResult *theResult; - if ((tablesName == nil) || ([tablesName isEqualToString:@""])) { - NSString *theQuery = [NSString stringWithFormat:@"SHOW TABLES FROM %@", - [dbName backtickQuotedString]]; - theResult = [self queryString:theQuery]; - } else { - NSString *theQuery = [NSString stringWithFormat:@"SHOW TABLES FROM %@ LIKE '%@'", - [dbName backtickQuotedString], - [tablesName backtickQuotedString]]; - theResult = [self queryString:theQuery]; - } - [theResult setReturnDataAsStrings:YES]; - NSString *theTableName; - NSMutableArray *theDBTables = [NSMutableArray array]; - - // NSLog(@"num of fields: %@; num of rows: %@", [theResult numOfFields], [theResult numOfRows]); - if ([theResult numOfRows] > 0) { - my_ulonglong i; - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { - theTableName = [[theResult fetchRowAsArray] objectAtIndex:0]; - [theDBTables addObject:theTableName]; - } - } - - return theDBTables; -} - -/** - * Just a fast wrapper for the more complex list !{listFieldsWithPattern:forTable:} method. - */ -- (MCPResult *)listFieldsFromTable:(NSString *)tableName -{ - return [self listFieldsFromTable:tableName like:nil]; -} - -/** - * Show all the fields of the table tableName which name correspond to pattern (with wild card expansion : %,_). - * Indeed, and as recommanded from mysql reference, this method is NOT using mysql_list_fields but the !{queryString:} method. - * If an empty string or nil is passed as fieldsName, all fields (of tableName) will be returned. - */ -- (MCPResult *)listFieldsFromTable:(NSString *)tableName like:(NSString *)fieldsName -{ - MCPResult *theResult; - - if ((fieldsName == nil) || ([fieldsName isEqualToString:@""])) { - NSString *theQuery = [NSString stringWithFormat:@"SHOW COLUMNS FROM %@", - [tableName backtickQuotedString]]; - theResult = [self queryString:theQuery]; - } - else { - NSString *theQuery = [NSString stringWithFormat:@"SHOW COLUMNS FROM %@ LIKE '%@'", - [tableName backtickQuotedString], - [fieldsName backtickQuotedString]]; - theResult = [self queryString:theQuery]; - } - [theResult setReturnDataAsStrings:YES]; - - return theResult; -} - -/** - * Updates the dict containing the structure of all available databases (mainly for completion/navigator) - * executed on a new connection. - * - * TODO: Split this entire method out of MCPKit if possible - */ -- (void)queryDbStructureWithUserInfo:(NSDictionary*)userInfo -{ - NSAutoreleasePool *queryPool = [[NSAutoreleasePool alloc] init]; - BOOL structureWasUpdated = NO; - - // if 'cancelQuerying' is set try to interrupt any current querying - if(userInfo && [userInfo objectForKey:@"cancelQuerying"]) - cancelQueryingDbStructure = YES; - - // Requests are queued - while(isQueryingDbStructure > 0) { usleep(1000000); } - - cancelQueryingDbStructure = NO; - - [[NSNotificationCenter defaultCenter] postNotificationName:@"SPDBStructureIsUpdating" object:delegate]; - - NSString *SPUniqueSchemaDelimiter = @""; - - NSString *connectionID; - if([delegate respondsToSelector:@selector(connectionID)]) - connectionID = [NSString stringWithString:[[self delegate] connectionID]]; - else - connectionID = @"_"; - - // Re-init with already cached data from navigator controller - NSMutableDictionary *queriedStructure = [NSMutableDictionary dictionary]; - NSDictionary *dbstructure = [[self delegate] getDbStructure]; - if (dbstructure) [queriedStructure setDictionary:[NSMutableDictionary dictionaryWithDictionary:dbstructure]]; - - NSMutableArray *queriedStructureKeys = [NSMutableArray array]; - NSArray *dbStructureKeys = [[self delegate] allSchemaKeys]; - if (dbStructureKeys) [queriedStructureKeys setArray:dbStructureKeys]; - - // Retrieve all the databases known of by the delegate - NSMutableArray *connectionDatabases = [NSMutableArray array]; - [connectionDatabases addObjectsFromArray:[[self delegate] allSystemDatabaseNames]]; - [connectionDatabases addObjectsFromArray:[[self delegate] allDatabaseNames]]; - - // Add all known databases coming from connection if they aren't parsed yet - for (id db in connectionDatabases) { - NSString *dbid = [NSString stringWithFormat:@"%@%@%@", connectionID, SPUniqueSchemaDelimiter, db]; - if(![queriedStructure objectForKey:dbid]) { - structureWasUpdated = YES; - [queriedStructure setObject:db forKey:dbid]; - [queriedStructureKeys addObject:dbid]; - } - } - - // Check the existing databases in the 'structure' and 'allKeysOfDbStructure' stores, - // and remove any that are no longer found in the connectionDatabases list (indicating deletion). - // Iterate through extracted keys to avoid <NSCFDictionary> mutation while being enumerated. - NSArray *keys = [queriedStructure allKeys]; - for(id key in keys) { - NSString *db = [[key componentsSeparatedByString:SPUniqueSchemaDelimiter] objectAtIndex:1]; - if(![connectionDatabases containsObject:db]) { - structureWasUpdated = YES; - [queriedStructure removeObjectForKey:key]; - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT SELF BEGINSWITH %@", [NSString stringWithFormat:@"%@%@", key, SPUniqueSchemaDelimiter]]; - [queriedStructureKeys filterUsingPredicate:predicate]; - [queriedStructureKeys removeObject:key]; - } - } - - NSString *currentDatabase = nil; - if([delegate respondsToSelector:@selector(database)]) - currentDatabase = [[self delegate] database]; - - // Determine whether the database details need to be queried. - BOOL shouldQueryStructure = YES; - NSString *db_id = nil; - - // If no database is selected, no need to check further - if(!currentDatabase || (currentDatabase && ![currentDatabase length])) { - shouldQueryStructure = NO; - - // Otherwise, build up the schema key for the database to be retrieved. - } else { - db_id = [NSString stringWithFormat:@"%@%@%@", connectionID, SPUniqueSchemaDelimiter, currentDatabase]; - - // Check to see if a cache already exists for the database. - if ([queriedStructure objectForKey:db_id] && [[queriedStructure objectForKey:db_id] isKindOfClass:[NSDictionary class]]) { - - // The cache is available. If the `mysql` or `information_schema` databases are being queried, - // never requery as their structure will never change. - // 5.5.3+ also has performance_schema meta database - if ([currentDatabase isEqualToString:@"mysql"] || [currentDatabase isEqualToString:@"information_schema"] || [currentDatabase isEqualToString:@"performance_schema"]) { - shouldQueryStructure = NO; - - // Otherwise, if the forceUpdate flag wasn't supplied or evaluates to false, also don't update. - } else if (userInfo == nil || ![userInfo objectForKey:@"forceUpdate"] || ![[userInfo objectForKey:@"forceUpdate"] boolValue]) { - shouldQueryStructure = NO; - } - } - } - - // If it has been determined that no new structure needs to be retrieved, clean up and return. - if (!shouldQueryStructure) { - - // Update the global variables and make sure that no request reads these global variables - // while updating - [self performSelectorOnMainThread:@selector(lockQuerying) withObject:nil waitUntilDone:YES]; - [self performSelectorOnMainThread:@selector(updateGlobalVariablesWith:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:queriedStructure, @"structure", queriedStructureKeys, @"keys", nil] waitUntilDone:YES]; - [self performSelectorOnMainThread:@selector(unlockQuerying) withObject:nil waitUntilDone:YES]; - if (structureWasUpdated) - [[NSNotificationCenter defaultCenter] postNotificationName:@"SPDBStructureWasUpdated" object:delegate]; - [queryPool release]; - return; - } - - // Retrieve the tables and views for this database from SPTablesList - NSMutableArray *tablesAndViews = [NSMutableArray array]; - for (id aTable in [[[self delegate] valueForKeyPath:@"tablesListInstance"] allTableNames]) { - NSDictionary *aTableDict = [NSDictionary dictionaryWithObjectsAndKeys: - aTable, @"name", - @"0", @"type", - nil]; - [tablesAndViews addObject:aTableDict]; - } - for (id aView in [[[self delegate] valueForKeyPath:@"tablesListInstance"] allViewNames]) { - NSDictionary *aViewDict = [NSDictionary dictionaryWithObjectsAndKeys: - aView, @"name", - @"1", @"type", - nil]; - [tablesAndViews addObject:aViewDict]; - } - - // Do not parse more than 2000 tables/views per db - if([tablesAndViews count] > 2000) { - NSLog(@"%lu items in database %@. Only 2000 items can be parsed. Stopped parsing.", (unsigned long)[tablesAndViews count], currentDatabase); - [queryPool release]; - return; - } - - // For future usage - currently unused - // If the affected item name and type - for example, table type and table name - were supplied, extract it. - NSString *affectedItem = nil; - NSInteger affectedItemType = -1; - if(userInfo && [userInfo objectForKey:@"affectedItem"]) { - affectedItem = [userInfo objectForKey:@"affectedItem"]; - if([userInfo objectForKey:@"affectedItemType"]) - affectedItemType = [[userInfo objectForKey:@"affectedItemType"] intValue]; - else - affectedItem = nil; - } - - // Delete all stored data for the database to be updated, leaving the structure key - [queriedStructure removeObjectForKey:db_id]; - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT SELF BEGINSWITH %@", [NSString stringWithFormat:@"%@%@", db_id, SPUniqueSchemaDelimiter]]; - [queriedStructureKeys filterUsingPredicate:predicate]; - - // Set up the database as an empty mutable dictionary ready for tables, and store a reference - [queriedStructure setObject:[NSMutableDictionary dictionary] forKey:db_id]; - NSMutableDictionary *databaseStructure = [queriedStructure objectForKey:db_id]; - - NSString *currentDatabaseEscaped = [currentDatabase stringByReplacingOccurrencesOfString:@"`" withString:@"``"]; - - MYSQL *structConnection = mysql_init(NULL); - if (structConnection) { - const char *theLogin = [connectionLogin UTF8String]; - const char *theHost; - const char *thePass = NULL; - const char *theSocket; - void *connectionSetupStatus; - - mysql_options(structConnection, MYSQL_OPT_CONNECT_TIMEOUT, (const void *)&connectionTimeout); - mysql_options(structConnection, MYSQL_SET_CHARSET_NAME, "utf8"); - - // Set up the host, socket and password as per the connect method - if (!connectionHost || ![connectionHost length]) { - theHost = NULL; - } else { - theHost = [connectionHost UTF8String]; - } - if (connectionSocket == nil || ![connectionSocket length]) { - theSocket = kMCPConnectionDefaultSocket; - } else { - theSocket = [connectionSocket UTF8String]; - } - if (useSSL) { - mysql_ssl_set(mConnection, - sslKeyFilePath ? [sslKeyFilePath UTF8String] : NULL, - sslCertificatePath ? [sslCertificatePath UTF8String] : NULL, - sslCACertificatePath ? [sslCACertificatePath UTF8String] : NULL, - NULL, - kMCPSSLCipherList); - } - if (!connectionPassword) { - if (delegate && [delegate respondsToSelector:@selector(keychainPasswordForConnection:)]) { - thePass = [[delegate keychainPasswordForConnection:self] UTF8String]; - } - } else { - thePass = [connectionPassword UTF8String]; - } - - // Connect - connectionSetupStatus = mysql_real_connect(structConnection, theHost, theLogin, thePass, NULL, (unsigned int)connectionPort, theSocket, mConnectionFlags); - thePass = NULL; - if (connectionSetupStatus) { - MYSQL_RES *theResult; - MYSQL_ROW row; - NSString *charset; - NSUInteger uniqueCounter = 0; // used to make field data unique - NSString *query; - NSData *encodedQueryData; - const char *queryCString; - unsigned long queryCStringLength; - - // Get the doc encoding due to pref settings etc, defaulting to UTF8 - NSString *docEncoding = [self encoding]; - if (!docEncoding) docEncoding = @"utf8"; - NSStringEncoding theConnectionEncoding = [MCPConnection encodingForMySQLEncoding:[self cStringFromString:docEncoding]]; - - // Try to set connection encoding for MySQL >= 4.1 - if ([self serverMajorVersion] > 4 || ([self serverMajorVersion] >= 4 && [self serverMinorVersion] >= 1)) { - query = [NSString stringWithFormat:@"SET NAMES '%@'", docEncoding]; - encodedQueryData = NSStringDataUsingLossyEncoding(query, theConnectionEncoding, 1); - queryCString = [encodedQueryData bytes]; - queryCStringLength = [encodedQueryData length]; - if (mysql_real_query(structConnection, queryCString, queryCStringLength) != 0) { - NSLog(@"Error while querying the database structure. Could not set encoding to %@", docEncoding); - [queryPool release]; - return; - } - } - - // Increase global query-db-counter - [self performSelectorOnMainThread:@selector(incrementQueryingDbStructure) withObject:nil waitUntilDone:YES]; - - // Loop through the known tables and views, retrieving details for each - for (NSDictionary *aTableDict in tablesAndViews) { - - // If cancelled, abort without saving - if (cancelQueryingDbStructure) { - [self performSelectorOnMainThread:@selector(decrementQueryingDbStructure) withObject:nil waitUntilDone:YES]; - [queryPool release]; - return; - } - - if(![aTableDict objectForKey:@"name"]) continue; - // Extract the name - NSString *aTableName = [aTableDict objectForKey:@"name"]; - - if(!aTableName) continue; - if(![aTableName isKindOfClass:[NSString class]]) continue; - if(![aTableName length]) continue; - // Retrieve the column details - query = [NSString stringWithFormat:@"SHOW FULL COLUMNS FROM `%@` FROM `%@`", - [aTableName stringByReplacingOccurrencesOfString:@"`" withString:@"``"], - currentDatabaseEscaped]; - encodedQueryData = NSStringDataUsingLossyEncoding(query, theConnectionEncoding, 1); - queryCString = [encodedQueryData bytes]; - queryCStringLength = [encodedQueryData length]; - if (mysql_real_query(structConnection, queryCString, queryCStringLength) != 0) { - // NSLog(@"error %@", aTableName); - continue; - } - theResult = mysql_use_result(structConnection); - - // Add a structure key for this table - NSString *table_id = [NSString stringWithFormat:@"%@%@%@", db_id, SPUniqueSchemaDelimiter, aTableName]; - [queriedStructureKeys addObject:table_id]; - - // Add a mutable dictionary to the structure and store a reference - [databaseStructure setObject:[NSMutableDictionary dictionary] forKey:table_id]; - NSMutableDictionary *tableStructure = [databaseStructure objectForKey:table_id]; - - // Loop through the fields, extracting details for each - while ((row = mysql_fetch_row(theResult))) { - NSString *field = [self stringWithCString:row[0] usingEncoding:theConnectionEncoding] ; - NSString *type = [self stringWithCString:row[1] usingEncoding:theConnectionEncoding] ; - NSString *type_display = [type stringByReplacingOccurrencesOfRegex:@"\\(.*?,.*?\\)" withString:@"(…)"]; - NSString *coll = [self stringWithCString:row[2] usingEncoding:theConnectionEncoding] ; - NSString *isnull = [self stringWithCString:row[3] usingEncoding:theConnectionEncoding] ; - NSString *key = [self stringWithCString:row[4] usingEncoding:theConnectionEncoding] ; - NSString *def = [self stringWithCString:row[5] usingEncoding:theConnectionEncoding] ; - NSString *extra = [self stringWithCString:row[6] usingEncoding:theConnectionEncoding] ; - NSString *priv = [self stringWithCString:row[7] usingEncoding:theConnectionEncoding] ; - NSString *comment; - if (sizeof(row) > 8) { - comment = [self stringWithCString:row[8] usingEncoding:theConnectionEncoding] ; - } else { - comment = @""; - } - NSArray *a = [coll componentsSeparatedByString:@"_"]; - charset = ([a count]) ? [a objectAtIndex:0] : @""; - - // Add a structure key for this field - NSString *field_id = [NSString stringWithFormat:@"%@%@%@", table_id, SPUniqueSchemaDelimiter, field]; - [queriedStructureKeys addObject:field_id]; - - [tableStructure setObject:[NSArray arrayWithObjects:type, def, isnull, charset, coll, key, extra, priv, comment, type_display, [NSNumber numberWithUnsignedLongLong:uniqueCounter], nil] forKey:field_id]; - [tableStructure setObject:[aTableDict objectForKey:@"type"] forKey:@" struct_type "]; - uniqueCounter++; - } - mysql_free_result(theResult); - usleep(10); - } - - // If the MySQL version is higher than 5, also retrieve function/procedure details via the information_schema table - if([self serverMajorVersion] >= 5) { - - // The information_schema table is UTF-8 encoded - alter the connection - query = @"SET NAMES 'utf8'"; - encodedQueryData = NSStringDataUsingLossyEncoding(query, theConnectionEncoding, 1); - queryCString = [encodedQueryData bytes]; - queryCStringLength = [encodedQueryData length]; - if (mysql_real_query(structConnection, queryCString, queryCStringLength) == 0) { - - // Query for procedures and functions - query = [NSString stringWithFormat:@"SELECT * FROM `information_schema`.`ROUTINES` WHERE `information_schema`.`ROUTINES`.`ROUTINE_SCHEMA` = '%@'", [currentDatabase stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"]]; - encodedQueryData = NSStringDataUsingLossyEncoding(query, theConnectionEncoding, 1); - queryCString = [encodedQueryData bytes]; - queryCStringLength = [encodedQueryData length]; - if (mysql_real_query(structConnection, queryCString, queryCStringLength) == 0) { - theResult = mysql_use_result(structConnection); - - // Loop through the rows and extract the function details - while ((row = mysql_fetch_row(theResult))) { - - // If cancelled, abort without saving the new structure - if(cancelQueryingDbStructure) { - [self performSelectorOnMainThread:@selector(decrementQueryingDbStructure) withObject:nil waitUntilDone:YES]; - [queryPool release]; - return; - } - - NSString *fname = [self stringWithUTF8CString:row[0]]; - NSString *type = ([[self stringWithUTF8CString:row[4]] isEqualToString:@"FUNCTION"]) ? @"3" : @"2"; - NSString *dtd = [self stringWithUTF8CString:row[5]]; - NSString *det = [self stringWithUTF8CString:row[11]]; - NSString *dataaccess = [self stringWithUTF8CString:row[12]]; - NSString *security_type = [self stringWithUTF8CString:row[14]]; - NSString *definer = [self stringWithUTF8CString:row[19]]; - - // Generate "table" and "field" names and add to structure key store - NSString *table_id = [NSString stringWithFormat:@"%@%@%@", db_id, SPUniqueSchemaDelimiter, fname]; - NSString *field_id = [NSString stringWithFormat:@"%@%@%@", table_id, SPUniqueSchemaDelimiter, fname]; - [queriedStructureKeys addObject:table_id]; - [queriedStructureKeys addObject:field_id]; - - // Ensure that a dictionary exists for this "table" name - if(![[queriedStructure valueForKey:db_id] valueForKey:table_id]) - [[queriedStructure valueForKey:db_id] setObject:[NSMutableDictionary dictionary] forKey:table_id]; - - // Add the "field" details - [[[queriedStructure valueForKey:db_id] valueForKey:table_id] setObject: - [NSArray arrayWithObjects:dtd, dataaccess, det, security_type, definer, [NSNumber numberWithUnsignedLongLong:uniqueCounter], nil] forKey:field_id]; - [[[queriedStructure valueForKey:db_id] valueForKey:table_id] setObject:type forKey:@" struct_type "]; - uniqueCounter++; - } - mysql_free_result(theResult); - } else { - NSLog(@"Error while querying the database structure for procedures and functions. Could not set encoding to utf8"); - } - } - } - - // Update the global variables and make sure that no request reads these global variables - // while updating - [self performSelectorOnMainThread:@selector(lockQuerying) withObject:nil waitUntilDone:YES]; - [self performSelectorOnMainThread:@selector(updateGlobalVariablesWith:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:queriedStructure, @"structure", queriedStructureKeys, @"keys", nil] waitUntilDone:YES]; - [self performSelectorOnMainThread:@selector(unlockQuerying) withObject:nil waitUntilDone:YES]; - - - mysql_close(structConnection); - - // Notify that the structure querying has been performed - [[NSNotificationCenter defaultCenter] postNotificationName:@"SPDBStructureWasUpdated" object:delegate]; - - [self performSelectorOnMainThread:@selector(decrementQueryingDbStructure) withObject:nil waitUntilDone:YES]; - } - } - - [queryPool release]; -} - -/* - * Update global variables on main thread to avoid accessing from different threads - */ -- (void)updateGlobalVariablesWith:(NSDictionary*)object -{ - NSString *connectionID = [[self delegate] connectionID]; - - // Return if the delegate indicates disconnection - if([connectionID length] < 2) return; - - if(![structure valueForKey:connectionID]) - [structure setObject:[NSMutableDictionary dictionary] forKey:connectionID]; - [structure setObject:[object objectForKey:@"structure"] forKey:connectionID]; - [allKeysofDbStructure setArray:[object objectForKey:@"keys"]]; - usleep(100); -} - -- (void)incrementQueryingDbStructure -{ - isQueryingDbStructure++; -} - -- (void)decrementQueryingDbStructure -{ - isQueryingDbStructure--; - if(isQueryingDbStructure < 0) isQueryingDbStructure = 0; -} - -- (BOOL)isQueryingDatabaseStructure -{ - return (isQueryingDbStructure > 0) ? YES : NO; -} - -- (void)lockQuerying -{ - lockQuerying = YES; -} - -- (void)unlockQuerying -{ - lockQuerying = NO; - usleep(50000); -} -/** - * Returns a dict containing the structure of all available databases - */ -- (NSDictionary *)getDbStructure -{ - if(lockQuerying) return nil; - NSDictionary *d = [NSDictionary dictionaryWithDictionary:structure]; - return d; -} - -/** - * Returns all keys of the db structure - */ -- (NSArray *)getAllKeysOfDbStructure -{ - if(lockQuerying) return nil; - NSArray *r = [NSArray arrayWithArray:allKeysofDbStructure]; - return r; -} - -#pragma mark - -#pragma mark Server information - -/** - * Returns a string giving the client library version. - */ -- (NSString *)clientInfo -{ - return [self stringWithCString:mysql_get_client_info()]; -} - -/** - * Returns a string giving information on the host of the DB server. - */ -- (NSString *)hostInfo -{ - return [self stringWithCString:mysql_get_host_info(mConnection)]; -} - -/** - * Returns a string giving the server version. - */ -- (NSString *)serverInfo -{ - if (mConnected) { - return [self stringWithCString: mysql_get_server_info(mConnection)]; - } - - return @""; -} - -/** - * Returns the number of the protocole used to transfer info from server to client - */ -- (NSNumber *)protoInfo -{ - return [MCPNumber numberWithUnsignedInteger:mysql_get_proto_info(mConnection)]; -} - -/** - * Lists active process - */ -- (MCPResult *)listProcesses -{ - MCPResult *result = nil; - MYSQL_RES *theResPtr; - - [self lockConnection]; - - if (mConnected && (mConnection != NULL)) { - if ((theResPtr = mysql_list_processes(mConnection))) { - result = [[MCPResult alloc] initWithResPtr:theResPtr encoding:stringEncoding timeZone:mTimeZone]; - } - else { - result = [[MCPResult alloc] init]; - } - } - - [self unlockConnection]; - - if (result) [result autorelease]; - - return result; -} - -/** - * Kills the process with the given pid. - * The users needs the !{Process_priv} privilege. - */ -- (BOOL)killProcess:(unsigned long)pid -{ - NSInteger theErrorCode = mysql_kill(mConnection, pid); - - return (theErrorCode) ? NO : YES; -} - -/* - * Check some common locations for the presence of a MySQL socket file, returning - * it if successful. - */ -- (NSString *)findSocketPath -{ - NSFileManager *fileManager = [NSFileManager defaultManager]; - - NSArray *possibleSocketLocations = [NSArray arrayWithObjects: - @"/tmp/mysql.sock", // Default - @"/Applications/MAMP/tmp/mysql/mysql.sock", // MAMP default location - @"/Applications/xampp/xamppfiles/var/mysql/mysql.sock", // XAMPP default location - @"/var/mysql/mysql.sock", // Mac OS X Server default - @"/opt/local/var/run/mysqld/mysqld.sock", // Darwinports MySQL - @"/opt/local/var/run/mysql4/mysqld.sock", // Darwinports MySQL 4 - @"/opt/local/var/run/mysql5/mysqld.sock", // Darwinports MySQL 5 - @"/usr/local/zend/mysql/tmp/mysql.sock", // Zend Server CE (see Issue #1251) - @"/var/run/mysqld/mysqld.sock", // As used on Debian/Gentoo - @"/var/tmp/mysql.sock", // As used on FreeBSD - @"/var/lib/mysql/mysql.sock", // As used by Fedora - @"/opt/local/lib/mysql/mysql.sock", // Alternate fedora - nil]; - - for (NSUInteger i = 0; i < [possibleSocketLocations count]; i++) - { - if ([fileManager fileExistsAtPath:[possibleSocketLocations objectAtIndex:i]]) - return [possibleSocketLocations objectAtIndex:i]; - } - - return nil; -} - -#pragma mark - -#pragma mark Encoding - -/** - * Sets the encoding for the database connection. - * This sends a "SET NAMES" command to the server, as appropriate, and - * also updates the class to decode the returned strings correctly. - * If an encoding name unsupported by MySQL is encountered, a FALSE - * status will be returned, and errors will be updated. - * If an encoding name not supported by this class is encountered, a - * warning will be logged to console but the MySQL connection will still - * be updated. - * This resets any setting to use Latin1 transport for the connection. - */ -- (BOOL)setEncoding:(NSString *)theEncoding -{ - if ([theEncoding isEqualToString:encoding] && !encodingUsesLatin1Transport) return YES; - - // MySQL < 4.1 will fail - if ([self serverMajorVersion] < 4 - || ([self serverMinorVersion] == 4 && [self serverMinorVersion] < 1)) - { - return NO; - } - - // Attempt to set the encoding of the connection, restoring the connection on failure - [self queryString:[NSString stringWithFormat:@"SET NAMES %@", [theEncoding tickQuotedString]]]; - if ([self queryErrored]) { - [self queryString:[NSString stringWithFormat:@"SET NAMES %@", [encoding tickQuotedString]]]; - if (encodingUsesLatin1Transport) [self queryString:@"SET CHARACTER_SET_RESULTS=latin1"]; - return NO; - } - - // The connection set was successful - update stored details - [encoding release]; - encoding = [[NSString alloc] initWithString:theEncoding]; - stringEncoding = [MCPConnection encodingForMySQLEncoding:[encoding UTF8String]]; - encodingUsesLatin1Transport = NO; - return YES; -} - -/** - * Returns the currently active encoding. - */ -- (NSString *)encoding -{ - return [NSString stringWithString:encoding]; -} - -/** - * Gets the string encoding for the connection - */ -- (NSStringEncoding)stringEncoding -{ - return stringEncoding; -} - -/** - * Sets whether the connection encoding should be transmitted via Latin1. - * This is a method purely for backwards compatibility: old codebases or - * applications often believed they stored UTF8 data in UTF8 tables, but - * for the purposes of storing and reading the data, the MySQL connecttion - * was never changed from the default Latin1. UTF8 data was therefore - * altered during transit and stored as UTF8 encoding Latin1 pairs which - * together make up extended UTF8 characters. Reading these characters back - * over Latin1 makes the data editable in a compatible fashion. - */ -- (BOOL)setEncodingUsesLatin1Transport:(BOOL)useLatin1 -{ - if (encodingUsesLatin1Transport == useLatin1) return YES; - - // If disabling Latin1 transport, restore the connection encoding - if (!useLatin1) return [self setEncoding:encoding]; - - // Otherwise attempt to set Latin1 transport - [self queryString:@"SET CHARACTER_SET_RESULTS=latin1"]; - if ([self queryErrored]) return NO; - [self queryString:@"SET CHARACTER_SET_CLIENT=latin1"]; - if ([self queryErrored]) { - [self setEncoding:encoding]; - return NO; - } - encodingUsesLatin1Transport = YES; - return YES; -} - -/** - * Return whether the current connection is set to use Latin1 tranport. - */ -- (BOOL)encodingUsesLatin1Transport -{ - return encodingUsesLatin1Transport; -} - -/** - * Store a previous encoding setting. This allows easy restoration - * later - useful if certain tasks require the encoding to be - * temporarily changed. - */ -- (void)storeEncodingForRestoration -{ - if (previousEncoding) [previousEncoding release]; - previousEncoding = [[NSString alloc] initWithString:encoding]; - previousEncodingUsesLatin1Transport = encodingUsesLatin1Transport; -} - -/** - * Restore a previously stored encoding setting, if one is stored. - * Useful if certain tasks required the encoding to be temporarily changed. - */ -- (void)restoreStoredEncoding -{ - if (!previousEncoding || !mConnected) return; - - [self setEncoding:previousEncoding]; - [self setEncodingUsesLatin1Transport:previousEncodingUsesLatin1Transport]; -} - -#pragma mark - -#pragma mark Time Zone - -/** - * Setting the time zone to be used with the server. - */ -- (void)setTimeZone:(NSTimeZone *)iTimeZone -{ - if (iTimeZone != mTimeZone) { - [mTimeZone release]; - mTimeZone = [iTimeZone retain]; - } - - if ([self checkConnection]) { - if (mTimeZone) { - [self queryString:[NSString stringWithFormat:@"SET time_zone = '%@'", [mTimeZone name]]]; - } - else { - [self queryString:@"SET time_zone = 'SYSTEM'"]; - } - } -} - -/** - * Getting the currently used time zone (in communication with the DB server). - */ -- (NSTimeZone *)timeZone -{ - if ([self checkConnection]) { - MCPResult *theSessionTZ = [self queryString:@"SHOW VARIABLES LIKE '%time_zone'"]; - NSArray *theRow; - id theTZName; - NSTimeZone *theTZ; - - [theSessionTZ setReturnDataAsStrings:YES]; - [theSessionTZ dataSeek:1ULL]; - theRow = [theSessionTZ fetchRowAsArray]; - theTZName = [theRow objectAtIndex:1]; - - if ([theTZName isEqualToString:@"SYSTEM"]) { - [theSessionTZ dataSeek:0ULL]; - theRow = [theSessionTZ fetchRowAsArray]; - theTZName = [theRow objectAtIndex:1]; - } - - if (theTZName) { // Old versions of the server does not support there own time zone ? - theTZ = [NSTimeZone timeZoneWithName:theTZName]; - if (!theTZ) theTZ = [NSTimeZone timeZoneWithAbbreviation:theTZName]; - if (!theTZ) theTZ = [NSTimeZone defaultTimeZone]; - } else { - // By default set the time zone to the local one.. - // Try to get the name using the previously available variable: - theSessionTZ = [self queryString:@"SHOW VARIABLES LIKE 'timezone'"]; - [theSessionTZ setReturnDataAsStrings:YES]; - [theSessionTZ dataSeek:0ULL]; - theRow = [theSessionTZ fetchRowAsArray]; - theTZName = [theRow objectAtIndex:1]; - if (theTZName) { - // Finally we found one ... - theTZ = [NSTimeZone timeZoneWithName:theTZName]; - if (!theTZ) theTZ = [NSTimeZone timeZoneWithAbbreviation:theTZName]; - if (!theTZ) theTZ = [NSTimeZone defaultTimeZone]; - } else { - theTZ = [NSTimeZone defaultTimeZone]; - //theTZ = [NSTimeZone systemTimeZone]; - NSLog(@"The time zone is not defined on the server, set it to the default one : %@", theTZ); - } - } - - if (theTZ != mTimeZone) { - [mTimeZone release]; - mTimeZone = [theTZ retain]; - } - } - - return mTimeZone; -} - -#pragma mark - -#pragma mark Packet size - -/** - * Retrieve the max_allowed_packet size from the server; returns - * false if the query fails. - */ -- (BOOL)fetchMaxAllowedPacket -{ - char *queryString; - - if ([self serverMajorVersion] == 3) queryString = "SHOW VARIABLES LIKE 'max_allowed_packet'"; - else queryString = "SELECT @@global.max_allowed_packet"; - - [self lockConnection]; - if (0 == mysql_query(mConnection, queryString)) { - if (mysql_field_count(mConnection) != 0) { - MCPResult *r = [[MCPResult alloc] initWithMySQLPtr:mConnection encoding:stringEncoding timeZone:mTimeZone]; - [r setReturnDataAsStrings:YES]; - NSArray *a = [r fetchRowAsArray]; - [r autorelease]; - if([a count]) { - [self unlockConnection]; - maxAllowedPacketSize = [[a objectAtIndex:([self serverMajorVersion] == 3)?1:0] integerValue]; - return true; - } - } - } - [self unlockConnection]; - - return false; -} - -/** - * Retrieves max_allowed_packet size set as global variable. - * It returns NSNotFound if it fails. - */ -- (NSUInteger)getMaxAllowedPacket -{ - MCPResult *r; - r = [self queryString:@"SELECT @@global.max_allowed_packet" usingEncoding:stringEncoding streamingResult:NO]; - if (![[self getLastErrorMessage] isEqualToString:@""]) { - if ([self isConnected]) { - NSString *errorMessage = [NSString stringWithFormat:@"An error occured while retrieving max_allowed_packet size:\n\n%@", [self getLastErrorMessage]]; - if ([delegate respondsToSelector:@selector(showErrorWithTitle:message:)]) - [delegate showErrorWithTitle:NSLocalizedString(@"Error", @"error") message:errorMessage]; - else - NSRunAlertPanel(@"Error", errorMessage, @"OK", nil, nil); - } - return NSNotFound; - } - NSArray *a = [r fetchRowAsArray]; - if([a count]) - return [[a objectAtIndex:0] integerValue]; - - return NSNotFound; -} - -/* - * It sets max_allowed_packet size to newSize and it returns - * max_allowed_packet after setting it to newSize for cross-checking - * if the maximal size was reached (e.g. set it to 4GB it'll return 1GB up to now). - * If something failed it return -1; - */ -- (NSUInteger)setMaxAllowedPacketTo:(NSUInteger)newSize resetSize:(BOOL)reset -{ - if(![self isMaxAllowedPacketEditable] || newSize < 1024) return maxAllowedPacketSize; - - [self lockConnection]; - mysql_query(mConnection, [[NSString stringWithFormat:@"SET GLOBAL max_allowed_packet = %lu", newSize] UTF8String]); - [self unlockConnection]; - - // Inform the user via a log entry about that change according to reset value - if(delegate && [delegate respondsToSelector:@selector(queryGaveError:connection:)]) { - if(reset) - [delegate queryGaveError:[NSString stringWithFormat:@"max_allowed_packet was reset to %lu for new session", newSize] connection:self]; - else - [delegate queryGaveError:[NSString stringWithFormat:@"Query too large; max_allowed_packet temporarily set to %lu for the current session to allow query to succeed", newSize] connection:self]; - } - - return maxAllowedPacketSize; -} - -/** - * It returns whether max_allowed_packet is setable for the user. - */ -- (BOOL)isMaxAllowedPacketEditable -{ - BOOL isEditable; - - [self lockConnection]; - isEditable = !mysql_query(mConnection, "SET GLOBAL max_allowed_packet = @@global.max_allowed_packet"); - [self unlockConnection]; - - return isEditable; -} - -#pragma mark - -#pragma mark Data conversion - -/** - * For internal use only. Transforms a NSString to a C type string (ending with \0) using the character set from the MCPConnection. - * Lossy conversions are enabled. - */ -- (const char *)cStringFromString:(NSString *)theString -{ - NSMutableData *theData; - - if (! theString) { - return (const char *)NULL; - } - - theData = [NSMutableData dataWithData:[theString dataUsingEncoding:stringEncoding allowLossyConversion:YES]]; - [theData increaseLengthBy:1]; - - return (const char *)[theData bytes]; -} - -/** - * Modified version of the original to support a supplied encoding. - * For internal use only. Transforms a NSString to a C type string (ending with \0). - * Lossy conversions are enabled. - */ -- (const char *)cStringFromString:(NSString *)theString usingEncoding:(NSStringEncoding)aStringEncoding -{ - NSMutableData *theData; - - if (! theString) { - return (const char *)NULL; - } - - theData = [NSMutableData dataWithData:[theString dataUsingEncoding:aStringEncoding allowLossyConversion:YES]]; - [theData increaseLengthBy:1]; - - return (const char *)[theData bytes]; -} - -/** - * Returns a NSString from a C style string encoded with the character set of theMCPConnection. - */ -- (NSString *)stringWithCString:(const char *)theCString -{ - NSData *theData; - NSString *theString; - - if (theCString == NULL) return @""; - - theData = [NSData dataWithBytes:theCString length:(strlen(theCString))]; - theString = [[NSString alloc] initWithData:theData encoding:stringEncoding]; - - if (theString) { - [theString autorelease]; - } - - return theString; -} - -/** - * Returns a NSString from a C style string. - */ -- (NSString *)stringWithCString:(const char *)theCString usingEncoding:(NSStringEncoding)aStringEncoding -{ - NSData *theData; - NSString *theString; - - if (theCString == NULL) return @""; - - theData = [NSData dataWithBytes:theCString length:(strlen(theCString))]; - theString = [[NSString alloc] initWithData:theData encoding:aStringEncoding]; - - if (theString) { - [theString autorelease]; - } - - return theString; -} - -/** - * Returns a NSString from a C style string encoded with the character set of theMCPConnection. - */ -- (NSString *)stringWithUTF8CString:(const char *)theCString -{ - NSData *theData; - NSString *theString; - - if (theCString == NULL) return @""; - - theData = [NSData dataWithBytes:theCString length:(strlen(theCString))]; - theString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding]; - - if (theString) { - [theString autorelease]; - } - - return theString; -} - -/** - * Use the string encoding to convert the returned NSData to a string (for a Text field). - */ -- (NSString *)stringWithText:(NSData *)theTextData -{ - NSString *theString; - - if (theTextData == nil) return nil; - - theString = [[NSString alloc] initWithData:theTextData encoding:stringEncoding]; - - if (theString) { - [theString autorelease]; - } - - return theString; -} - -#pragma mark - - -/** - * Object deallocation. - */ -- (void) dealloc -{ - delegate = nil; - - // Ensure the query lock is unlocked, thereafter setting to nil in case of pending calls - if ([connectionLock condition] != MCPConnectionIdle) [self unlockConnection]; - [connectionLock release], connectionLock = nil; - - // Clean up connections if necessary - if (mConnected) [self disconnect]; - if (connectionProxy) { - [connectionProxy setConnectionStateChangeSelector:NULL delegate:nil]; - [connectionProxy disconnect]; - } - - [encoding release]; - if (previousEncoding) [previousEncoding release]; - [keepAliveTimer invalidate]; - [keepAliveTimer release]; - [NSObject cancelPreviousPerformRequestsWithTarget:self]; - if (lastQueryErrorMessage) [lastQueryErrorMessage release]; - if (connectionHost) [connectionHost release]; - if (connectionLogin) [connectionLogin release]; - if (connectionSocket) [connectionSocket release]; - if (connectionPassword) [connectionPassword release]; - if (sslKeyFilePath) [sslKeyFilePath release]; - if (sslCertificatePath) [sslCertificatePath release]; - if (sslCACertificatePath) [sslCACertificatePath release]; - if (serverVersionString) [serverVersionString release], serverVersionString = nil; - if (structure) [structure release], structure = nil; - if (allKeysofDbStructure) [allKeysofDbStructure release], allKeysofDbStructure = nil; - - [super dealloc]; -} - -@end - -@implementation MCPConnection (PrivateAPI) - -/** - * Retrieve connection variables and use them to update local variables - incuding - * server version string, server time zone, and the current connection encoding. - */ -- (void)_updateConnectionVariables -{ - if (!mConnected) return; - - // Retrieve all the variables from the server - MCPResult *theResult = [self queryString:@"SHOW VARIABLES"]; - [theResult setReturnDataAsStrings:YES]; - if (![theResult numOfRows]) return; - - // Step through the rows, converting into an NSDictionary - NSMutableDictionary *variables = [NSMutableDictionary new]; - NSArray *variableRow = nil; - while ((variableRow = [theResult fetchRowAsArray])) { - [variables setObject:[variableRow objectAtIndex:1] forKey:[variableRow objectAtIndex:0]]; - } - - // Get the version string - if (serverVersionString) [serverVersionString release], serverVersionString = nil; - if ([variables objectForKey:@"version"]) { - serverVersionString = [[NSString alloc] initWithString:[variables objectForKey:@"version"]]; - } - - // Get the timezone - NSString *serverTimeZoneName = nil; - NSTimeZone *serverTimeZone = nil; - if ([variables objectForKey:@"time_zone"] && ![[variables objectForKey:@"time_zone"] isNSNull]) { - if ([[variables objectForKey:@"time_zone"] isEqualToString:@"SYSTEM"]) { - if ([variables objectForKey:@"system_time_zone"]) { - serverTimeZoneName = [variables objectForKey:@"system_time_zone"]; - } - } else { - serverTimeZoneName = [variables objectForKey:@"time_zone"]; - } - } else if ([variables objectForKey:@"timezone"] && ![[variables objectForKey:@"timezone"] isNSNull]) { - serverTimeZoneName = [variables objectForKey:@"timezone"]; - } - if (!serverTimeZoneName) { - serverTimeZone = [NSTimeZone defaultTimeZone]; - NSLog(@"The time zone was not defined on the server, fallen back to default time zone: %@", serverTimeZone); - } else { - serverTimeZone = [NSTimeZone timeZoneWithName:serverTimeZoneName]; - if (!serverTimeZone) - serverTimeZone = [NSTimeZone timeZoneWithAbbreviation:serverTimeZoneName]; - if (!serverTimeZone) { - serverTimeZone = [NSTimeZone defaultTimeZone]; - NSLog(@"The time zone defined on the server (%@) was not recognised, fallen back to default time zone: %@", serverTimeZoneName, serverTimeZone); - } - } - - if (mTimeZone) [mTimeZone release], mTimeZone = nil; - mTimeZone = [serverTimeZone retain]; - - // Get the connection encoding - NSString *serverEncoding = @"latin1"; - if ([variables objectForKey:@"character_set_results"]) { - serverEncoding = [variables objectForKey:@"character_set_results"]; - } else if ([variables objectForKey:@"character_set"]) { - serverEncoding = [variables objectForKey:@"character_set"]; - } - if (encoding) [encoding release]; - encoding = [[NSString alloc] initWithString:serverEncoding]; - stringEncoding = [MCPConnection encodingForMySQLEncoding:[self cStringFromString:encoding]]; - encodingUsesLatin1Transport = NO; - - // Check the interactive timeout - if it's below five minutes, increase it to ten to imprive timeout/keepalive behaviour - if ([variables objectForKey:@"interactive_timeout"]) { - if ([[variables objectForKey:@"interactive_timeout"] integerValue] < 300) { - [self queryString:@"SET interactive_timeout=600"]; - } - } - - [variables release]; -} - -/** - * Determine whether the current host is reachable; essentially - * whether a connection is available (no packets should be sent) - */ -- (BOOL)_isCurrentHostReachable -{ - BOOL hostReachable; - SCNetworkConnectionFlags reachabilityStatus; - hostReachable = SCNetworkCheckReachabilityByName("dev.mysql.com", &reachabilityStatus); - - // If the function returned failure, also return failure. - if (!hostReachable) return NO; - - // Ensure that the network is reachable - if (!(reachabilityStatus & kSCNetworkFlagsReachable)) return NO; - - // Ensure that Airport is up/connected if present - if (reachabilityStatus & kSCNetworkFlagsConnectionRequired) return NO; - - // Return success - return YES; -} - -/** - * Set up the keepalive timer; this should be called on the main - * thread, to ensure the timer isn't descheduled when child threads - * terminate. - */ -- (void)_setupKeepalivePingTimer -{ - keepAliveTimer = [[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(keepAlive:) userInfo:nil repeats:YES] retain]; -} -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnectionDelegate.h b/Frameworks/MCPKit/MCPFoundationKit/MCPConnectionDelegate.h deleted file mode 100644 index 0e162875..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnectionDelegate.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// $Id$ -// -// MCPConnectionDelegate.h -// MCPKit -// -// Created by Stuart Connolly (stuconnolly.com) on October 20, 2010. -// Copyright (c) 2010 Stuart Connolly. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -@protocol MCPConnectionDelegate <NSObject> - -/** - * - * @param query - * @param connection - */ -- (void)willQueryString:(NSString *)query connection:(id)connection; - -/** - * - * @param error - * @param connection - */ -- (void)queryGaveError:(NSString *)error connection:(id)connection; - -/** - * - * - * @param error - * @param message - */ -- (void)showErrorWithTitle:(NSString *)error message:(NSString *)message; - -/** - * - * - * @param connection - */ -- (NSString *)keychainPasswordForConnection:(id)connection; - -/** - * - * - * @param connection - */ -- (NSString *)onReconnectShouldSelectDatabase:(id)connection; - -/** - * - * - * @param connection - */ -- (void)noConnectionAvailable:(id)connection; - -/** - * - * - * @param connection - */ -- (MCPConnectionCheck)connectionLost:(id)connection; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConnectionProxy.h b/Frameworks/MCPKit/MCPFoundationKit/MCPConnectionProxy.h deleted file mode 100644 index f4edbfd8..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConnectionProxy.h +++ /dev/null @@ -1,70 +0,0 @@ -// -// $Id$ -// -// MCPConnectionProxy.h -// MCPKit -// -// Created by Stuart Connolly (stuconnolly.com) on July 2, 2009. -// Copyright (c) 2009 Stuart Connolly. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -/** - * Connection proxy state constants. - */ -enum PROXY_TUNNEL_STATES -{ - PROXY_STATE_IDLE = 0, - PROXY_STATE_CONNECTING = 1, - PROXY_STATE_WAITING_FOR_AUTH = 2, - PROXY_STATE_CONNECTED = 3, - PROXY_STATE_FORWARDING_FAILED = 4 -}; - -@protocol MCPConnectionProxy <NSObject> - -/** - * Connect the proxy. - */ -- (void)connect; - -/** - * Disconnect the proxy. - */ -- (void)disconnect; - -/** - * Get the current state of the proxy. - */ -- (NSInteger)state; - -/** - * Get the local port being used by the proxy. - */ -- (NSUInteger)localPort; - -/** - * Sets the method the proxy should call whenever the state of the connection changes. - */ -- (BOOL)setConnectionStateChangeSelector:(SEL)theStateChangeSelector delegate:(id)theDelegate; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPConstants.h b/Frameworks/MCPKit/MCPFoundationKit/MCPConstants.h deleted file mode 100644 index fba7d651..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPConstants.h +++ /dev/null @@ -1,82 +0,0 @@ -// -// $Id$ -// -// MCPConstants.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 03/06/2001. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -// Result type constants -enum { - MCPTypeArray = 1, - MCPTypeDictionary = 2, - MCPTypeFlippedArray = 3, - MCPTypeFlippedDictionary = 4 -}; -typedef NSUInteger MCPReturnType; - -// Connection check constants -enum { - MCPConnectionCheckRetry = 0, - MCPConnectionCheckReconnect = 1, - MCPConnectionCheckDisconnect = 2 -}; -typedef NSUInteger MCPConnectionCheck; - -// Streaming result set constants -enum -{ - MCPStreamingNone = 0, - MCPStreamingFast = 1, - MCPStreamingLowMem = 2 -}; -typedef NSUInteger MCPQueryStreamingType; - -// Connection state -// This is used internally by MCPConnection to prevent simultaneous execution of different queries -enum { - MCPConnectionIdle = 0, - MCPConnectionBusy = 1 -}; - -// Charcater set mapping constants -typedef struct _OUR_CHARSET -{ - NSUInteger nr; - const char *name; - const char *collation; - NSUInteger char_minlen; - NSUInteger char_maxlen; -} OUR_CHARSET; - -// Deafult connection option -extern const NSUInteger kMCPConnectionDefaultOption; - -// Default socket (from the mysql.h used at compile time) -extern const char *kMCPConnectionDefaultSocket; - -// Added to MySQL error code -extern const NSUInteger kMCPConnectionNotInited; - -// The length of the truncation if required -extern const NSUInteger kLengthOfTruncationForLog; diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPFastQueries.h b/Frameworks/MCPKit/MCPFoundationKit/MCPFastQueries.h deleted file mode 100644 index e9ced5a0..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPFastQueries.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// $Id$ -// -// MCPFastQueries.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 03/06/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -#import "MCPConnection.h" - -@interface MCPConnection (MCPFastQueries) - -// For insert queries, get directly the Id of the newly inserted row. -- (my_ulonglong)insertQuery:(NSString *)query; -- (my_ulonglong)updateQuery:(NSString *)query; - -// Returns directly a proper NS object, or a collection (NSArray, NSDictionary...). -- (id)getFirstFieldFromQuery:(NSString *)query; -- (id)getFirstRowFromQuery:(NSString *)query asType:(MCPReturnType)type; -- (id)getAllRowsFromQuery:(NSString *)query asType:(MCPReturnType)type; -- (NSArray *)getQuery:(NSString *)query colWithIndex:(NSUInteger)col; -- (NSArray *)getQuery:(NSString *)query colWithName:(NSString *)colName; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPFastQueries.m b/Frameworks/MCPKit/MCPFoundationKit/MCPFastQueries.m deleted file mode 100644 index c5f4d361..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPFastQueries.m +++ /dev/null @@ -1,113 +0,0 @@ -// -// $Id$ -// -// MCPFastQueries.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 03/06/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPFastQueries.h" -#import "MCPResultPlus.h" - -/** - * This actegory is made up to keep the extra methods out or the core of the framework. - * - * Basicly this is the place to add methods which are useful, but are just wrappers to the methods of the - * core (MCPConnection, MCPResult). The purpous being to have a single line call available for current tasks - * which otherwise would need a couple of lines and object defined. - */ -@implementation MCPConnection (MCPFastQueries) - -/** - * Send the query aQuery to the server and retrieve the row id if the table have a autoincrement column. - * Returns 0 if nothing have been inserted. - */ -- (my_ulonglong)insertQuery:(NSString *)query -{ - [self queryString:query]; - - return [self insertId]; -} - -/** - * Send the query aQuery to the server and retrieve the number of affected rows (should work with !{update}, - * !{delete}, !{insert} and !{select} type of queries). - * - * NB: This can also be used with a !{select} query if you are only interested in the number of row complying - * with the query; you'll get no chance to get the result from the query, except by sending the query - * again (with !{queryString:}) - */ -- (my_ulonglong)updateQuery:(NSString *)query -{ - [self queryString:query]; - - return [self affectedRows]; -} - -/** - * Get the first field of the first row of the result from the query (aQuery). Should return nil if no object - * at all are selected. - */ -- (id)getFirstFieldFromQuery:(NSString *)query -{ - return [[[self queryString:query] fetchRowAsType:MCPTypeArray] objectAtIndex:0]; -} - -/** - * Get the firdst row of the result from the query aQuery, in a collection of type determined by aType - * (MCPTypeArray or MCPTypeDictionary) - */ -- (id) getFirstRowFromQuery:(NSString *)query asType:(MCPReturnType)type -{ - return [[self queryString:query] fetchRowAsType:type]; -} - -/** - * Get a bidimensional table of the whole rows of the result from the query aQuery. The type of the result is - * choosen by aType, it can be (MCPTypeArray, MCPTypeDictionary, MCPTypeFlippedArray & MCPTypeFlippedDictionary). - * Description of the types can be found in method !{fetch2DResultAsType:}. - */ -- (id)getAllRowsFromQuery:(NSString *)query asType:(MCPReturnType)type - -{ - return [[self queryString:query] fetch2DResultAsType:type]; -} - -/** - * Get a column (as an NSArray) of the result from the query aQuery. The column is choosen from it's index, - * starting from 0. - */ -- (NSArray *)getQuery:(NSString *)query colWithIndex:(NSUInteger)col -{ - return [[self queryString:query] fetchColAtIndex:col]; -} - -/** - * Get a column (as an NSArray) of the result from the query aQuery. The column is choosen from it's name. - */ -- (NSArray *)getQuery:(NSString *)query colWithName:(NSString *)colName -{ - return [[self queryString:query] fetchColWithName:colName]; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h deleted file mode 100644 index 9af3fcfe..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// $Id$ -// -// MCPGeometryData.h -// sequel-pro -// -// Created by Hans-Jörg Bibiko on October 07, 2010 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Cocoa/Cocoa.h> -#import <Foundation/Foundation.h> - -enum wkbType -{ - wkb_point = 1, - wkb_linestring = 2, - wkb_polygon = 3, - wkb_multipoint = 4, - wkb_multilinestring = 5, - wkb_multipolygon = 6, - wkb_geometrycollection = 7 -}; - -typedef struct st_point_2d_ -{ - double x; - double y; -} st_point_2d; - -@interface MCPGeometryData : NSObject -{ - // Holds the WKB bytes coming from SQL server - Byte *geoBuffer; - - // Holds the buffer length - NSUInteger bufferLength; - -} - -- (id)initWithBytes:(const void *)geoData length:(NSUInteger)length; -+ (id)dataWithBytes:(const void *)geoData length:(NSUInteger)length; -- (NSString*)description; -- (NSUInteger)length; -- (NSData*)data; -- (NSString*)wktString; -- (NSDictionary*)coordinates; -- (NSInteger)wkbType; -- (NSString*)wktType; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m b/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m deleted file mode 100644 index b7a3fd09..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPGeometryData.m +++ /dev/null @@ -1,785 +0,0 @@ -// -// $Id$ -// -// MCPGeometryData.m -// sequel-pro -// -// Created by Hans-Jörg Bibiko on October 07, 2010 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPGeometryData.h" - -#define SIZEOF_STORED_UINT32 4 -#define SIZEOF_STORED_DOUBLE 8 -#define POINT_DATA_SIZE (SIZEOF_STORED_DOUBLE*2) -#define WKB_HEADER_SIZE (1+SIZEOF_STORED_UINT32) -#define BUFFER_START 0 - -@implementation MCPGeometryData - -/** - * Initialize the MCPGeometryData object - */ -- (id)init -{ - if ((self = [super init])) { - geoBuffer = nil; - bufferLength = 0; - } - return self; -} - -/** - * Initialize the MCPGeometryData object with the WKB data - */ -- (id)initWithBytes:(const void *)geoData length:(NSUInteger)length -{ - if ((self = [self init])) { - bufferLength = length; - geoBuffer = malloc(bufferLength); - memcpy(geoBuffer, geoData, bufferLength); - } - return self; -} - -/** - * Return an autorelease MCPGeometryData object - */ -+ (id)dataWithBytes:(const void *)geoData length:(NSUInteger)length -{ - return [[[MCPGeometryData alloc] initWithBytes:geoData length:length] autorelease]; -} - -/** - * copyWithZone - */ -- (id)copyWithZone:(NSZone *)zone -{ - return [self retain]; -} - -/** - * Return the hex representation of the WKB buffer (only for convenience) - */ -- (NSString*)description -{ - return [[NSData dataWithBytes:geoBuffer length:bufferLength] description]; -} - -/** - * Return the length of the WKB buffer - */ -- (NSUInteger)length -{ - return bufferLength; -} - -/** - * Return NSData pointer of the WKB buffer - */ -- (NSData*)data -{ - return [NSData dataWithBytes:geoBuffer length:bufferLength]; -} - -/** - * Return a human readable WKT string of the internal format (it imitate the SQL function AsText()). - */ -- (NSString*)wktString -{ - char byteOrder; - uint32_t geoType, numberOfItems, numberOfSubItems, numberOfSubSubItems, numberOfCollectionItems; - int32_t srid; - st_point_2d aPoint; - - uint32_t i, j, k, n; // Loop counter for numberOf...Items - uint32_t ptr = BUFFER_START; // pointer to geoBuffer while parsing - - NSMutableString *wkt = [NSMutableString string]; - - if (bufferLength < WKB_HEADER_SIZE) - return @""; - - memcpy(&srid, &geoBuffer[0], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - - byteOrder = geoBuffer[ptr]; - - if(byteOrder != 0x1) - return @"Byte order not yet supported"; - - ptr++; - geoType = geoBuffer[ptr]; - ptr += SIZEOF_STORED_UINT32; - - switch(geoType) { - - case wkb_point: - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - return [NSString stringWithFormat:@"POINT(%.16g %.16g)%@", aPoint.x, aPoint.y, (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - break; - - case wkb_linestring: - [wkt setString:@"LINESTRING("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - return wkt; - break; - - case wkb_polygon: - [wkt setString:@"POLYGON("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; - } - [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - return wkt; - break; - - case wkb_multipoint: - [wkt setString:@"MULTIPOINT("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; - } - [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - return wkt; - break; - - case wkb_multilinestring: - [wkt setString:@"MULTILINESTRING("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - ptr += WKB_HEADER_SIZE; - [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; - } - [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - return wkt; - break; - - case wkb_multipolygon: - [wkt setString:@"MULTIPOLYGON("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(k=0; k < numberOfSubSubItems; k++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (k < numberOfSubSubItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - [wkt appendFormat:@")%@", (j < numberOfSubItems-1) ? @"," : @""]; - } - ptr += WKB_HEADER_SIZE; - [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; - } - [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - return wkt; - break; - - case wkb_geometrycollection: - [wkt setString:@"GEOMETRYCOLLECTION("]; - numberOfCollectionItems = geoBuffer[ptr]; - ptr += SIZEOF_STORED_UINT32; - - for(n=0; n < numberOfCollectionItems; n++) { - - byteOrder = geoBuffer[ptr]; - - if(byteOrder != 0x1) - return @"Byte order not yet supported"; - - ptr++; - geoType = geoBuffer[ptr]; - ptr += SIZEOF_STORED_UINT32; - - switch(geoType) { - - case wkb_point: - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"POINT(%.16g %.16g)", aPoint.x, aPoint.y]; - ptr += POINT_DATA_SIZE; - break; - - case wkb_linestring: - [wkt appendString:@"LINESTRING("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - [wkt appendString:@")"]; - break; - - case wkb_polygon: - [wkt appendString:@"POLYGON("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; - } - [wkt appendString:@")"]; - break; - - case wkb_multipoint: - [wkt appendString:@"MULTIPOINT("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; - } - ptr -= WKB_HEADER_SIZE; - [wkt appendString:@")"]; - break; - - case wkb_multilinestring: - [wkt appendString:@"MULTILINESTRING("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - ptr += WKB_HEADER_SIZE; - [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; - } - ptr -= WKB_HEADER_SIZE; - [wkt appendString:@")"]; - break; - - case wkb_multipolygon: - [wkt appendString:@"MULTIPOLYGON("]; - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - [wkt appendString:@"("]; - for(k=0; k < numberOfSubSubItems; k++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (k < numberOfSubSubItems-1) ? @"," : @""]; - ptr += POINT_DATA_SIZE; - } - [wkt appendFormat:@")%@", (j < numberOfSubItems-1) ? @"," : @""]; - } - ptr += WKB_HEADER_SIZE; - [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; - } - ptr -= WKB_HEADER_SIZE; - [wkt appendString:@")"]; - break; - - default: - return @"Error geometrycollection type parsing"; - } - [wkt appendString:(n < numberOfCollectionItems-1) ? @"," : @""]; - } - [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; - return wkt; - break; - - default: - return @"Error geometry type parsing"; - } - return @"Error while parsing"; -} - -/** - * Return a dictionary of coordinates, bbox, etc. to be able to draw the given geometry. - * - * @return A dictionary having the following keys: "bbox" as NSArray of NSNumbers of x_min x_max y_min y_max, "coordinates" as NSArray containing the - * the to be drawn points as NSPoint strings, "type" as NSString - */ -- (NSDictionary*)coordinates -{ - - char byteOrder; - uint32_t geoType, numberOfItems, numberOfSubItems, numberOfSubSubItems, numberOfCollectionItems; - int32_t srid; - st_point_2d aPoint; - - uint32_t i, j, k, n; // Loop counter for numberOf...Items - uint32_t ptr = BUFFER_START; // pointer to geoBuffer while parsing - - double x_min = DBL_MAX; - double x_max = -DBL_MAX; - double y_min = DBL_MAX; - double y_max = -DBL_MAX; - - NSMutableArray *coordinates = [NSMutableArray array]; - NSMutableArray *subcoordinates = [NSMutableArray array]; - NSMutableArray *pointcoordinates = [NSMutableArray array]; - NSMutableArray *linecoordinates = [NSMutableArray array]; - NSMutableArray *linesubcoordinates = [NSMutableArray array]; - NSMutableArray *polygoncoordinates = [NSMutableArray array]; - NSMutableArray *polygonsubcoordinates = [NSMutableArray array]; - - if (bufferLength < WKB_HEADER_SIZE) - return nil; - - memcpy(&srid, &geoBuffer[0], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - - byteOrder = geoBuffer[ptr]; - - if(byteOrder != 0x1) - return nil; - - ptr++; - geoType = geoBuffer[ptr]; - ptr += SIZEOF_STORED_UINT32; - - switch(geoType) { - - case wkb_point: - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = aPoint.x; - x_max = aPoint.x; - y_min = aPoint.y; - y_max = aPoint.y; - [coordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - coordinates, @"coordinates", - [NSNumber numberWithInt:srid], @"srid", - @"POINT", @"type", - nil]; - break; - - case wkb_linestring: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [coordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - [NSArray arrayWithObjects:coordinates,nil], @"coordinates", - @"LINESTRING", @"type", - nil]; - break; - - case wkb_polygon: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [subcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - [coordinates addObject:[[subcoordinates copy] autorelease]]; - [subcoordinates removeAllObjects]; - } - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - coordinates, @"coordinates", - [NSNumber numberWithInt:srid], @"srid", - @"POLYGON", @"type", - nil]; - break; - - case wkb_multipoint: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [coordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; - } - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - coordinates, @"coordinates", - [NSNumber numberWithInt:srid], @"srid", - @"MULTIPOINT", @"type", - nil]; - break; - - case wkb_multilinestring: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [subcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - ptr += WKB_HEADER_SIZE; - [coordinates addObject:[[subcoordinates copy] autorelease]]; - [subcoordinates removeAllObjects]; - } - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - coordinates, @"coordinates", - [NSNumber numberWithInt:srid], @"srid", - @"MULTILINESTRING", @"type", - nil]; - break; - - case wkb_multipolygon: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(k=0; k < numberOfSubSubItems; k++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [subcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - [coordinates addObject:[[subcoordinates copy] autorelease]]; - [subcoordinates removeAllObjects]; - } - ptr += WKB_HEADER_SIZE; - } - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - coordinates, @"coordinates", - [NSNumber numberWithInt:srid], @"srid", - @"MULTIPOLYGON", @"type", - nil]; - break; - - case wkb_geometrycollection: - numberOfCollectionItems = geoBuffer[ptr]; - ptr += SIZEOF_STORED_UINT32; - - for(n=0; n < numberOfCollectionItems; n++) { - - byteOrder = geoBuffer[ptr]; - - if(byteOrder != 0x1) - return nil; - - ptr++; - geoType = geoBuffer[ptr]; - ptr += SIZEOF_STORED_UINT32; - - switch(geoType) { - - case wkb_point: - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [pointcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - break; - - case wkb_linestring: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [linesubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - [linecoordinates addObject:[[linesubcoordinates copy] autorelease]]; - [linesubcoordinates removeAllObjects]; - break; - - case wkb_polygon: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [polygonsubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - [polygoncoordinates addObject:[[polygonsubcoordinates copy] autorelease]]; - [polygonsubcoordinates removeAllObjects]; - } - break; - - case wkb_multipoint: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [pointcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; - } - ptr -= WKB_HEADER_SIZE; - break; - - case wkb_multilinestring: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [linesubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - [linecoordinates addObject:[[linesubcoordinates copy] autorelease]]; - [linesubcoordinates removeAllObjects]; - ptr += WKB_HEADER_SIZE; - } - ptr -= WKB_HEADER_SIZE; - break; - - case wkb_multipolygon: - memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; - for(i=0; i < numberOfItems; i++) { - memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(j=0; j < numberOfSubItems; j++) { - memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); - ptr += SIZEOF_STORED_UINT32; - for(k=0; k < numberOfSubSubItems; k++) { - memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); - x_min = (aPoint.x < x_min) ? aPoint.x : x_min; - x_max = (aPoint.x > x_max) ? aPoint.x : x_max; - y_min = (aPoint.y < y_min) ? aPoint.y : y_min; - y_max = (aPoint.y > y_max) ? aPoint.y : y_max; - [polygonsubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; - ptr += POINT_DATA_SIZE; - } - [polygoncoordinates addObject:[[polygonsubcoordinates copy] autorelease]]; - [polygonsubcoordinates removeAllObjects]; - } - ptr += WKB_HEADER_SIZE; - } - ptr -= WKB_HEADER_SIZE; - break; - - default: - return nil; - } - } - return [NSDictionary dictionaryWithObjectsAndKeys: - [NSArray arrayWithObjects: - [NSNumber numberWithDouble:x_min], - [NSNumber numberWithDouble:x_max], - [NSNumber numberWithDouble:y_min], - [NSNumber numberWithDouble:y_max], - nil], @"bbox", - [NSArray arrayWithObjects:pointcoordinates, linecoordinates, polygoncoordinates, nil], @"coordinates", - @"GEOMETRYCOLLECTION", @"type", - nil]; - break; - - default: - return nil; - } - return nil; -} - -/** - * Return the WKB type of the geoBuffer ie if buffer represents a POINT, LINESTRING, etc. - * according to stored wkbType in header file. It returns -1 if an error occurred. - */ -- (NSInteger)wkbType -{ - char byteOrder; - UInt32 geoType; - - NSUInteger ptr = BUFFER_START; // pointer to geoBuffer while parsing - - if (bufferLength < WKB_HEADER_SIZE) - return -1; - - byteOrder = geoBuffer[ptr]; - - if(byteOrder != 0x1) - return -1; - - ptr++; - geoType = geoBuffer[ptr]; - - if(geoType > 0 && geoType < 8) - return geoType; - else - return -1; - -} - -/** - * Return the WKT type of the geoBuffer ie if buffer represents a POINT, LINESTRING, etc. - * according to stored wkbType in header file. It returns nil if an error occurred. - */ -- (NSString*)wktType -{ - switch([self wkbType]) - { - case wkb_point: - return @"POINT"; - case wkb_linestring: - return @"LINESTRING"; - case wkb_polygon: - return @"POLYGON"; - case wkb_multipoint: - return @"MULTIPOINT"; - case wkb_multilinestring: - return @"MULTILINESTRING"; - case wkb_multipolygon: - return @"MULTIPOLYGON"; - case wkb_geometrycollection: - return @"GEOMETRYCOLLECTION"; - default: - return nil; - } - return nil; -} - -/** - * dealloc - */ -- (void)dealloc -{ - if(geoBuffer && bufferLength) free(geoBuffer); - [super dealloc]; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPKit.h b/Frameworks/MCPKit/MCPFoundationKit/MCPKit.h deleted file mode 100644 index 57e6d62d..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPKit.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// $Id$ -// -// MCPKit.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2001. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -#import <MCPKit/MCPConstants.h> -#import <MCPKit/MCPNull.h> -#import <MCPKit/MCPResult.h> -#import <MCPKit/MCPStreamingResult.h> -#import <MCPKit/MCPConnection.h> -#import <MCPKit/MCPNumber.h> -#import <MCPKit/MCPResultPlus.h> -#import <MCPKit/MCPFastQueries.h> -#import <MCPKit/MCPGeometryData.h> - -#import <MCPKit/MCPConnectionProxy.h> -#import <MCPKit/MCPConnectionDelegate.h> - -#import "mysql.h" diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPNull.m b/Frameworks/MCPKit/MCPFoundationKit/MCPNull.m deleted file mode 100644 index 4232fb2a..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPNull.m +++ /dev/null @@ -1,43 +0,0 @@ -// -// $Id$ -// -// MCPNull.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 02/06/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPNull.h" - -@implementation NSObject (MCPNSNullTest) - -/** - * This Category is meant to make any kind of object the possible target to the test (isNSNull). - */ -- (BOOL) isNSNull -{ - static id NSNullForComparison; - if (!NSNullForComparison) NSNullForComparison = [NSNull null]; - return (self == NSNullForComparison); -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPNumber.h b/Frameworks/MCPKit/MCPFoundationKit/MCPNumber.h deleted file mode 100644 index 8be1dd8b..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPNumber.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// $Id$ -// -// MCPNumber.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -@interface MCPNumber : NSNumber -{ - const char *typeCode; - NSNumber *number; -} - -+ (MCPNumber *)numberWithChar:(char)value; -+ (MCPNumber *)numberWithUnsignedChar:(unsigned char)value; -+ (MCPNumber *)numberWithShort:(short)value; -+ (MCPNumber *)numberWithUnsignedShort:(unsigned short)value; -+ (MCPNumber *)numberWithInt:(int)value; -+ (MCPNumber *)numberWithUnsignedInt:(unsigned int)value; -+ (MCPNumber *)numberWithLong:(long)value; -+ (MCPNumber *)numberWithUnsignedLong:(unsigned long)value; -+ (MCPNumber *)numberWithLongLong:(long long)value; -+ (MCPNumber *)numberWithUnsignedLongLong:(unsigned long long)value; -+ (MCPNumber *)numberWithFloat:(float)value; -+ (MCPNumber *)numberWithDouble:(double)value; -+ (MCPNumber *)numberWithBool:(BOOL)value; - -- (id)initWithChar:(char)value; -- (id)initWithUnsignedChar:(unsigned char)value; -- (id)initWithShort:(short)value; -- (id)initWithUnsignedShort:(unsigned short)value; -- (id)initWithInt:(int)value; -- (id)initWithUnsignedInt:(unsigned int)value; -- (id)initWithLong:(long)value; -- (id)initWithUnsignedLong:(unsigned long)value; -- (id)initWithLongLong:(long long)value; -- (id)initWithUnsignedLongLong:(unsigned long long)value; -- (id)initWithFloat:(float)value; -- (id)initWithDouble:(double)value; -- (id)initWithBool:(BOOL)value; - -// Important NSNumber primitive methods -- (const char *)objCType; -- (void)getValue:(void *)buffer; - -- (char)charValue; -- (unsigned char)unsignedCharValue; -- (short)shortValue; -- (unsigned short)unsignedShortValue; -- (int)intValue; -- (unsigned int)unsignedIntValue; -- (long)longValue; -- (unsigned long)unsignedLongValue; -- (long long)longLongValue; -- (unsigned long long)unsignedLongLongValue; -- (float)floatValue; -- (double)doubleValue; -- (BOOL)boolValue; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPNumber.m b/Frameworks/MCPKit/MCPFoundationKit/MCPNumber.m deleted file mode 100644 index de035ee8..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPNumber.m +++ /dev/null @@ -1,301 +0,0 @@ -// -// $Id$ -// -// MCPNumber.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPNumber.h" - -@implementation MCPNumber - -#pragma mark - -#pragma mark 'Creator' class methods - -+ (MCPNumber *)numberWithChar:(char)value -{ - return [[[MCPNumber alloc] initWithChar:value] autorelease]; -} - -+ (MCPNumber *)numberWithUnsignedChar:(unsigned char)value -{ - return [[[MCPNumber alloc] initWithUnsignedChar:value] autorelease]; -} - -+ (MCPNumber *)numberWithShort:(short)value -{ - return [[[MCPNumber alloc] initWithShort:value] autorelease]; -} - -+ (MCPNumber *)numberWithUnsignedShort:(unsigned short)value -{ - return [[[MCPNumber alloc] initWithUnsignedShort:value] autorelease]; -} - -+ (MCPNumber *)numberWithInt:(int)value -{ - return [[[MCPNumber alloc] initWithInteger:value] autorelease]; -} - -+ (MCPNumber *)numberWithUnsignedInt:(unsigned int)value -{ - return [[[MCPNumber alloc] initWithUnsignedInteger:value] autorelease]; -} - -+ (MCPNumber *)numberWithLong:(long)value -{ - return [[[MCPNumber alloc] initWithLong:value] autorelease]; -} - -+ (MCPNumber *)numberWithUnsignedLong:(unsigned long)value -{ - return [[[MCPNumber alloc] initWithUnsignedLong:value] autorelease]; -} - -+ (MCPNumber *)numberWithLongLong:(long long)value -{ - return [[[MCPNumber alloc] initWithLongLong:value] autorelease]; -} - -+ (MCPNumber *)numberWithUnsignedLongLong:(unsigned long long)value -{ - return [[[MCPNumber alloc] initWithUnsignedLongLong:value] autorelease]; -} - -+ (MCPNumber *)numberWithFloat:(float)value -{ - return [[[MCPNumber alloc] initWithDouble:value] autorelease]; -} - -+ (MCPNumber *)numberWithDouble:(double)value -{ - return [[[MCPNumber alloc] initWithDouble:value] autorelease]; -} - -+ (MCPNumber *)numberWithBool:(BOOL)value -{ - return [[[MCPNumber alloc] initWithBool:value] autorelease]; -} - -#pragma mark - -#pragma mark Initialilzers - -- (id)initWithChar:(char)value -{ - typeCode = @encode(char); - number = [[NSNumber alloc] initWithChar:value]; - - return self; -} - -- (id)initWithUnsignedChar:(unsigned char)value -{ - typeCode = @encode(unsigned char); - number = [[NSNumber alloc] initWithUnsignedChar:value]; - - return self; -} - -- (id)initWithShort:(short)value -{ - typeCode = @encode(short); - number = [[NSNumber alloc] initWithShort:value]; - - return self; -} - -- (id)initWithUnsignedShort:(unsigned short)value -{ - typeCode = @encode(unsigned short); - number = [[NSNumber alloc] initWithUnsignedShort:value]; - - return self; -} - -- (id)initWithInt:(int)value -{ - typeCode = @encode(NSInteger); - number = [[NSNumber alloc] initWithInteger:value]; - - return self; -} - -- (id)initWithUnsignedInt:(unsigned int)value -{ - typeCode = @encode(NSUInteger); - number = [[NSNumber alloc] initWithUnsignedInteger:value]; - - return self; -} - -- (id)initWithLong:(long) value -{ - typeCode = @encode(long); - number = [[NSNumber alloc] initWithLong:value]; - - return self; -} - -- (id)initWithUnsignedLong:(unsigned long)value -{ - typeCode = @encode(unsigned long); - number = [[NSNumber alloc] initWithUnsignedLong:value]; - - return self; -} - -- (id)initWithLongLong:(long long)value -{ - typeCode = @encode(long long); - number = [[NSNumber alloc] initWithLongLong:value]; - - return self; -} - -- (id)initWithUnsignedLongLong:(unsigned long long)value -{ - typeCode = @encode(unsigned long long); - number = [[NSNumber alloc] initWithUnsignedLongLong:value]; - - return self; -} - -- (id)initWithFloat:(float)value -{ - typeCode = @encode(CGFloat); - number = [[NSNumber alloc] initWithDouble:value]; - - return self; -} - -- (id)initWithDouble:(double)value -{ - typeCode = @encode(double); - number = [[NSNumber alloc] initWithDouble:value]; - - return self; -} - -- (id)initWithBool:(BOOL)value -{ - typeCode = @encode(BOOL); - number = [[NSNumber alloc] initWithBool:value]; - - return self; -} - -#pragma mark - -#pragma mark NSValue primitive methods - -- (const char *)objCType -{ - return typeCode; -} - -- (void)getValue:(void *)buffer -{ - [number getValue:buffer]; -} - -#pragma mark - -#pragma mark NSNumber primitive methods - -/** - * Reparing the absence of primitive methodes in NSNumber - */ -- (char)charValue -{ - return [number charValue]; -} - -- (unsigned char)unsignedCharValue -{ - return [number unsignedCharValue]; -} - -- (short)shortValue -{ - return [number shortValue]; -} - -- (unsigned short)unsignedShortValue -{ - return [number unsignedShortValue]; -} - -- (int)intValue -{ - return [number intValue]; -} - -- (unsigned int)unsignedIntValue -{ - return [number unsignedIntValue]; -} - -- (long)longValue -{ - return [number longValue]; -} - -- (unsigned long)unsignedLongValue -{ - return [number unsignedLongValue]; -} - -- (long long)longLongValue -{ - return [number longLongValue]; -} - -- (unsigned long long)unsignedLongLongValue -{ - return [number unsignedLongLongValue]; -} - -- (float)floatValue -{ - return [number floatValue]; -} - -- (double)doubleValue -{ - return [number doubleValue]; -} - -- (BOOL)boolValue -{ - return [number boolValue]; -} - -#pragma mark - - -- (void)dealloc -{ - [number release]; - - [super dealloc]; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPResult.h b/Frameworks/MCPKit/MCPFoundationKit/MCPResult.h deleted file mode 100644 index ad50af75..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPResult.h +++ /dev/null @@ -1,86 +0,0 @@ -// -// $Id$ -// -// MCPResult.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -#import "MCPConstants.h" -#import "mysql.h" - -#define MAGIC_BINARY_CHARSET_NR 63 - -@interface MCPResult : NSObject -{ - MYSQL_RES *mResult; /* The MYSQL_RES structure of the C API. */ - NSArray *mNames; /* An NSArray holding the name of the columns. */ - NSStringEncoding mEncoding; /* The encoding used by MySQL server, to ISO-1 default. */ - NSUInteger mNumOfFields; /* The number of fields in the result. */ - NSTimeZone *mTimeZone; /* The time zone of the connection when the query was made. */ - BOOL mReturnDataAsStrings; /* Whether to return data types as strings */ -} - -// Initialization -- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)iTimeZone; -- (id)initWithResPtr:(MYSQL_RES *)mySQLResPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)iTimeZone; - -// Result info -- (my_ulonglong)numOfRows; -- (NSUInteger)numOfFields; - -// Rows -- (void)dataSeek:(my_ulonglong)row; -- (id)fetchRowAsType:(MCPReturnType) aType; -- (NSArray *)fetchRowAsArray; -- (NSDictionary *)fetchRowAsDictionary; - -// Columns -- (NSArray *)fetchFieldNames; -- (id)fetchTypesAsType:(MCPReturnType)aType; -- (NSArray *)fetchTypesAsArray; -- (NSDictionary *)fetchTypesAsDictionary; -- (NSArray *)fetchResultFieldsStructure; - -- (NSUInteger)fetchFlagsAtIndex:(NSUInteger)index; -- (NSUInteger)fetchFlagsForKey:(NSString *)key; - -- (BOOL)isBlobAtIndex:(NSUInteger)index; -- (BOOL)isBlobForKey:(NSString *)key; - -// Conversion -- (void) setReturnDataAsStrings:(BOOL)alwaysConvertData; -- (NSString *)stringWithText:(NSData *)theTextData; -- (const char *)cStringFromString:(NSString *)theString; -- (NSString *)stringWithCString:(const char *)theCString; - -// Other -- (NSString *)mysqlTypeToStringForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags withLength:(unsigned long long)length; -- (NSString *)mysqlTypeToGroupForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags; -- (NSString *)findCharsetName:(NSUInteger)charsetnr; -- (NSString *)findCharsetCollation:(NSUInteger)charsetnr; -- (NSUInteger)findCharsetMaxByteLengthPerChar:(NSUInteger)charsetnr; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m deleted file mode 100644 index f112a02d..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m +++ /dev/null @@ -1,1354 +0,0 @@ -// -// $Id$ -// -// MCPResult.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 08/12/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPConnection.h" -#import "MCPNull.h" -#import "MCPNumber.h" -#import "MCPResult.h" -#import "MCPGeometryData.h" - -NSCalendarDate *MCPYear0000; - -const OUR_CHARSET our_charsets60[] = -{ - {1, "big5","big5_chinese_ci", 1, 2}, - {3, "dec8", "dec8_swedisch_ci", 1, 1}, - {4, "cp850", "cp850_general_ci", 1, 1}, - {6, "hp8", "hp8_english_ci", 1, 1}, - {7, "koi8r", "koi8r_general_ci", 1, 1}, - {8, "latin1", "latin1_swedish_ci", 1, 1}, - {9, "latin2", "latin2_general_ci", 1, 1}, - {10, "swe7", "swe7_swedish_ci", 1, 1}, - {11, "ascii", "ascii_general_ci", 1, 1}, - {12, "ujis", "ujis_japanese_ci", 1, 3}, - {13, "sjis", "sjis_japanese_ci", 1, 2}, - {16, "hebrew", "hebrew_general_ci", 1, 1}, - {18, "tis620", "tis620_thai_ci", 1, 1}, - {19, "euckr", "euckr_korean_ci", 1, 2}, - {22, "koi8u", "koi8u_general_ci", 1, 1}, - {24, "gb2312", "gb2312_chinese_ci", 1, 2}, - {25, "greek", "greek_general_ci", 1, 1}, - {26, "cp1250", "cp1250_general_ci", 1, 1}, - {28, "gbk", "gbk_chinese_ci", 1, 2}, - {30, "latin5", "latin5_turkish_ci", 1, 1}, - {32, "armscii8", "armscii8_general_ci", 1, 1}, - {33, "utf8", "utf8_general_ci", 1, 3}, - {35, "ucs2", "ucs2_general_ci", 2, 2}, - {36, "cp866", "cp866_general_ci", 1, 1}, - {37, "keybcs2", "keybcs2_general_ci", 1, 1}, - {38, "macce", "macce_general_ci", 1, 1}, - {39, "macroman", "macroman_general_ci", 1, 1}, - {40, "cp852", "cp852_general_ci", 1, 1}, - {41, "latin7", "latin7_general_ci", 1, 1}, - {51, "cp1251", "cp1251_general_ci", 1, 1}, - {57, "cp1256", "cp1256_general_ci", 1, 1}, - {59, "cp1257", "cp1257_general_ci", 1, 1}, - {63, "binary", "binary", 1, 1}, - {92, "geostd8", "geostd8_general_ci", 1, 1}, - {95, "cp932", "cp932_japanese_ci", 1, 2}, - {97, "eucjpms", "eucjpms_japanese_ci", 1, 3}, - {2, "latin2", "latin2_czech_cs", 1, 1}, - {5, "latin1", "latin1_german_ci", 1, 1}, - {14, "cp1251", "cp1251_bulgarian_ci", 1, 1}, - {15, "latin1", "latin1_danish_ci", 1, 1}, - {17, "filename", "filename", 1, 5}, - {20, "latin7", "latin7_estonian_cs", 1, 1}, - {21, "latin2", "latin2_hungarian_ci", 1, 1}, - {23, "cp1251", "cp1251_ukrainian_ci", 1, 1}, - {27, "latin2", "latin2_croatian_ci", 1, 1}, - {29, "cp1257", "cp1257_lithunian_ci", 1, 1}, - {31, "latin1", "latin1_german2_ci", 1, 1}, - {34, "cp1250", "cp1250_czech_cs", 1, 1}, - {42, "latin7", "latin7_general_cs", 1, 1}, - {43, "macce", "macce_bin", 1, 1}, - {44, "cp1250", "cp1250_croatian_ci", 1, 1}, - {45, "utf8", "utf8_general_ci", 1, 1}, - {46, "utf8", "utf8_bin", 1, 1}, - {47, "latin1", "latin1_bin", 1, 1}, - {48, "latin1", "latin1_general_ci", 1, 1}, - {49, "latin1", "latin1_general_cs", 1, 1}, - {50, "cp1251", "cp1251_bin", 1, 1}, - {52, "cp1251", "cp1251_general_cs", 1, 1}, - {53, "macroman", "macroman_bin", 1, 1}, - {58, "cp1257", "cp1257_bin", 1, 1}, - {60, "armascii8", "armascii8_bin", 1, 1}, - {65, "ascii", "ascii_bin", 1, 1}, - {66, "cp1250", "cp1250_bin", 1, 1}, - {67, "cp1256", "cp1256_bin", 1, 1}, - {68, "cp866", "cp866_bin", 1, 1}, - {69, "dec8", "dec8_bin", 1, 1}, - {70, "greek", "greek_bin", 1, 1}, - {71, "hebew", "hebrew_bin", 1, 1}, - {72, "hp8", "hp8_bin", 1, 1}, - {73, "keybcs2", "keybcs2_bin", 1, 1}, - {74, "koi8r", "koi8r_bin", 1, 1}, - {75, "koi8u", "koi8u_bin", 1, 1}, - {77, "latin2", "latin2_bin", 1, 1}, - {78, "latin5", "latin5_bin", 1, 1}, - {79, "latin7", "latin7_bin", 1, 1}, - {80, "cp850", "cp850_bin", 1, 1}, - {81, "cp852", "cp852_bin", 1, 1}, - {82, "swe7", "swe7_bin", 1, 1}, - {93, "geostd8", "geostd8_bin", 1, 1}, - {83, "utf8", "utf8_bin", 1, 3}, - {84, "big5", "big5_bin", 1, 2}, - {85, "euckr", "euckr_bin", 1, 2}, - {86, "gb2312", "gb2312_bin", 1, 2}, - {87, "gbk", "gbk_bin", 1, 2}, - {88, "sjis", "sjis_bin", 1, 2}, - {89, "tis620", "tis620_bin", 1, 1}, - {90, "ucs2", "ucs2_bin", 2, 2}, - {91, "ujis", "ujis_bin", 1, 3}, - {94, "latin1", "latin1_spanish_ci", 1, 1}, - {96, "cp932", "cp932_bin", 1, 2}, - {99, "cp1250", "cp1250_polish_ci", 1, 1}, - {98, "eucjpms", "eucjpms_bin", 1, 3}, - {128, "ucs2", "ucs2_unicode_ci", 2, 2}, - {129, "ucs2", "ucs2_icelandic_ci", 2, 2}, - {130, "ucs2", "ucs2_latvian_ci", 2, 2}, - {131, "ucs2", "ucs2_romanian_ci", 2, 2}, - {132, "ucs2", "ucs2_slovenian_ci", 2, 2}, - {133, "ucs2", "ucs2_polish_ci", 2, 2}, - {134, "ucs2", "ucs2_estonian_ci", 2, 2}, - {135, "ucs2", "ucs2_spanish_ci", 2, 2}, - {136, "ucs2", "ucs2_swedish_ci", 2, 2}, - {137, "ucs2", "ucs2_turkish_ci", 2, 2}, - {138, "ucs2", "ucs2_czech_ci", 2, 2}, - {139, "ucs2", "ucs2_danish_ci", 2, 2}, - {140, "ucs2", "ucs2_lithunian_ci", 2, 2}, - {141, "ucs2", "ucs2_slovak_ci", 2, 2}, - {142, "ucs2", "ucs2_spanish2_ci", 2, 2}, - {143, "ucs2", "ucs2_roman_ci", 2, 2}, - {144, "ucs2", "ucs2_persian_ci", 2, 2}, - {145, "ucs2", "ucs2_esperanto_ci", 2, 2}, - {146, "ucs2", "ucs2_hungarian_ci", 2, 2}, - {147, "ucs2", "ucs2_sinhala_ci", 2, 2}, - {192, "utf8mb3", "utf8mb3_general_ci", 1, 3}, - {193, "utf8mb3", "utf8mb3_icelandic_ci", 1, 3}, - {194, "utf8mb3", "utf8mb3_latvian_ci", 1, 3}, - {195, "utf8mb3", "utf8mb3_romanian_ci", 1, 3}, - {196, "utf8mb3", "utf8mb3_slovenian_ci", 1, 3}, - {197, "utf8mb3", "utf8mb3_polish_ci", 1, 3}, - {198, "utf8mb3", "utf8mb3_estonian_ci", 1, 3}, - {119, "utf8mb3", "utf8mb3_spanish_ci", 1, 3}, - {200, "utf8mb3", "utf8mb3_swedish_ci", 1, 3}, - {201, "utf8mb3", "utf8mb3_turkish_ci", 1, 3}, - {202, "utf8mb3", "utf8mb3_czech_ci", 1, 3}, - {203, "utf8mb3", "utf8mb3_danish_ci", 1, 3}, - {204, "utf8mb3", "utf8mb3_lithunian_ci", 1, 3}, - {205, "utf8mb3", "utf8mb3_slovak_ci", 1, 3}, - {206, "utf8mb3", "utf8mb3_spanish2_ci", 1, 3}, - {207, "utf8mb3", "utf8mb3_roman_ci", 1, 3}, - {208, "utf8mb3", "utf8mb3_persian_ci", 1, 3}, - {209, "utf8mb3", "utf8mb3_esperanto_ci", 1, 3}, - {210, "utf8mb3", "utf8mb3_hungarian_ci", 1, 3}, - {211, "utf8mb3", "utf8mb3_sinhala_ci", 1, 3}, - {224, "utf8", "utf8_unicode_ci", 1, 3}, - {225, "utf8", "utf8_icelandic_ci", 1, 3}, - {226, "utf8", "utf8_latvian_ci", 1, 3}, - {227, "utf8", "utf8_romanian_ci", 1, 3}, - {228, "utf8", "utf8_slovenian_ci", 1, 3}, - {229, "utf8", "utf8_polish_ci", 1, 3}, - {230, "utf8", "utf8_estonian_ci", 1, 3}, - {231, "utf8", "utf8_spanish_ci", 1, 3}, - {232, "utf8", "utf8_swedish_ci", 1, 3}, - {233, "utf8", "utf8_turkish_ci", 1, 3}, - {234, "utf8", "utf8_czech_ci", 1, 3}, - {235, "utf8", "utf8_danish_ci", 1, 3}, - {236, "utf8", "utf8_lithuanian_ci", 1, 3}, - {237, "utf8", "utf8_slovak_ci", 1, 3}, - {238, "utf8", "utf8_spanish2_ci", 1, 3}, - {239, "utf8", "utf8_roman_ci", 1, 3}, - {240, "utf8", "utf8_persian_ci", 1, 3}, - {241, "utf8", "utf8_esperanto_ci", 1, 3}, - {242, "utf8", "utf8_hungarian_ci", 1, 3}, - {243, "utf8", "utf8_sinhala_ci", 1, 3}, - {254, "utf8mb3", "utf8mb3_general_cs", 1, 3}, - {0, NULL, NULL, 0, 0} -}; - -@implementation MCPResult - -/** - * Hold the results of a query to a MySQL database server. It correspond to the MYSQL_RES structure of the C API, and to the statement handle of the PERL DBI/DBD. - * - * Uses the !{mysql_store_result()} function from the C API. - * - * This object is generated only by a MCPConnection object, in this way (see #{MCPConnection} documentation): - * - * MCPConnection *theConnec = [MCPConnection alloc]; - * MCPResult *theRes; - * NSDictionary *theDict; - * NSArray *theColNames; - * int i, j; - * - * theConnec = [theConnec initToHost:@"albert.com" withLogin:@"toto" password:@"albert" usingPort:0]; - * [theConnec selectDB:@"db1"]; - * theRes = [theConnec queryString:@"select * from table1"]; - * theColNames = [theRes fetchFiedlsName]; - * i = 0; - * - * while (theDict = [theRes fetchRowAsDictionary]) { - * NSLog(@"Row : %d\n", i); - * for (j=0; j<[theColNames count]; j++) { - * NSLog(@" Field : %@, contain : %@\n", [theColNames objectAtIndex:j], [theDict objectForKey:[theColNames objectAtIndex:j]]); - * } - * i++; - * } - */ - -/** - * Initialize the class version to 3.0.1 - */ -+ (void)initialize -{ - if ((self = [MCPResult class])) { - [self setVersion:030001]; // Ma.Mi.Re -> MaMiRe - MCPYear0000 = [NSCalendarDate dateWithTimeIntervalSinceReferenceDate:-63146822400.0]; - [MCPYear0000 setCalendarFormat:@"%Y"]; - } -} - -#pragma mark - -#pragma mark Initialisation - -/** - * Empty init, normaly of NO use to the user, again, MCPResult should be made through calls to MCPConnection - */ -- (id)init -{ - if ((self = [super init])) { - mEncoding = [MCPConnection defaultMySQLEncoding]; - mReturnDataAsStrings = NO; - mTimeZone = nil; - - if (mResult) { - mysql_free_result(mResult); - mResult = NULL; - } - - if (mNames) { - [mNames release]; - mNames = nil; - } - - mNumOfFields = 0; - } - - return self; -} - -/** - * Initialise a MCPResult, it is used internally by MCPConnection !{queryString:} method: the only proper - * way to get a running MCPResult object. - */ -- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)iEncoding timeZone:(NSTimeZone *)iTimeZone -{ - if ((self = [super init])) { - mEncoding = iEncoding; - mTimeZone = [iTimeZone retain]; - mReturnDataAsStrings = NO; - - if (mResult) { - mysql_free_result(mResult); - mResult = NULL; - } - - if (mNames) { - [mNames release]; - mNames = nil; - } - - mResult = mysql_store_result(mySQLPtr); - - if (mResult) { - mNumOfFields = mysql_num_fields(mResult); - } - else { - mNumOfFields = 0; - } - } - - return self; -} - -/** - * This metod is used internally by MCPConnection object when it have already a MYSQL_RES object to initialise - * MCPResult object. Initialise a MCPResult with the MYSQL_RES pointer (returned by such a function as mysql_list_dbs). - * NB: MCPResult should be made by using one of the method of MCPConnection. - */ -- (id)initWithResPtr:(MYSQL_RES *)mySQLResPtr encoding:(NSStringEncoding)iEncoding timeZone:(NSTimeZone *)iTimeZone -{ - if ((self = [super init])) { - mEncoding = iEncoding; - mTimeZone = [iTimeZone retain]; - mReturnDataAsStrings = NO; - - if (mResult) { - mysql_free_result(mResult); - mResult = NULL; - } - - if (mNames) { - [mNames release]; - mNames = nil; - } - - mResult = mySQLResPtr; - - if (mResult) { - mNumOfFields = mysql_num_fields(mResult); - } - else { - mNumOfFields = 0; - } - } - - return self; -} - -#pragma mark - -#pragma mark Result info - -/** - * Return the number of rows selected by the query. - */ -- (my_ulonglong)numOfRows -{ - if (mResult) { - return mysql_num_rows(mResult); - } - - return 0; -} - -/** - * Return the number of fields selected by the query. As a side effect it forces an update of the number of fields. - */ -- (NSUInteger)numOfFields -{ - if (mResult) { - return mNumOfFields = mysql_num_fields(mResult); - } - - return mNumOfFields = 0; -} - -#pragma mark - -#pragma mark Rows - -/** - * Go to a precise row in the selected result. 0 is the very first row. - */ -- (void)dataSeek:(my_ulonglong)row -{ - my_ulonglong theRow = (row < 1)? 0 : row; - theRow = (theRow < [self numOfRows]) ? theRow : ([self numOfRows] - 1); - mysql_data_seek(mResult,theRow); -} - -/** - * - */ -- (id)fetchRowAsType:(MCPReturnType)aType -{ - MYSQL_ROW theRow; - unsigned long *theLengths; - MYSQL_FIELD *theField; - NSUInteger i; - id theReturn; - - if (mResult == NULL) { - // If there is no results, returns nil, as after the last row... - return nil; - } - - theRow = mysql_fetch_row(mResult); - - if (theRow == NULL) { - return nil; - } - - switch (aType) { - case MCPTypeArray: - theReturn = [NSMutableArray arrayWithCapacity:mNumOfFields]; - break; - case MCPTypeDictionary: - if (mNames == nil) { - [self fetchFieldNames]; - } - theReturn = [NSMutableDictionary dictionaryWithCapacity:mNumOfFields]; - break; - default : - NSLog (@"Unknown type : %d, will return an Array!\n", (int)aType); - theReturn = [NSMutableArray arrayWithCapacity:mNumOfFields]; - break; - } - - theLengths = mysql_fetch_lengths(mResult); - theField = mysql_fetch_fields(mResult); - - for (i=0; i<mNumOfFields; i++) { - id theCurrentObj; - - if (theRow[i] == NULL) { - theCurrentObj = [NSNull null]; - } else { - char *theData = theRow[i]; - - switch (theField[i].type) { - case FIELD_TYPE_TINY: - case FIELD_TYPE_SHORT: - case FIELD_TYPE_INT24: - case FIELD_TYPE_LONG: - case FIELD_TYPE_LONGLONG: - case FIELD_TYPE_DECIMAL: - case FIELD_TYPE_NEWDECIMAL: - case FIELD_TYPE_FLOAT: - case FIELD_TYPE_DOUBLE: - case FIELD_TYPE_TIMESTAMP: - case FIELD_TYPE_DATE: - case FIELD_TYPE_TIME: - case FIELD_TYPE_DATETIME: - case FIELD_TYPE_YEAR: - case FIELD_TYPE_VAR_STRING: - case FIELD_TYPE_STRING: - case FIELD_TYPE_SET: - case FIELD_TYPE_ENUM: - case FIELD_TYPE_NEWDATE: // Don't know what the format for this type is... - theCurrentObj = [[[NSString alloc] initWithBytes:theData length:theLengths[i] encoding:mEncoding] autorelease]; - break; - - case FIELD_TYPE_BIT: - theCurrentObj = [NSString stringWithFormat:@"%u", theData[0]]; - break; - - case FIELD_TYPE_TINY_BLOB: - case FIELD_TYPE_BLOB: - case FIELD_TYPE_MEDIUM_BLOB: - case FIELD_TYPE_LONG_BLOB: - theCurrentObj = [NSData dataWithBytes:theData length:theLengths[i]]; - - // If the field is TEXT and NOT BLOB, or if force-return-as-string is - // enabled, return a NSString instead of NSData - if (mReturnDataAsStrings || !(theField[i].flags & BINARY_FLAG)) { - theCurrentObj = [self stringWithText:theCurrentObj]; - } - - break; - - case FIELD_TYPE_NULL: - theCurrentObj = [NSNull null]; - break; - - case FIELD_TYPE_GEOMETRY: - theCurrentObj = [MCPGeometryData dataWithBytes:theData length:theLengths[i]]; - break; - - default: - NSLog (@"in fetchRowAsType : Unknown type : %d for column %lu, send back a NSData object", (int)theField[i].type, (unsigned long)i); - theCurrentObj = [NSData dataWithBytes:theData length:theLengths[i]]; - break; - } - - // Some of the creators return nil object... - if (theCurrentObj == nil) { - theCurrentObj = [NSNull null]; - } - } - - switch (aType) { - case MCPTypeDictionary : - [theReturn setObject:theCurrentObj forKey:[mNames objectAtIndex:i]]; - break; - - case MCPTypeArray : - default : - [theReturn addObject:theCurrentObj]; - break; - } - } - - return theReturn; -} - -/** - * Return the next row of the result as an array, the index in select field order, the object a proper object - * for handling the information in the field (NSString, NSNumber ...). - * - * Just a #{typed} wrapper for method !{fetchRosAsType:} (with arg MCPTypeArray). - * - * NB: Returned object is immutable. - */ -- (NSArray *)fetchRowAsArray -{ - NSMutableArray *theArray = [self fetchRowAsType:MCPTypeArray]; - - return (theArray) ? [NSArray arrayWithArray:theArray] : nil; -} - -/** - * Return the next row of the result as a dictionary, the key being the field name, the object a proper object - * for handling the information in the field (NSString, NSNumber ...). - * - * Just a #{typed} wrapper for method !{fetchRosAsType:} (with arg MCPTypeDictionary). - * - * NB: Returned object is immutable. - */ -- (NSDictionary *)fetchRowAsDictionary -{ - NSMutableDictionary *theDict = [self fetchRowAsType:MCPTypeDictionary]; - - return (theDict) ? [NSDictionary dictionaryWithDictionary:theDict] : nil; -} - -#pragma mark - -#pragma mark Columns - -/** - * Generate the mNames if not already generated, and return it. - * - * mNames is a NSArray holding the names of the fields(columns) of the results. - */ -- (NSArray *)fetchFieldNames -{ - NSUInteger i; - NSUInteger theNumFields; - NSMutableArray *theNamesArray; - MYSQL_FIELD *theField; - - if (mNames) { - return mNames; - } - - if (mResult == NULL) { - // If no results, give an empty array. Maybe it's better to give a nil pointer? - return (mNames = [[NSArray array] retain]); - } - - theNumFields = [self numOfFields]; - theNamesArray = [NSMutableArray arrayWithCapacity: theNumFields]; - theField = mysql_fetch_fields(mResult); - - for (i=0; i<theNumFields; i++) { - NSString *theName = [self stringWithCString:theField[i].name]; - if ((theName) && (![theName isEqualToString:@""])) { - [theNamesArray addObject:theName]; - } - else { - [theNamesArray addObject:[NSString stringWithFormat:@"Column %ld", i]]; - } - } - - return (mNames = [[NSArray arrayWithArray:theNamesArray] retain]); -} - -/** - * Return a collection of the fields's type. The type of collection is choosen by the aType variable - * (MCPTypeArray or MCPTypeDictionary). - * - * This method returned directly the #{mutable} object generated while going through all the columns - */ -- (id)fetchTypesAsType:(MCPReturnType)aType -{ - NSUInteger i; - id theTypes; - MYSQL_FIELD *theField; - - if (mResult == NULL) { - // If no results, give an empty array. Maybe it's better to give a nil pointer? - return nil; - } - - switch (aType) { - case MCPTypeArray: - theTypes = [NSMutableArray arrayWithCapacity:mNumOfFields]; - break; - case MCPTypeDictionary: - if (mNames == nil) { - [self fetchFieldNames]; - } - theTypes = [NSMutableDictionary dictionaryWithCapacity:mNumOfFields]; - break; - default : - NSLog (@"Unknown type : %d, will return an Array!\n", (int)aType); - theTypes = [NSMutableArray arrayWithCapacity:mNumOfFields]; - break; - } - - theField = mysql_fetch_fields(mResult); - - for (i=0; i<mNumOfFields; i++) { - NSString *theType; - switch (theField[i].type) { - case FIELD_TYPE_TINY: - theType = @"tiny"; - break; - case FIELD_TYPE_SHORT: - theType = @"short"; - break; - case FIELD_TYPE_LONG: - theType = @"long"; - break; - case FIELD_TYPE_INT24: - theType = @"int24"; - break; - case FIELD_TYPE_LONGLONG: - theType = @"longlong"; - break; - case FIELD_TYPE_DECIMAL: - case FIELD_TYPE_NEWDECIMAL: - theType = @"decimal"; - break; - case FIELD_TYPE_FLOAT: - theType = @"float"; - break; - case FIELD_TYPE_DOUBLE: - theType = @"double"; - break; - case FIELD_TYPE_TIMESTAMP: - theType = @"timestamp"; - break; - case FIELD_TYPE_DATE: - theType = @"date"; - break; - case FIELD_TYPE_TIME: - theType = @"time"; - break; - case FIELD_TYPE_DATETIME: - theType = @"datetime"; - break; - case FIELD_TYPE_YEAR: - theType = @"year"; - break; - case FIELD_TYPE_VAR_STRING: - theType = @"varstring"; - break; - case FIELD_TYPE_STRING: - theType = @"string"; - break; - case FIELD_TYPE_TINY_BLOB: - theType = @"tinyblob"; - break; - case FIELD_TYPE_BLOB: - theType = @"blob"; - break; - case FIELD_TYPE_MEDIUM_BLOB: - theType = @"mediumblob"; - break; - case FIELD_TYPE_LONG_BLOB: - theType = @"longblob"; - break; - case FIELD_TYPE_SET: - theType = @"set"; - break; - case FIELD_TYPE_ENUM: - theType = @"enum"; - break; - case FIELD_TYPE_NULL: - theType = @"null"; - break; - case FIELD_TYPE_NEWDATE: - theType = @"newdate"; - break; - case FIELD_TYPE_GEOMETRY: - theType = @"geometry"; - break; - default: - theType = @"unknown"; - NSLog (@"in fetchTypesAsArray : Unknown type for column %lu of the MCPResult, type = %d", (unsigned long)i, (int)theField[i].type); - break; - } - - switch (aType) { - case MCPTypeArray : - [theTypes addObject:theType]; - break; - case MCPTypeDictionary : - [theTypes setObject:theType forKey:[mNames objectAtIndex:i]]; - break; - default : - [theTypes addObject:theType]; - break; - } - } - - return theTypes; -} - -/** - * Return an array of the fields' types. - * - * NB: Returned object is immutable. - */ -- (NSArray *)fetchTypesAsArray -{ - NSMutableArray *theArray = [self fetchTypesAsType:MCPTypeArray]; - - return (theArray) ? [NSArray arrayWithArray:theArray] : nil; -} - -/** - * Return a dictionnary of the fields' types (keys are the fields' names). - * - * NB: Returned object is immutable. - */ -- (NSDictionary*) fetchTypesAsDictionary -{ - NSMutableDictionary *theDict = [self fetchTypesAsType:MCPTypeDictionary]; - - return (theDict) ? [NSDictionary dictionaryWithDictionary:theDict] : nil; -} - -/** - * Return an array of dicts containg column data of the last executed query - */ -- (NSArray *)fetchResultFieldsStructure -{ - MYSQL_FIELD *theField; - - NSMutableArray *structureResult = [NSMutableArray array]; - - NSUInteger i; - NSUInteger numFields = mysql_num_fields(mResult); - - if (mResult == NULL) return nil; - - theField = mysql_fetch_fields(mResult); - - for (i=0; i < numFields; i++) - { - NSMutableDictionary *fieldStructure = [NSMutableDictionary dictionaryWithCapacity:39]; - - /* Original column position */ - [fieldStructure setObject:[NSString stringWithFormat:@"%llu", (unsigned long long)i] forKey:@"datacolumnindex"]; - - /* Name of column */ - [fieldStructure setObject:[self stringWithCString:theField[i].name] forKey:@"name"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].name_length] forKey:@"name_length"]; - - /* Original column name, if an alias */ - [fieldStructure setObject:[self stringWithCString:theField[i].org_name] forKey:@"org_name"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].org_name_length] forKey:@"org_name_length"]; - - /* Table of column if column was a field */ - [fieldStructure setObject:[self stringWithCString:theField[i].table] forKey:@"table"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].table_length] forKey:@"table_length"]; - - /* Org table name, if table was an alias */ - [fieldStructure setObject:[self stringWithCString:theField[i].org_table] forKey:@"org_table"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].org_table_length] forKey:@"org_table_length"]; - - /* Database for table */ - [fieldStructure setObject:[self stringWithCString:theField[i].db] forKey:@"db"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].db_length] forKey:@"db_length"]; - - /* Catalog for table */ - // [fieldStructure setObject:[self stringWithCString:theField[i].catalog] forKey:@"catalog"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].catalog_length] forKey:@"catalog_length"]; - - /* Default value (set by mysql_list_fields) */ - // [fieldStructure setObject:[self stringWithCString:theField[i].def] forKey:@"def"]; - // [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].def_length] forKey:@"def_length"]; - - /* Width of column (real length in bytes) */ - [fieldStructure setObject:[NSNumber numberWithUnsignedLongLong:theField[i].length] forKey:@"byte_length"]; - /* Width of column (as in create)*/ - [fieldStructure setObject:[NSNumber numberWithUnsignedLongLong:theField[i].length/[self findCharsetMaxByteLengthPerChar:theField[i].charsetnr]] - forKey:@"char_length"]; - /* Max width (bytes) for selected set */ - [fieldStructure setObject:[NSNumber numberWithUnsignedLongLong:theField[i].max_length] forKey:@"max_byte_length"]; - /* Max width (chars) for selected set */ - // [fieldStructure setObject:[NSNumber numberWithUnsignedLongLong:theField[i].max_length/[self find_charsetMaxByteLengthPerChar:theField[i].charsetnr]] - // forKey:@"max_char_length"]; - - /* Div flags */ - [fieldStructure setObject:[NSNumber numberWithUnsignedInt:theField[i].flags] forKey:@"flags"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & NOT_NULL_FLAG) ? YES : NO] forKey:@"null"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & PRI_KEY_FLAG) ? YES : NO] forKey:@"PRI_KEY_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & UNIQUE_KEY_FLAG) ? YES : NO] forKey:@"UNIQUE_KEY_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & MULTIPLE_KEY_FLAG) ? YES : NO] forKey:@"MULTIPLE_KEY_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & BLOB_FLAG) ? YES : NO] forKey:@"BLOB_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & UNSIGNED_FLAG) ? YES : NO] forKey:@"UNSIGNED_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & ZEROFILL_FLAG) ? YES : NO] forKey:@"ZEROFILL_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & BINARY_FLAG) ? YES : NO] forKey:@"BINARY_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & ENUM_FLAG) ? YES : NO] forKey:@"ENUM_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & AUTO_INCREMENT_FLAG) ? YES : NO] forKey:@"AUTO_INCREMENT_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & SET_FLAG) ? YES : NO] forKey:@"SET_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & NUM_FLAG) ? YES : NO] forKey:@"NUM_FLAG"]; - [fieldStructure setObject:[NSNumber numberWithBool:(theField[i].flags & PART_KEY_FLAG) ? YES : NO] forKey:@"PART_KEY_FLAG"]; - // [fieldStructure setObject:[NSNumber numberWithInt:(theField[i].flags & GROUP_FLAG) ? 1 : 0] forKey:@"GROUP_FLAG"]; - // [fieldStructure setObject:[NSNumber numberWithInt:(theField[i].flags & UNIQUE_FLAG) ? 1 : 0] forKey:@"UNIQUE_FLAG"]; - // [fieldStructure setObject:[NSNumber numberWithInt:(theField[i].flags & BINCMP_FLAG) ? 1 : 0] forKey:@"BINCMP_FLAG"]; - - /* Number of decimals in field */ - [fieldStructure setObject:[NSNumber numberWithUnsignedInteger:theField[i].decimals] forKey:@"decimals"]; - - /* Character set */ - [fieldStructure setObject:[NSNumber numberWithUnsignedInteger:theField[i].charsetnr] forKey:@"charsetnr"]; - [fieldStructure setObject:[self findCharsetName:theField[i].charsetnr] forKey:@"charset_name"]; - [fieldStructure setObject:[self findCharsetCollation:theField[i].charsetnr] forKey:@"charset_collation"]; - - /* Table type */ - [fieldStructure setObject:[self mysqlTypeToStringForType:theField[i].type - withCharsetNr:theField[i].charsetnr - withFlags:theField[i].flags - withLength:theField[i].length - ] forKey:@"type"]; - - /* Table type group*/ - [fieldStructure setObject:[self mysqlTypeToGroupForType:theField[i].type - withCharsetNr:theField[i].charsetnr - withFlags:theField[i].flags - ] forKey:@"typegrouping"]; - - [structureResult addObject:fieldStructure]; - - } - - return structureResult; - -} - -/** - * Return the MySQL flags of the column at the given index... Can be used to check if a number is signed or not... - */ -- (NSUInteger)fetchFlagsAtIndex:(NSUInteger)anIndex -{ - NSUInteger theRet; - NSUInteger theNumFields; - MYSQL_FIELD *theField; - - if (mResult == NULL) { - // If no results, give an empty array. Maybe it's better to give a nil pointer? - return (0); - } - - theNumFields = [self numOfFields]; - theField = mysql_fetch_fields(mResult); - - if (anIndex >= theNumFields) { - // Out of range... should raise an exception - theRet = 0; - } - else { - theRet = theField[anIndex].flags; - } - - return theRet; -} - -/** - * - */ -- (NSUInteger)fetchFlagsForKey:(NSString *)key -{ - NSUInteger theRet; - NSUInteger anIndex; - MYSQL_FIELD *theField; - - if (mResult == NULL) { - // If no results, give an empty array. Maybe it's better to give a nil pointer? - return (0); - } - - if (mNames == nil) { - [self fetchFieldNames]; - } - - theField = mysql_fetch_fields(mResult); - - if ([mNames indexOfObject:key] == NSNotFound) { - // Non existent key... should raise an exception - theRet = 0; - } - else { - anIndex = [mNames indexOfObject:key]; - - theRet = theField[anIndex].flags; - } - - return theRet; -} - -/** - * Return YES if the field with the given index is a BLOB. It should be used to discriminates between BLOBs - * and TEXTs. - * - * #{DEPRECATED}, This method is not consistent with the C API which is supposed to return YES for BOTH - * text and blob (and BTW is also deprecated)... - * - * #{NOTE} That the current version handles properly TEXT, and returns those as NSString (and not NSData as - * it used to be). - */ -- (BOOL)isBlobAtIndex:(NSUInteger)anIndex -{ - BOOL theRet; - NSUInteger theNumFields; - MYSQL_FIELD *theField; - - if (mResult == NULL) { - // If no results, give an empty array. Maybe it's better to give a nil pointer? - return (NO); - } - - theNumFields = [self numOfFields]; - theField = mysql_fetch_fields(mResult); - - if (anIndex >= theNumFields) { - // Out of range... should raise an exception - theRet = NO; - } - else { - switch(theField[anIndex].type) { - case FIELD_TYPE_TINY_BLOB: - case FIELD_TYPE_BLOB: - case FIELD_TYPE_MEDIUM_BLOB: - case FIELD_TYPE_LONG_BLOB: - theRet = (theField[anIndex].flags & BINARY_FLAG); - break; - default: - theRet = NO; - break; - } - } - - return theRet; -} - -/** - * Return YES if the field (by name) with the given index is a BLOB. It should be used to discriminates - * between BLOBs and TEXTs. - * - * #{DEPRECATED}, This method is not consistent with the C API which is supposed to return YES for BOTH - * text and blob (and BTW is also deprecated)... - * - * #{NOTE} That the current version handles properly TEXT, and returns those as NSString (and not NSData - * as it used to be). - */ -- (BOOL)isBlobForKey:(NSString *)key -{ - BOOL theRet; - NSUInteger anIndex; - MYSQL_FIELD *theField; - - if (mResult == NULL) { - // If no results, give an empty array. Maybe it's better to give a nil pointer? - return (NO); - } - - if (mNames == nil) { - [self fetchFieldNames]; - } - - theField = mysql_fetch_fields(mResult); - - if ([mNames indexOfObject:key] == NSNotFound) { - // Non existent key... should raise an exception - theRet = NO; - } - else { - anIndex = [mNames indexOfObject:key]; - - switch(theField[anIndex].type) { - case FIELD_TYPE_TINY_BLOB: - case FIELD_TYPE_BLOB: - case FIELD_TYPE_MEDIUM_BLOB: - case FIELD_TYPE_LONG_BLOB: - theRet = (theField[anIndex].flags & BINARY_FLAG); - break; - default: - theRet = NO; - break; - } - } - - return theRet; -} - -#pragma mark - -#pragma mark Conversion - -/** - * Set whether the result should return data types as strings. This may be useful - * for queries where the result may be returned in either string or data form, but - * will be converted to string for display and use anyway. - * Note that certain MySQL versions also return data types for strings - eg SHOW - * commands like SHOW CREATE TABLE or SHOW VARIABLES, and this conversion can be - * necessary there. - */ -- (void) setReturnDataAsStrings:(BOOL)alwaysConvertData -{ - mReturnDataAsStrings = alwaysConvertData; -} - -/** - * Use the string encoding to convert the returned NSData to a string (for a TEXT field). - */ -- (NSString *)stringWithText:(NSData *)theTextData -{ - NSString *theString; - - if (theTextData == nil) { - return nil; - } - - theString = [[NSString alloc] initWithData:theTextData encoding:mEncoding]; - - if (theString) { - [theString autorelease]; - } - - return theString; -} - -/** - * Return a (long) string containing the table of results, first line being the fields name, next line(s) - * the row(s). Useful to have NSLog logging a MCPResult (example). - */ -- (NSString *)description -{ - if (mResult == NULL) { - return @"This is an empty MCPResult\n"; - } - else { - NSMutableString *theString = [NSMutableString stringWithCapacity:0]; - NSUInteger i; - NSArray *theRow; - MYSQL_ROW_OFFSET thePosition; - BOOL shouldTruncateFields = [MCPConnection truncateLongField]; - - // First line, saying we are displaying a MCPResult - [theString appendFormat:@"MCPResult: (encoding : %ld, dim %ld x %ld)\n", (long)mEncoding, (long)mNumOfFields, (long)[self numOfRows]]; - - // Second line: the field names, tab separated - [self fetchFieldNames]; - - for (i=0; i<(mNumOfFields-1); i++) { - [theString appendFormat:@"%@\t", [mNames objectAtIndex:i]]; - } - - [theString appendFormat:@"%@\n", [mNames objectAtIndex:i]]; - // Next lines, the records (saving current position to put it back after the full display) - thePosition = mysql_row_tell(mResult); - [self dataSeek:0]; - - while ((theRow = [self fetchRowAsArray])) - { - id theField = [theRow objectAtIndex:i]; - - if (shouldTruncateFields) { - if (([theField isKindOfClass:[NSString class]]) && (kLengthOfTruncationForLog < [(NSString *)theField length])) { - theField = [theField substringToIndex:kLengthOfTruncationForLog]; - } - else if (([theField isKindOfClass:[NSData class]]) && (kLengthOfTruncationForLog < [(NSData *)theField length])) { - theField = [NSData dataWithBytes:[theField bytes] length:kLengthOfTruncationForLog]; - } - } - - for (i=0; i<(mNumOfFields - 1); i++) - { - [theString appendFormat:@"%@\t", theField]; - } - - [theString appendFormat:@"%@\n", theField]; - } - - // Returning to the proper row - mysql_row_seek(mResult, thePosition); - - return theString; - } -} - -/** - * For internal use only. Transform a NSString to a C type string (ended with \0) using ethe character set - * from the MCPConnection. Lossy conversions are enabled. - */ -- (const char *)cStringFromString:(NSString *)theString -{ - NSMutableData *theData; - - if (!theString) { - return (const char *)NULL; - } - - theData = [NSMutableData dataWithData:[theString dataUsingEncoding:mEncoding allowLossyConversion:YES]]; - [theData increaseLengthBy:1]; - - return (const char *)[theData bytes]; -} - -/** - * Return a NSString from a C style string encoded with the character set of theMCPConnection. - */ -- (NSString *)stringWithCString:(const char *)theCString -{ - if (theCString == NULL) return @""; - - return [NSString stringWithCString:theCString encoding:mEncoding]; -} - -#pragma mark - -#pragma mark Other - -/** - * Convert a mysql_type to a string - */ -- (NSString *)mysqlTypeToStringForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags withLength:(unsigned long long)length -{ - // BOOL isUnsigned = (flags & UNSIGNED_FLAG) != 0; - // BOOL isZerofill = (flags & ZEROFILL_FLAG) != 0; - - switch (type) { - case FIELD_TYPE_BIT: - return @"BIT"; - case MYSQL_TYPE_DECIMAL: - case MYSQL_TYPE_NEWDECIMAL: - //return isUnsigned ? (isZerofill? @"DECIMAL UNSIGNED ZEROFILL" : @"DECIMAL UNSIGNED"): - return @"DECIMAL"; - case MYSQL_TYPE_TINY: - // return isUnsigned ? (isZerofill? @"TINYINT UNSIGNED ZEROFILL" : @"TINYINT UNSIGNED"): - return @"TINYINT"; - case MYSQL_TYPE_SHORT: - // return isUnsigned ? (isZerofill? @"SMALLINT UNSIGNED ZEROFILL" : @"SMALLINT UNSIGNED"): - return @"SMALLINT"; - case MYSQL_TYPE_LONG: - // return isUnsigned ? (isZerofill? @"INT UNSIGNED ZEROFILL" : @"INT UNSIGNED"): - return @"INT"; - case MYSQL_TYPE_FLOAT: - // return isUnsigned ? (isZerofill? @"FLOAT UNSIGNED ZEROFILL" : @"FLOAT UNSIGNED"): - return @"FLOAT"; - case MYSQL_TYPE_DOUBLE: - // return isUnsigned ? (isZerofill? @"DOUBLE UNSIGNED ZEROFILL" : @"DOUBLE UNSIGNED"): - return @"DOUBLE"; - case MYSQL_TYPE_NULL: - return @"NULL"; - case MYSQL_TYPE_TIMESTAMP: - return @"TIMESTAMP"; - case MYSQL_TYPE_LONGLONG: - // return isUnsigned ? (isZerofill? @"BIGINT UNSIGNED ZEROFILL" : @"BIGINT UNSIGNED") : - return @"BIGINT"; - case MYSQL_TYPE_INT24: - // return isUnsigned ? (isZerofill? @"MEDIUMINT UNSIGNED ZEROFILL" : @"MEDIUMINT UNSIGNED") : - return @"MEDIUMINT"; - case MYSQL_TYPE_DATE: - return @"DATE"; - case MYSQL_TYPE_TIME: - return @"TIME"; - case MYSQL_TYPE_DATETIME: - return @"DATETIME"; - case MYSQL_TYPE_TINY_BLOB:// should no appear over the wire - case MYSQL_TYPE_MEDIUM_BLOB:// should no appear over the wire - case MYSQL_TYPE_LONG_BLOB:// should no appear over the wire - case MYSQL_TYPE_BLOB: - { - BOOL isBlob = (charsetnr == MAGIC_BINARY_CHARSET_NR); - switch ((NSInteger)length/[self findCharsetMaxByteLengthPerChar:charsetnr]) { - case 255: return isBlob? @"TINYBLOB":@"TINYTEXT"; - case 65535: return isBlob? @"BLOB":@"TEXT"; - case 16777215: return isBlob? @"MEDIUMBLOB":@"MEDIUMTEXT"; - case 4294967295: return isBlob? @"LONGBLOB":@"LONGTEXT"; - default: - switch (length) { - case 255: return isBlob? @"TINYBLOB":@"TINYTEXT"; - case 65535: return isBlob? @"BLOB":@"TEXT"; - case 16777215: return isBlob? @"MEDIUMBLOB":@"MEDIUMTEXT"; - case 4294967295: return isBlob? @"LONGBLOB":@"LONGTEXT"; - default: - return @"UNKNOWN"; - } - } - } - case MYSQL_TYPE_VAR_STRING: - if (flags & ENUM_FLAG) { - return @"ENUM"; - } - if (flags & SET_FLAG) { - return @"SET"; - } - if (charsetnr == MAGIC_BINARY_CHARSET_NR) { - return @"VARBINARY"; - } - return @"VARCHAR"; - case MYSQL_TYPE_STRING: - if (flags & ENUM_FLAG) { - return @"ENUM"; - } - if (flags & SET_FLAG) { - return @"SET"; - } - if ((flags & BINARY_FLAG) && charsetnr == MAGIC_BINARY_CHARSET_NR) { - return @"BINARY"; - } - return @"CHAR"; - case MYSQL_TYPE_ENUM: - /* This should never happen */ - return @"ENUM"; - case MYSQL_TYPE_YEAR: - return @"YEAR"; - case MYSQL_TYPE_SET: - /* This should never happen */ - return @"SET"; - case MYSQL_TYPE_GEOMETRY: - return @"GEOMETRY"; - default: - return @"UNKNOWN"; - } -} - -/** - * Merge mysql_types into type groups - */ -- (NSString *)mysqlTypeToGroupForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags -{ - switch(type){ - case FIELD_TYPE_BIT: - return @"bit"; - case MYSQL_TYPE_TINY: - case MYSQL_TYPE_SHORT: - case MYSQL_TYPE_LONG: - case MYSQL_TYPE_LONGLONG: - case MYSQL_TYPE_INT24: - return @"integer"; - case MYSQL_TYPE_FLOAT: - case MYSQL_TYPE_DOUBLE: - case MYSQL_TYPE_DECIMAL: - case MYSQL_TYPE_NEWDECIMAL: - return @"float"; - case MYSQL_TYPE_YEAR: - case MYSQL_TYPE_DATETIME: - case MYSQL_TYPE_TIME: - case MYSQL_TYPE_DATE: - case MYSQL_TYPE_TIMESTAMP: - return @"date"; - case MYSQL_TYPE_VAR_STRING: - if (flags & ENUM_FLAG) { - return @"enum"; - } - if (flags & SET_FLAG) { - return @"enum"; - } - if (charsetnr == MAGIC_BINARY_CHARSET_NR) { - return @"binary"; - } - return @"string"; - case MYSQL_TYPE_STRING: - if (flags & ENUM_FLAG) { - return @"enum"; - } - if (flags & SET_FLAG) { - return @"enum"; - } - if ((flags & BINARY_FLAG) && charsetnr == MAGIC_BINARY_CHARSET_NR) { - return @"binary"; - } - return @"string"; - case MYSQL_TYPE_TINY_BLOB: // should no appear over the wire - case MYSQL_TYPE_MEDIUM_BLOB: // should no appear over the wire - case MYSQL_TYPE_LONG_BLOB: // should no appear over the wire - case MYSQL_TYPE_BLOB: - { - if (charsetnr == MAGIC_BINARY_CHARSET_NR) { - return @"blobdata"; - } else { - return @"textdata"; - } - } - case MYSQL_TYPE_GEOMETRY: - return @"geometry"; - default: - return @"blobdata"; - - } -} - -/** - * Convert a mysql_charsetnr into a charset name as string - */ -- (NSString *)findCharsetName:(NSUInteger)charsetnr -{ - const OUR_CHARSET * c = our_charsets60; - - do { - if (c->nr == charsetnr) - return [self stringWithCString:c->name]; - ++c; - } while (c[0].nr != 0); - - return @"UNKNOWN"; -} - -/** - * Convert a mysql_charsetnr into a collation name as string - */ -- (NSString *)findCharsetCollation:(NSUInteger)charsetnr -{ - const OUR_CHARSET * c = our_charsets60; - - do { - if (c->nr == charsetnr) - return [self stringWithCString:c->collation]; - ++c; - } while (c[0].nr != 0); - - return @"UNKNOWN"; -} - -/** - * Return the max byte length to store a char by using - * a specific mysql_charsetnr - */ -- (NSUInteger)findCharsetMaxByteLengthPerChar:(NSUInteger)charsetnr -{ - const OUR_CHARSET * c = our_charsets60; - - do { - if (c->nr == charsetnr) - return c->char_maxlen; - ++c; - } while (c[0].nr != 0); - - return 1; -} - -#pragma mark - - -/** - * Do one really needs an explanation for this method? Which by the way you should not use... - */ -- (void) dealloc -{ - if (mResult) mysql_free_result(mResult); - if (mNames) [mNames release]; - if (mTimeZone) [mTimeZone release]; - - [super dealloc]; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPResultPlus.h b/Frameworks/MCPKit/MCPFoundationKit/MCPResultPlus.h deleted file mode 100644 index f161bd0c..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPResultPlus.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// $Id$ -// -// MCPResultPlus.h -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 03/06/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -#import "MCPResult.h" - -@interface MCPResult (MCPResultPlus) - -// Getting a complete column as an array -- (NSArray *)fetchColAtIndex:(NSUInteger)col; -- (NSArray *)fetchColWithName:(NSString *)colName; - -// Getting the complete result as 2D array -- (id)fetch2DResultAsType:(MCPReturnType)type; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPResultPlus.m b/Frameworks/MCPKit/MCPFoundationKit/MCPResultPlus.m deleted file mode 100644 index dbf9d070..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPResultPlus.m +++ /dev/null @@ -1,188 +0,0 @@ -// -// $Id$ -// -// MCPResultPlus.m -// MCPKit -// -// Created by Serge Cohen (serge.cohen@m4x.org) on 03/06/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://mysql-cocoa.sourceforge.net/> -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPResultPlus.h" - -/** - * This Category is provided to get shortcuts reformat the table obtained by a MCPResult - * (fetching a column, a 2D array...). - */ -@implementation MCPResult (MCPResultPlus) - -/** - * Getting a complete column into a NSArray (1D). The index starts from 0 (first column). - * - * The index 0 of the returned array always correspond to the first row (ie: returned NSArray is indexed - * by row number), the read position is restored after to it's initial position after the read. - */ -- (NSArray *)fetchColAtIndex:(NSUInteger)col -{ - NSMutableArray *theCol = [NSMutableArray arrayWithCapacity:(NSUInteger)[self numOfRows]]; - MYSQL_ROW_OFFSET thePosition; - NSArray *theRow; - - if ((mResult == NULL) || ([self numOfRows] == 0)) { - // If there is no results, returns nil. - return nil; - } - if (col >= mNumOfFields) { - // Bad column number - NSLog (@"The index : %ld is not within the range 0 - %ld\n", (long)col, (long)mNumOfFields); - return nil; - } - - thePosition = mysql_row_tell(mResult); - - [self dataSeek:0]; - - // One might want to have optimized code here. Maybe in later versions - while ((theRow = [self fetchRowAsType:MCPTypeArray])) - { - [theCol addObject:[theRow objectAtIndex:col]]; - } - - // Returning to the proper row - mysql_row_seek(mResult, thePosition); - - return [NSArray arrayWithArray:theCol]; -} - -/** - * The same as !{fetchColAtIndex:}, but the choice of the column is done by it's field name. Indeed it is just - * a wrapper to !{fetchColAtIndex}. - */ -- (NSArray *)fetchColWithName:(NSString *)colName -{ - NSUInteger theCol; - - if (mResult == NULL) { - // If there is no results, returns nil. - return nil; - } - - if (mNames == nil) { - [self fetchFieldNames]; - } - - if ([mNames indexOfObject:colName] == NSNotFound) { - NSLog(@"No column have been found with name : %@\n", colName); - return nil; - } - - theCol = [mNames indexOfObject:colName]; - - return [self fetchColAtIndex:theCol]; -} - -/** - * Returns the complete result table in a 2D object, which type depends on aType: - * - * - !{MCPTypeArray} : a NSArray of rows as NSArray, - * - * - !{MCPTypeDictionary} : a NSArray of rows as NSDictionary, - * - * - !{MCPTypeFlippedArray} : a NSArray of columns (as NSArray), - * - * - !{MCPTypeFlippedDictionary} : a NSDictionary of columns (as NSArray) - * - * In any case the read position is restored at the end of the call (hence a fetchRow will get the same row - * wether this method is called before it or not). - */ -- (id) fetch2DResultAsType:(MCPReturnType)type; -{ - id theTable, theVect; - MYSQL_ROW_OFFSET thePosition; - NSUInteger i; - - if (mResult == NULL) { - // If there is no results, returns nil. - return nil; - } - - thePosition = mysql_row_tell(mResult); - - [self dataSeek:0]; - - switch (type) - { - case MCPTypeArray : - theTable = [NSMutableArray arrayWithCapacity:(NSUInteger)[self numOfRows]]; - - while ((theVect = [self fetchRowAsArray])) - { - [theTable addObject:theVect]; - } - - theTable = [NSArray arrayWithArray:theTable]; - break; - case MCPTypeDictionary : - theTable = [NSMutableArray arrayWithCapacity:(NSUInteger)[self numOfRows]]; - - while ((theVect = [self fetchRowAsDictionary])) - { - [theTable addObject:theVect]; - } - - theTable = [NSArray arrayWithArray:theTable]; - break; - case MCPTypeFlippedArray : - theTable = [NSMutableArray arrayWithCapacity:mNumOfFields]; - - for (i=0; i<mNumOfFields; i++) - { - [theTable addObject:[self fetchColAtIndex:i]]; - } - - theTable = [NSArray arrayWithArray:theTable]; - break; - case MCPTypeFlippedDictionary : - theTable = [NSMutableDictionary dictionaryWithCapacity:mNumOfFields]; - - if (mNames == nil) { - [self fetchFieldNames]; - } - - for (i=0; i<mNumOfFields; i++) - { - [theTable setObject:[self fetchColAtIndex:i] forKey:[mNames objectAtIndex:i]]; - } - - theTable = [NSDictionary dictionaryWithDictionary:theTable]; - break; - default : - NSLog (@"Unknown MCPReturnType : %d; return nil\n", (int)type); - theTable = nil; - break; - } - - mysql_row_seek(mResult, thePosition); - - return theTable; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h deleted file mode 100644 index e8230fff..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.h +++ /dev/null @@ -1,74 +0,0 @@ -// -// $Id$ -// -// MCPStreamingResult.h -// sequel-pro -// -// Created by Rowan Beentje on Aug 16, 2009 -// Copyright 2009 Rowan Beentje. All rights reserved. -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -#import "MCPResult.h" -#import "mysql.h" - -@class MCPConnection; - -typedef struct SP_MYSQL_ROWS { - char *data; - unsigned long *dataLengths; - struct SP_MYSQL_ROWS *nextRow; -} LOCAL_ROW_DATA; - -@interface MCPStreamingResult : MCPResult -{ - MCPConnection *parentConnection; - - MYSQL_FIELD *fieldDefinitions; - - BOOL fullyStreaming; - BOOL connectionUnlocked; - BOOL dataDownloaded; - BOOL dataFreed; - - LOCAL_ROW_DATA *localDataStore; - LOCAL_ROW_DATA *currentDataStoreEntry; - LOCAL_ROW_DATA *localDataStoreLastEntry; - - unsigned long localDataRows; - unsigned long localDataAllocated; - unsigned long downloadedRowCount; - unsigned long processedRowCount; - unsigned long freedRowCount; - - pthread_mutex_t dataCreationLock; - pthread_mutex_t dataFreeLock; - - IMP isConnectedPtr; - SEL isConnectedSEL; -} - -- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)theTimeZone connection:(MCPConnection *)theConnection; -- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)theTimeZone connection:(MCPConnection *)theConnection withFullStreaming:(BOOL)useFullStreaming; - -// Results fetching -- (NSArray *)fetchNextRowAsArray; -- (void) cancelResultLoad; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m deleted file mode 100644 index bdb271fe..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m +++ /dev/null @@ -1,566 +0,0 @@ -// -// $Id$ -// -// MCPStreamingResult.m -// sequel-pro -// -// Created by Rowan Beentje on Aug 16, 2009 -// Copyright 2009 Rowan Beentje. All rights reserved. -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -#import "MCPStreamingResult.h" -#import "MCPConnection.h" -#import "MCPNull.h" -#import "MCPNumber.h" -#import "MCPGeometryData.h" - -/** - * IMPORTANT NOTE - * - * MCPStreamingResult can operate in two modes. The default mode is a safe implementation, - * which operates in a multithreaded fashion - a worker thread is set up to download the results as - * fast as possible in the background, while the results are made available via a blocking (and so - * single-thread-compatible) fetchNextRowAsArray call. This provides the benefit of allowing a progress - * bar to be shown during downloads, and threaded processing, but still has reasonable memory usage for - * the downloaded result - and won't block the server. - * Alternatively, withFullStreaming: can be set to YES, in which case each row will be accessed on-demand; - * this can be dangerous as it means a SELECT will tie up the server for longer, as for MyISAM tables - * updates (and subsequent reads) must block while a SELECT is still running. However this can be useful - * for certain processes such as working with very large tables to keep memory usage low. - */ - - -@interface MCPStreamingResult (PrivateAPI) - -void _bytes2bin(Byte *n, NSUInteger nbytes, NSUInteger len, char *buf); - -- (void) _downloadAllData; -- (void) _freeAllDataWhenDone; - -@end - -@implementation MCPStreamingResult : MCPResult - -#pragma mark - -#pragma mark Setup and teardown - -/** - * Initialise a MCPStreamingResult in the same way as MCPResult - as used - * internally by the MCPConnection !{queryString:} method. - */ -- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)theTimeZone connection:(MCPConnection *)theConnection -{ - return [self initWithMySQLPtr:mySQLPtr encoding:theEncoding timeZone:theTimeZone connection:theConnection withFullStreaming:NO]; -} - -/** - * Master initialisation method, allowing selection of either full streaming or safe streaming - * (see "important note" above) - */ -- (id)initWithMySQLPtr:(MYSQL *)mySQLPtr encoding:(NSStringEncoding)theEncoding timeZone:(NSTimeZone *)theTimeZone connection:(MCPConnection *)theConnection withFullStreaming:(BOOL)useFullStreaming -{ - if ((self = [super init])) { - mEncoding = theEncoding; - mTimeZone = [theTimeZone retain]; - parentConnection = theConnection; - fullyStreaming = useFullStreaming; - connectionUnlocked = NO; - - if (mResult) { - mysql_free_result(mResult); - mResult = NULL; - } - - if (mNames) { - [mNames release]; - mNames = nil; - } - - mResult = mysql_use_result(mySQLPtr); - - if (mResult) { - mNumOfFields = mysql_num_fields(mResult); - fieldDefinitions = mysql_fetch_fields(mResult); - } else { - mNumOfFields = 0; - } - - // Obtain SEL references and pointer - isConnectedSEL = @selector(isConnected); - isConnectedPtr = [parentConnection methodForSelector:isConnectedSEL]; - - // If the result is opened in download-data-fast safe mode, set up the additional variables - // and threads required. - if (!fullyStreaming) { - dataDownloaded = NO; - dataFreed = NO; - localDataStore = NULL; - currentDataStoreEntry = NULL; - localDataStoreLastEntry = NULL; - localDataRows = 0; - localDataAllocated = 0; - downloadedRowCount = 0; - processedRowCount = 0; - freedRowCount = 0; - pthread_mutex_init(&dataCreationLock, NULL); - pthread_mutex_init(&dataFreeLock, NULL); - - // Start the data download thread - [NSThread detachNewThreadSelector:@selector(_downloadAllData) toTarget:self withObject:nil]; - - // Start the data freeing thread - [NSThread detachNewThreadSelector:@selector(_freeAllDataWhenDone) toTarget:self withObject:nil]; - } - } - - return self; -} - -/** - * Deallocate the result and unlock the parent connection for further use - */ -- (void) dealloc -{ - [self cancelResultLoad]; //this should close the connection if it is still open - - if (!connectionUnlocked) { - //this should NEVER happen - NSLog(@"MCPStreamingResult: The connection has not been unlocked."); - [parentConnection unlockConnection]; - } - - if (!fullyStreaming) { - pthread_mutex_destroy(&dataFreeLock); - pthread_mutex_destroy(&dataCreationLock); - } - - [super dealloc]; -} - -#pragma mark - -#pragma mark Results fetching - -/** - * Retrieve the next row of the result as an array. Should be called in a loop - * until nil is returned to ensure all the results have been retrieved. - */ -- (NSArray *)fetchNextRowAsArray -{ - MYSQL_ROW theRow; - char *theRowData, *buf; - unsigned long *fieldLengths; - NSUInteger i, copiedDataLength; - NSMutableArray *returnArray; - - // Retrieve the next row according to the mode this result set is in. - // If fully streaming, retrieve the MYSQL_ROW - if (fullyStreaming) { - theRow = mysql_fetch_row(mResult); - - // If no data was returned, we're at the end of the result set - unlock the connection and return nil - if (theRow == NULL) { - if (!connectionUnlocked) { - [parentConnection unlockConnection]; - connectionUnlocked = YES; - } - return nil; - } - - // Retrieve the lengths of the returned data - fieldLengths = mysql_fetch_lengths(mResult); - - // If in cached-streaming/fast download mode, get a reference to the data for the current row - } else { - copiedDataLength = 0; - - // Lock the data mutex - pthread_mutex_lock(&dataCreationLock); - - // Check to see whether we need to wait for the data to be availabe - // - if so, wait 1ms before checking again. - while (!dataDownloaded && processedRowCount == downloadedRowCount) { - pthread_mutex_unlock(&dataCreationLock); - usleep(1000); - pthread_mutex_lock(&dataCreationLock); - } - - // If all rows have been processed, we're at the end of the result set - return nil - // once all memory has been freed - if (processedRowCount == downloadedRowCount) { - pthread_mutex_unlock(&dataCreationLock); - - while (!dataFreed) usleep(1000); - - // Update the connection's error statuses in case of error during content download - [parentConnection updateErrorStatuses]; - - return nil; - } - - // Retrieve a reference to the data and the associated lengths - theRowData = currentDataStoreEntry->data; - fieldLengths = currentDataStoreEntry->dataLengths; - - // Unlock the data mutex - pthread_mutex_unlock(&dataCreationLock); - } - - // Initialise the array to return - returnArray = [NSMutableArray arrayWithCapacity:mNumOfFields]; - for (i = 0; i < mNumOfFields; i++) { - id cellData = nil; - char *theData = NULL; - - // In fully streaming mode, get a reference to the data for the MYSQL_ROW - if (fullyStreaming) { - if (theRow[i] == NULL) { - cellData = [NSNull null]; - } else { - theData = theRow[i]; - } - - // In cached-streaming mode, use a reference to the downloaded data - } else { - if (fieldLengths[i] == NSNotFound) { - cellData = [NSNull null]; - } else { - theData = theRowData+copiedDataLength; - copiedDataLength += fieldLengths[i] + 1; - } - } - - // If the data hasn't already been detected as NULL - in which case it will have been - // set to NSNull - process the data by type - - if (cellData == nil) { - switch (fieldDefinitions[i].type) { - case FIELD_TYPE_TINY: - case FIELD_TYPE_SHORT: - case FIELD_TYPE_INT24: - case FIELD_TYPE_LONG: - case FIELD_TYPE_LONGLONG: - case FIELD_TYPE_DECIMAL: - case FIELD_TYPE_NEWDECIMAL: - case FIELD_TYPE_FLOAT: - case FIELD_TYPE_DOUBLE: - case FIELD_TYPE_TIMESTAMP: - case FIELD_TYPE_DATE: - case FIELD_TYPE_TIME: - case FIELD_TYPE_DATETIME: - case FIELD_TYPE_YEAR: - case FIELD_TYPE_VAR_STRING: - case FIELD_TYPE_STRING: - case FIELD_TYPE_SET: - case FIELD_TYPE_ENUM: - case FIELD_TYPE_NEWDATE: // Don't know what the format for this type is... - - // For fields of type BINARY/VARBINARY, return the data. Also add an extra check to make - // sure it's binary data (seems that it's returned as type STRING) to get around a MySQL - // bug (#28214) returning DATE fields with the binary flag set. - if ((fieldDefinitions[i].flags & BINARY_FLAG) && - (fieldDefinitions[i].type == FIELD_TYPE_STRING || fieldDefinitions[i].type == FIELD_TYPE_VAR_STRING)) - { - cellData = [NSData dataWithBytes:theData length:fieldLengths[i]]; - } - // For string data, convert to text - else { - cellData = [[[NSString alloc] initWithBytes:theData length:fieldLengths[i] encoding:mEncoding] autorelease]; - } - - break; - - case FIELD_TYPE_BIT: - // Get a binary representation of the data - - buf = malloc(fieldDefinitions[i].length + 1); - _bytes2bin((Byte *)theData, fieldLengths[i], fieldDefinitions[i].length, buf); - - cellData = (theData != NULL) ? [NSString stringWithUTF8String:buf] : @""; - - free(buf); - break; - - case FIELD_TYPE_TINY_BLOB: - case FIELD_TYPE_BLOB: - case FIELD_TYPE_MEDIUM_BLOB: - case FIELD_TYPE_LONG_BLOB: - - // For binary data, return the data if force-return-as-string is not enabled - if ((fieldDefinitions[i].flags & BINARY_FLAG) && !mReturnDataAsStrings) { - cellData = [NSData dataWithBytes:theData length:fieldLengths[i]]; - } - else { - cellData = [[NSString alloc] initWithBytes:theData length:fieldLengths[i] encoding:mEncoding]; - - if (cellData) [cellData autorelease]; - } - - break; - - case FIELD_TYPE_NULL: - cellData = [NSNull null]; - break; - - case FIELD_TYPE_GEOMETRY: - cellData = [MCPGeometryData dataWithBytes:theData length:fieldLengths[i]]; - break; - - default: - NSLog(@"in fetchNextRowAsArray : Unknown type : %d for column %lu, sending back a NSData object", (int)fieldDefinitions[i].type, (unsigned long)i); - cellData = [NSData dataWithBytes:theData length:fieldLengths[i]]; - break; - } - - // If a creator returned a nil object, replace with NSNull - if (cellData == nil) cellData = [NSNull null]; - } - - [returnArray insertObject:cellData atIndex:i]; - } - - // If in cached-streaming mode, update the current entry processed count - if (!fullyStreaming) { - - // Lock both mutexes - pthread_mutex_lock(&dataCreationLock); - pthread_mutex_lock(&dataFreeLock); - - // Update the active-data pointer to the next item in the list, or set to NULL if no more items - currentDataStoreEntry = currentDataStoreEntry->nextRow; - - // Increment counter - processedRowCount++; - - // Unlock both mutexes - pthread_mutex_unlock(&dataCreationLock); - pthread_mutex_unlock(&dataFreeLock); - } - - return returnArray; -} - -/* - * Ensure the result set is fully processed and freed without any processing - * This method ensures that the connection is unlocked. - */ -- (void) cancelResultLoad -{ - MYSQL_ROW theRow; - - // Loop through all the rows and ensure the rows are fetched. - // If fully streaming, loop through the rows directly - if (fullyStreaming) { - while (1) { - theRow = mysql_fetch_row(mResult); - - // If no data was returned, we're at the end of the result set - return. - if (theRow == NULL) { - if (!connectionUnlocked) { - [parentConnection unlockConnection]; - connectionUnlocked = YES; - } - return; - } - } - - // If in cached-streaming/fast download mode, loop until all data is fetched and freed - } else { - - while (1) { - - // Check to see whether we need to wait for the data to be available - // - if so, wait 1ms before checking again - while (!dataDownloaded && processedRowCount == downloadedRowCount) usleep(1000); - - // If all rows have been processed, we're at the end of the result set - return - // once all memory has been freed - if (processedRowCount == downloadedRowCount) { - while (!dataFreed) usleep(1000); - // we don't need to unlock the connection because - // the data loading thread already did that - return; - } - processedRowCount++; - } - } -} - -#pragma mark - -#pragma mark Overrides for safety - -/** - * If numOfRows is used before the data is fully downloaded, -1 will be returned; - * otherwise the number of rows is returned. - */ -- (my_ulonglong)numOfRows -{ - if (!dataDownloaded) return -1; - - return downloadedRowCount; -} - -- (void)dataSeek:(my_ulonglong) row -{ - NSLog(@"dataSeek cannot be used with streaming results"); -} - -@end - -@implementation MCPStreamingResult (PrivateAPI) - -/** - * Provides a binary representation of the supplied chars (n) in the supplied buffer (buf). The resulting - * binary representation will be zero-padded according to the supplied field length (len). - */ -void _bytes2bin(Byte *n, NSUInteger nbytes, NSUInteger len, char *buf) -{ - - // NSUInteger i = 0; - // nbytes--; - // while (++i <= len) - // buf[len - i] = ( (n[nbytes - (i >> 3)] >> (i & 0x7)) & 1 ) ? '1' : '0'; - // - // buf[len] = '\0'; - // ↑ why does this code not working anymore? - - NSUInteger i = 0; - nbytes--; - len--; - while (i <= len) - buf[len - i++] = ( (n[nbytes - (i >> 3)] >> (i & 0x7)) & 1 ) ? '1' : '0'; - - buf[len+1] = '\0'; - -} - -/** - * Used internally to download results in a background thread - */ -- (void)_downloadAllData -{ - NSAutoreleasePool *downloadPool = [[NSAutoreleasePool alloc] init]; - MYSQL_ROW theRow; - unsigned long *fieldLengths; - NSUInteger i, dataCopiedLength, rowDataLength; - LOCAL_ROW_DATA *newRowStore; - - size_t sizeOfLocalRowData = sizeof(LOCAL_ROW_DATA); - size_t sizeOfDataLengths = (size_t)(sizeof(unsigned long) * mNumOfFields); - - // Loop through the rows until the end of the data is reached - indicated via a NULL - while ((*isConnectedPtr)(parentConnection, isConnectedSEL) && (theRow = mysql_fetch_row(mResult))) { - - // Retrieve the lengths of the returned data - fieldLengths = mysql_fetch_lengths(mResult); - rowDataLength = 0; - dataCopiedLength = 0; - for (i = 0; i < mNumOfFields; i++) - rowDataLength += fieldLengths[i]; - - // Initialise memory for the row and set a NULL pointer for the next item - newRowStore = malloc(sizeOfLocalRowData); - newRowStore->nextRow = NULL; - - // Set up the row data store - a char* - and copy in the data if there is any, - // using a null terminator for each field boundary for easier data processing later - newRowStore->data = malloc(sizeof(char) * (rowDataLength + mNumOfFields)); - for (i = 0; i < mNumOfFields; i++) { - if (theRow[i] != NULL) { - memcpy(newRowStore->data+dataCopiedLength, theRow[i], fieldLengths[i]); - newRowStore->data[dataCopiedLength+fieldLengths[i]] = '\0'; - dataCopiedLength += fieldLengths[i] + 1; - } else { - fieldLengths[i] = NSNotFound; - } - } - - // Set up and copy in the field lengths - newRowStore->dataLengths = memcpy(malloc(sizeOfDataLengths), fieldLengths, sizeOfDataLengths); - - // Lock both mutexes - pthread_mutex_lock(&dataCreationLock); - pthread_mutex_lock(&dataFreeLock); - - // Add the newly allocated row to end of the storage linked list - if (localDataStore) { - localDataStoreLastEntry->nextRow = newRowStore; - } else { - localDataStore = newRowStore; - } - localDataStoreLastEntry = newRowStore; - if (!currentDataStoreEntry) currentDataStoreEntry = newRowStore; - - // Update the downloaded row count - downloadedRowCount++; - - // Unlock both mutexes - pthread_mutex_unlock(&dataCreationLock); - pthread_mutex_unlock(&dataFreeLock); - } - - // Unlock the parent connection now data has been retrieved - [parentConnection unlockConnection]; - connectionUnlocked = YES; - - dataDownloaded = YES; - [downloadPool drain]; -} - -/** - * Used internally to free data which has been fully processed; done in a thread to allow - * fetchNextRowAsArray to be faster. - */ -- (void) _freeAllDataWhenDone -{ - NSAutoreleasePool *dataFreeingPool = [[NSAutoreleasePool alloc] init]; - - while (!dataDownloaded || freedRowCount != downloadedRowCount) { - - // Lock the data free mutex - pthread_mutex_lock(&dataFreeLock); - - // If the freed row count matches the processed row count, wait before retrying - if (freedRowCount == processedRowCount) { - pthread_mutex_unlock(&dataFreeLock); - usleep(1000); - continue; - } - - // Free a single item off the bottom of the list - // Update the data pointer to the next item in the list, or set to NULL if no more items - LOCAL_ROW_DATA *rowToRemove = localDataStore; - localDataStore = localDataStore->nextRow; - - // Free memory for the first row - rowToRemove->nextRow = NULL; - free(rowToRemove->dataLengths); - if (rowToRemove->data != NULL) free(rowToRemove->data); - free(rowToRemove); - - // Increment the counter - freedRowCount++; - - // Unlock the data free mutex - pthread_mutex_unlock(&dataFreeLock); - } - - dataFreed = YES; - [dataFreeingPool drain]; -} - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h b/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h deleted file mode 100644 index bf57b789..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// $Id$ -// -// MCPStringAdditions.h -// sequel-pro -// -// Created by Stuart Connolly (stuconnolly.com) on March 25, 2010 -// Copyright (c) 2010 Stuart Connolly. All rights reserved. -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -#import <Foundation/Foundation.h> - -/** - * NSStringDataUsingLossyEncoding(aStr, enc, lossy) := [aStr dataUsingEncoding:enc allowLossyConversion:lossy] - */ -static inline NSData *NSStringDataUsingLossyEncoding(NSString *self, NSInteger encoding, NSInteger lossy) -{ - typedef NSData *(*SPStringDataUsingLossyEncodingMethodPtr)(NSString*, SEL, NSInteger, NSInteger); - static SPStringDataUsingLossyEncodingMethodPtr SPNSStringDataUsingLossyEncoding; - - if (!SPNSStringDataUsingLossyEncoding) SPNSStringDataUsingLossyEncoding = (SPStringDataUsingLossyEncodingMethodPtr)[self methodForSelector:@selector(dataUsingEncoding:allowLossyConversion:)]; - - return SPNSStringDataUsingLossyEncoding(self, @selector(dataUsingEncoding:allowLossyConversion:), encoding, lossy); -} - -@interface NSString (MCPStringAdditions) - -- (NSString *)backtickQuotedString; -- (NSString *)tickQuotedString; - -@end diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m deleted file mode 100644 index bd5b06cd..00000000 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPStringAdditions.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// $Id$ -// -// MCPStringAdditions.m -// sequel-pro -// -// Created by Stuart Connolly (stuconnolly.com) on March 25, 2010 -// Copyright (c) 2010 Stuart Connolly. All rights reserved. -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - - - -@implementation NSString (MCPStringAdditions) - -/** - * Returns the string quoted with backticks as required for MySQL identifiers - * eg.: tablename => `tablename` - * my`table => `my``table` - */ -- (NSString *)backtickQuotedString -{ - return [NSString stringWithFormat: @"`%@`", [self stringByReplacingOccurrencesOfString:@"`" withString:@"``"]]; -} - -/** - * Returns the string quoted with ticks as required for MySQL identifiers - * eg.: tablename => 'tablename' - * my'table => 'my''table' - */ -- (NSString *)tickQuotedString -{ - return [NSString stringWithFormat: @"'%@'", [self stringByReplacingOccurrencesOfString:@"'" withString:@"''"]]; -} - -@end diff --git a/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a b/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a Binary files differdeleted file mode 100644 index 969697fb..00000000 --- a/Frameworks/MCPKit/MySQL/lib/libmysqlclient.a +++ /dev/null diff --git a/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a b/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a Binary files differdeleted file mode 100644 index 3c8d05fd..00000000 --- a/Frameworks/MCPKit/MySQL/lib/libmysqlclient_r.a +++ /dev/null diff --git a/Frameworks/MCPKit/Support files/NSNotificationAdditions.h b/Frameworks/MCPKit/Support files/NSNotificationAdditions.h deleted file mode 100644 index 82777ebb..00000000 --- a/Frameworks/MCPKit/Support files/NSNotificationAdditions.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// $Id: NSNotificationAdditions.h 2045 2010-03-31 18:01:50Z stuart02 $ -// -// NSNotificationAdditions.h -// sequel-pro -// -// Copied from the Colloquy project; original code available from Trac at -// http://colloquy.info/project/browser/trunk/Additions/NSNotificationAdditions.h -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -@interface NSNotificationCenter (NSNotificationCenterAdditions) - -- (void)postNotificationOnMainThread:(NSNotification *)aNotification; -- (void)postNotificationOnMainThread:(NSNotification *)aNotification waitUntilDone:(BOOL)shouldWaitUntilDone; - -- (void)postNotificationOnMainThreadWithName:(NSString *)aName object:(id)anObject; -- (void)postNotificationOnMainThreadWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; -- (void)postNotificationOnMainThreadWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo waitUntilDone:(BOOL)shouldWaitUntilDone; - -@end diff --git a/Frameworks/MCPKit/Support files/NSNotificationAdditions.m b/Frameworks/MCPKit/Support files/NSNotificationAdditions.m deleted file mode 100644 index 91b8134d..00000000 --- a/Frameworks/MCPKit/Support files/NSNotificationAdditions.m +++ /dev/null @@ -1,97 +0,0 @@ -// -// $Id: NSNotificationAdditions.m 2045 2010-03-31 18:01:50Z stuart02 $ -// -// NSNotificationAdditions.m -// sequel-pro -// -// Copied from the Colloquy project; original code available from Trac at -// http://colloquy.info/project/browser/trunk/Additions/NSNotificationAdditions.m -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// More info at <http://code.google.com/p/sequel-pro/> - -#import "NSNotificationAdditions.h" -#import "pthread.h" - -@interface NSNotificationCenter (NSNotificationCenterAdditions_PrivateAPI) -+ (void)_postNotification:(NSNotification *)aNotification; -+ (void)_postNotificationWithDetails:(NSDictionary *)anInfoDictionary; -@end - -@implementation NSNotificationCenter (NSNotificationCenterAdditions) - -- (void)postNotificationOnMainThread:(NSNotification *)aNotification -{ - if (pthread_main_np()) return [self postNotification:aNotification]; - - [self performSelectorOnMainThread:@selector(_postNotification:) withObject:aNotification waitUntilDone:NO]; -} - -- (void)postNotificationOnMainThread:(NSNotification *)aNotification waitUntilDone:(BOOL)shouldWaitUntilDone -{ - if (pthread_main_np()) return [self postNotification:aNotification]; - - [self performSelectorOnMainThread:@selector(_postNotification:) withObject:aNotification waitUntilDone:shouldWaitUntilDone]; -} - -- (void)postNotificationOnMainThreadWithName:(NSString *)aName object:(id)anObject -{ - if (pthread_main_np()) return [self postNotificationName:aName object:anObject userInfo:nil]; - - [self postNotificationOnMainThreadWithName:aName object:anObject userInfo:nil waitUntilDone:NO]; -} - -- (void)postNotificationOnMainThreadWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo -{ - if(pthread_main_np()) return [self postNotificationName:aName object:anObject userInfo:aUserInfo]; - - [self postNotificationOnMainThreadWithName:aName object:anObject userInfo:aUserInfo waitUntilDone:NO]; -} - -- (void)postNotificationOnMainThreadWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo waitUntilDone:(BOOL)shouldWaitUntilDone -{ - if (pthread_main_np()) return [self postNotificationName:aName object:anObject userInfo:aUserInfo]; - - NSMutableDictionary *info = [[NSMutableDictionary allocWithZone:nil] initWithCapacity:3]; - - if (aName) [info setObject:aName forKey:@"name"]; - if (anObject) [info setObject:anObject forKey:@"object"]; - if (aUserInfo) [info setObject:aUserInfo forKey:@"userInfo"]; - - [[self class] performSelectorOnMainThread:@selector(_postNotificationWithDetails:) withObject:info waitUntilDone:shouldWaitUntilDone]; -} - -@end - -@implementation NSNotificationCenter (NSNotificationCenterAdditions_PrivateAPI) - -+ (void)_postNotification:(NSNotification *)aNotification -{ - [[self defaultCenter] postNotification:aNotification]; -} - -+ (void)_postNotificationWithDetails:(NSDictionary *)anInfoDictionary -{ - NSString *name = [anInfoDictionary objectForKey:@"name"]; - id object = [anInfoDictionary objectForKey:@"object"]; - NSDictionary *userInfo = [anInfoDictionary objectForKey:@"userInfo"]; - - [[self defaultCenter] postNotificationName:name object:object userInfo:userInfo]; - - [anInfoDictionary release]; -} - -@end diff --git a/Frameworks/SPMySQLFramework/English.lproj/InfoPlist.strings b/Frameworks/SPMySQLFramework/English.lproj/InfoPlist.strings new file mode 100644 index 00000000..88f65cf6 --- /dev/null +++ b/Frameworks/SPMySQLFramework/English.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Frameworks/MCPKit/MySQL/include/my_alloc.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/my_alloc.h index 93b7438a..93b7438a 100644 --- a/Frameworks/MCPKit/MySQL/include/my_alloc.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/my_alloc.h diff --git a/Frameworks/MCPKit/MySQL/include/my_list.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/my_list.h index 775b5658..775b5658 100644 --- a/Frameworks/MCPKit/MySQL/include/my_list.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/my_list.h diff --git a/Frameworks/MCPKit/MySQL/include/mysql.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql.h index 699bd1f1..da477278 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2000-2003 MySQL AB +/* + Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -11,7 +12,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ /* This file defines the client API to MySQL and also the ABI of the diff --git a/Frameworks/MCPKit/MySQL/include/mysql_com.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_com.h index 357519d5..357519d5 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql_com.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_com.h diff --git a/Frameworks/MCPKit/MySQL/include/mysql_embed.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_embed.h index a7d6e610..e3318864 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql_embed.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_embed.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2000 MySQL AB +/* + Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -11,7 +12,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ /* Defines that are unique to the embedded version of MySQL */ diff --git a/Frameworks/MCPKit/MySQL/include/mysql_time.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_time.h index 0a3f17a8..0a3f17a8 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql_time.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_time.h diff --git a/Frameworks/MCPKit/MySQL/include/mysql_version.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_version.h index 1eba2ede..dc8c5b3f 100644 --- a/Frameworks/MCPKit/MySQL/include/mysql_version.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/mysql_version.h @@ -9,11 +9,11 @@ #include <custom_conf.h> #else #define PROTOCOL_VERSION 10 -#define MYSQL_SERVER_VERSION "5.1.57" +#define MYSQL_SERVER_VERSION "5.1.61" #define MYSQL_BASE_VERSION "mysqld-5.1" #define MYSQL_SERVER_SUFFIX_DEF "" #define FRM_VER 6 -#define MYSQL_VERSION_ID 50157 +#define MYSQL_VERSION_ID 50161 #define MYSQL_PORT 3306 #define MYSQL_PORT_DEFAULT 0 #define MYSQL_UNIX_ADDR "/tmp/mysql.sock" diff --git a/Frameworks/MCPKit/MySQL/include/typelib.h b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/typelib.h index 46106d1b..46106d1b 100644 --- a/Frameworks/MCPKit/MySQL/include/typelib.h +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/include/typelib.h diff --git a/Frameworks/SPMySQLFramework/MySQL Client Libraries/lib/libmysqlclient.a b/Frameworks/SPMySQLFramework/MySQL Client Libraries/lib/libmysqlclient.a Binary files differnew file mode 100644 index 00000000..5b7d405a --- /dev/null +++ b/Frameworks/SPMySQLFramework/MySQL Client Libraries/lib/libmysqlclient.a diff --git a/Frameworks/SPMySQLFramework/Readme.txt b/Frameworks/SPMySQLFramework/Readme.txt new file mode 100644 index 00000000..de828890 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Readme.txt @@ -0,0 +1,44 @@ +The SPMySQL Framework is intended to provide a stable MySQL connection framework, with the ability to run text-based queries and rapidly retrieve result sets with conversion from MySQL data types to Cocoa objects. + +SPMySQL.framework has an interface loosely based around that provided by MCPKit by Serge Cohen and Bertrand Mansion (http://mysql-cocoa.sourceforge.net/), and in particular the heavily modified Sequel Pro version (http://www.sequelpro.com/). It is a full rewrite of the original framework, although it includes code from patches implementing the following Sequel Pro functionality, largely contributed by Hans-Jörg Bibiko, Stuart Connolly, Jakob Egger, and Rowan Beentje: + - Connection locking (Jakob et al) + - Ping & keepalive (Rowan et al) + - Query cancellation (Rowan et al) + - Delegate setup (Stuart et al) + - SSL support (Rowan et al) + - Connection checking (Rowan et al) + - Version state (Stuart et al) + - Maximum packet size control (Hans et al) + - Result multithreading and streaming (Rowan et al) + - Improved encoding support & switching (Rowan et al) + - Database structure; moved to inside the app (Hans et al) + - Query reattempts and error-handling approach (Rowan et al) + - Geometry result class (Hans et al) + - Connection proxy (Stuart et al) + + +INTEGRATION + +SPMySQL.framework can be added to your project as a standard Cocoa framework, or the entire project can be added as a subproject in Xcode. +To add as a subproject in Xcode: + 1) Add the SPMySQL framework's .xcodeproj to your current project + 2) Choose an existing target, Get Info, and under direct dependenies add a new dependency. Choose the SPMySQL.framework target from the sub-project + 3) Expand the subproject to see its child target - SPMySQL.framework. Drag this to the "Link Binary With Libraries" build phase of any targets using the framework. + 4) If you don't have a Copy Frameworks phase, add one; drag the SPMySQL.framework child target to this phase. + 5) In your build settings, add a User Header Search Path; make it a recursive path to the SPMySQL project folder location (for example ${PROJECT_DIR}/Frameworks/SPMySQLFramework). This should allow you to #include "SPMySQL.h" and have everything function. + +As a last resort jump onto IRC and join #sequel-pro on irc.freenode.net and any of the +developers will be more than happy to help you out. + + +LICENSE + +Copyright (c) 2012 Rowan Beentje (rowan.beent.je) and the Sequel Pro team. + +The SPMySQL framework is offered under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Resources/Info.plist b/Frameworks/SPMySQLFramework/Resources/Info.plist new file mode 100644 index 00000000..392b428f --- /dev/null +++ b/Frameworks/SPMySQLFramework/Resources/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundleIdentifier</key> + <string>com.yourcompany.${PRODUCT_NAME:rfc1034Identifier}</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundlePackageType</key> + <string>FMWK</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleSignature</key> + <string>SPDT</string> + <key>CFBundleVersion</key> + <string>1</string> + <key>NSPrincipalClass</key> + <string></string> +</dict> +</plist> diff --git a/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj b/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj new file mode 100644 index 00000000..933a68b7 --- /dev/null +++ b/Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj/project.pbxproj @@ -0,0 +1,679 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 580A331E14D75CF7000D6933 /* SPMySQLGeometryData.h in Headers */ = {isa = PBXBuildFile; fileRef = 580A331C14D75CF7000D6933 /* SPMySQLGeometryData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 580A331F14D75CF7000D6933 /* SPMySQLGeometryData.m in Sources */ = {isa = PBXBuildFile; fileRef = 580A331D14D75CF7000D6933 /* SPMySQLGeometryData.m */; }; + 58428E0014BA5FAE000F8438 /* SPMySQLConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 58428DFE14BA5FAE000F8438 /* SPMySQLConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58428E0114BA5FAE000F8438 /* SPMySQLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 58428DFF14BA5FAE000F8438 /* SPMySQLConnection.m */; }; + 5842929F14C34B36000F8438 /* my_alloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929414C34B36000F8438 /* my_alloc.h */; settings = {ATTRIBUTES = (); }; }; + 584292A014C34B36000F8438 /* my_list.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929514C34B36000F8438 /* my_list.h */; settings = {ATTRIBUTES = (); }; }; + 584292A114C34B36000F8438 /* mysql.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929614C34B36000F8438 /* mysql.h */; }; + 584292A214C34B36000F8438 /* mysql_com.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929714C34B36000F8438 /* mysql_com.h */; }; + 584292A314C34B36000F8438 /* mysql_embed.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929814C34B36000F8438 /* mysql_embed.h */; }; + 584292A414C34B36000F8438 /* mysql_time.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929914C34B36000F8438 /* mysql_time.h */; }; + 584292A514C34B36000F8438 /* mysql_version.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929A14C34B36000F8438 /* mysql_version.h */; }; + 584292A614C34B36000F8438 /* typelib.h in Headers */ = {isa = PBXBuildFile; fileRef = 5842929B14C34B36000F8438 /* typelib.h */; }; + 584292A714C34B36000F8438 /* libmysqlclient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5842929D14C34B36000F8438 /* libmysqlclient.a */; }; + 584294E414CB8002000F8438 /* SPMySQLConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 584294E314CB8002000F8438 /* SPMySQLConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 584294F014CB8002000F8438 /* Ping & KeepAlive.h in Headers */ = {isa = PBXBuildFile; fileRef = 584294EE14CB8002000F8438 /* Ping & KeepAlive.h */; }; + 584294F114CB8002000F8438 /* Ping & KeepAlive.m in Sources */ = {isa = PBXBuildFile; fileRef = 584294EF14CB8002000F8438 /* Ping & KeepAlive.m */; }; + 584294F614CB8002000F8438 /* Querying & Preparation.h in Headers */ = {isa = PBXBuildFile; fileRef = 584294F414CB8002000F8438 /* Querying & Preparation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 584294FA14CB8002000F8438 /* Encoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 584294F814CB8002000F8438 /* Encoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 584294FB14CB8002000F8438 /* Encoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 584294F914CB8002000F8438 /* Encoding.m */; }; + 584294FE14CB8002000F8438 /* Server Info.h in Headers */ = {isa = PBXBuildFile; fileRef = 584294FC14CB8002000F8438 /* Server Info.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 584294FF14CB8002000F8438 /* Server Info.m in Sources */ = {isa = PBXBuildFile; fileRef = 584294FD14CB8002000F8438 /* Server Info.m */; }; + 586A99FB14F02E21007F82BF /* SPMySQLStreamingResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 586A99F914F02E21007F82BF /* SPMySQLStreamingResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 586A99FC14F02E21007F82BF /* SPMySQLStreamingResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 586A99FA14F02E21007F82BF /* SPMySQLStreamingResult.m */; }; + 586AA16714F30C5F007F82BF /* Convenience Methods.h in Headers */ = {isa = PBXBuildFile; fileRef = 586AA16514F30C5F007F82BF /* Convenience Methods.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 586AA16814F30C5F007F82BF /* Convenience Methods.m in Sources */ = {isa = PBXBuildFile; fileRef = 586AA16614F30C5F007F82BF /* Convenience Methods.m */; }; + 586AA81414F6C648007F82BF /* SPMySQLArrayAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 586AA81214F6C648007F82BF /* SPMySQLArrayAdditions.h */; }; + 5884127714CC63830078027F /* SPMySQL.h in Headers */ = {isa = PBXBuildFile; fileRef = 5884127614CC63830078027F /* SPMySQL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 588412A814CC7A4D0078027F /* Locking.h in Headers */ = {isa = PBXBuildFile; fileRef = 588412A614CC7A4D0078027F /* Locking.h */; }; + 5884133C14CCEC6B0078027F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5884133B14CCEC6B0078027F /* libz.dylib */; }; + 5884142714CCF5190078027F /* Conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 5884142514CCF5190078027F /* Conversion.h */; }; + 5884142814CCF5190078027F /* Conversion.m in Sources */ = {isa = PBXBuildFile; fileRef = 5884142614CCF5190078027F /* Conversion.m */; }; + 588414BD14CE3B110078027F /* SPMySQLConnectionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 588414BC14CE3B110078027F /* SPMySQLConnectionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5884159414D1A6760078027F /* Locking.m in Sources */ = {isa = PBXBuildFile; fileRef = 588412A714CC7A4D0078027F /* Locking.m */; }; + 5884159514D1A6880078027F /* Querying & Preparation.m in Sources */ = {isa = PBXBuildFile; fileRef = 584294F514CB8002000F8438 /* Querying & Preparation.m */; }; + 5884165514D2306A0078027F /* SPMySQLResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 5884165314D2306A0078027F /* SPMySQLResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5884165614D2306A0078027F /* SPMySQLResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 5884165414D2306A0078027F /* SPMySQLResult.m */; }; + 58C006C814E0B18A00AC489A /* SPMySQLUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C006C714E0B18A00AC489A /* SPMySQLUtilities.h */; }; + 58C008CD14E2AC7D00AC489A /* SPMySQLConnectionProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C008CC14E2AC7D00AC489A /* SPMySQLConnectionProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58C009D514E31D3800AC489A /* SPMySQLStringAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C009D314E31D3800AC489A /* SPMySQLStringAdditions.h */; }; + 58C009D614E31D3800AC489A /* SPMySQLStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C009D414E31D3800AC489A /* SPMySQLStringAdditions.m */; }; + 58C00AA914E4869C00AC489A /* Max Packet Size.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C00AA714E4869C00AC489A /* Max Packet Size.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58C00AAA14E4869C00AC489A /* Max Packet Size.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C00AA814E4869C00AC489A /* Max Packet Size.m */; }; + 58C00AB514E4892E00AC489A /* Delegate & Proxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C00AB314E4892E00AC489A /* Delegate & Proxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58C00AB614E4892E00AC489A /* Delegate & Proxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C00AB414E4892E00AC489A /* Delegate & Proxy.m */; }; + 58C00ADA14E4959A00AC489A /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58C00AD914E4959A00AC489A /* SystemConfiguration.framework */; }; + 58C00BD114E7459600AC489A /* Databases & Tables.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C00BCF14E7459600AC489A /* Databases & Tables.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58C00BD214E7459600AC489A /* Databases & Tables.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C00BD014E7459600AC489A /* Databases & Tables.m */; }; + 58C00CA514E845D800AC489A /* SPMySQL Private APIs.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C00CA414E845D800AC489A /* SPMySQL Private APIs.h */; }; + 58C7C1E414DB6E4C00436315 /* SPMySQLFastStreamingResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C7C1E214DB6E4C00436315 /* SPMySQLFastStreamingResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58C7C1E514DB6E4C00436315 /* SPMySQLFastStreamingResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C7C1E314DB6E4C00436315 /* SPMySQLFastStreamingResult.m */; }; + 58C7C1E814DB6E8600436315 /* Field Definitions.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C7C1E614DB6E8600436315 /* Field Definitions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58C7C1E914DB6E8600436315 /* Field Definitions.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C7C1E714DB6E8600436315 /* Field Definitions.m */; }; + 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; + 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; + 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; + 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; + 32DBCF5E0370ADEE00C91783 /* SPMySQLFramework_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLFramework_Prefix.pch; path = Source/SPMySQLFramework_Prefix.pch; sourceTree = "<group>"; }; + 580A331C14D75CF7000D6933 /* SPMySQLGeometryData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLGeometryData.h; path = Source/SPMySQLGeometryData.h; sourceTree = "<group>"; }; + 580A331D14D75CF7000D6933 /* SPMySQLGeometryData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPMySQLGeometryData.m; path = Source/SPMySQLGeometryData.m; sourceTree = "<group>"; }; + 58428DF614BA5A13000F8438 /* build-mysql-client.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "build-mysql-client.sh"; sourceTree = "<group>"; }; + 58428DFE14BA5FAE000F8438 /* SPMySQLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLConnection.h; path = Source/SPMySQLConnection.h; sourceTree = "<group>"; }; + 58428DFF14BA5FAE000F8438 /* SPMySQLConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPMySQLConnection.m; path = Source/SPMySQLConnection.m; sourceTree = "<group>"; }; + 5842929414C34B36000F8438 /* my_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = my_alloc.h; sourceTree = "<group>"; }; + 5842929514C34B36000F8438 /* my_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = my_list.h; sourceTree = "<group>"; }; + 5842929614C34B36000F8438 /* mysql.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql.h; sourceTree = "<group>"; }; + 5842929714C34B36000F8438 /* mysql_com.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_com.h; sourceTree = "<group>"; }; + 5842929814C34B36000F8438 /* mysql_embed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_embed.h; sourceTree = "<group>"; }; + 5842929914C34B36000F8438 /* mysql_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_time.h; sourceTree = "<group>"; }; + 5842929A14C34B36000F8438 /* mysql_version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_version.h; sourceTree = "<group>"; }; + 5842929B14C34B36000F8438 /* typelib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typelib.h; sourceTree = "<group>"; }; + 5842929D14C34B36000F8438 /* libmysqlclient.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmysqlclient.a; sourceTree = "<group>"; }; + 584294E314CB8002000F8438 /* SPMySQLConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLConstants.h; path = Source/SPMySQLConstants.h; sourceTree = "<group>"; }; + 584294EE14CB8002000F8438 /* Ping & KeepAlive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Ping & KeepAlive.h"; path = "Source/SPMySQLConnection Categories/Ping & KeepAlive.h"; sourceTree = "<group>"; }; + 584294EF14CB8002000F8438 /* Ping & KeepAlive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Ping & KeepAlive.m"; path = "Source/SPMySQLConnection Categories/Ping & KeepAlive.m"; sourceTree = "<group>"; }; + 584294F414CB8002000F8438 /* Querying & Preparation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Querying & Preparation.h"; path = "Source/SPMySQLConnection Categories/Querying & Preparation.h"; sourceTree = "<group>"; }; + 584294F514CB8002000F8438 /* Querying & Preparation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Querying & Preparation.m"; path = "Source/SPMySQLConnection Categories/Querying & Preparation.m"; sourceTree = "<group>"; }; + 584294F814CB8002000F8438 /* Encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Encoding.h; path = "Source/SPMySQLConnection Categories/Encoding.h"; sourceTree = "<group>"; }; + 584294F914CB8002000F8438 /* Encoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Encoding.m; path = "Source/SPMySQLConnection Categories/Encoding.m"; sourceTree = "<group>"; }; + 584294FC14CB8002000F8438 /* Server Info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Server Info.h"; path = "Source/SPMySQLConnection Categories/Server Info.h"; sourceTree = "<group>"; }; + 584294FD14CB8002000F8438 /* Server Info.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Server Info.m"; path = "Source/SPMySQLConnection Categories/Server Info.m"; sourceTree = "<group>"; }; + 586A99F914F02E21007F82BF /* SPMySQLStreamingResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLStreamingResult.h; path = Source/SPMySQLStreamingResult.h; sourceTree = "<group>"; }; + 586A99FA14F02E21007F82BF /* SPMySQLStreamingResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPMySQLStreamingResult.m; path = Source/SPMySQLStreamingResult.m; sourceTree = "<group>"; }; + 586AA0E714F1CEC8007F82BF /* Readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Readme.txt; sourceTree = "<group>"; }; + 586AA16514F30C5F007F82BF /* Convenience Methods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Convenience Methods.h"; path = "Source/SPMySQLResult Categories/Convenience Methods.h"; sourceTree = "<group>"; }; + 586AA16614F30C5F007F82BF /* Convenience Methods.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Convenience Methods.m"; path = "Source/SPMySQLResult Categories/Convenience Methods.m"; sourceTree = "<group>"; }; + 586AA81214F6C648007F82BF /* SPMySQLArrayAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLArrayAdditions.h; path = Source/SPMySQLArrayAdditions.h; sourceTree = "<group>"; }; + 5884127614CC63830078027F /* SPMySQL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQL.h; path = Source/SPMySQL.h; sourceTree = "<group>"; }; + 588412A614CC7A4D0078027F /* Locking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Locking.h; path = "Source/SPMySQLConnection Categories/Locking.h"; sourceTree = "<group>"; }; + 588412A714CC7A4D0078027F /* Locking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Locking.m; path = "Source/SPMySQLConnection Categories/Locking.m"; sourceTree = "<group>"; }; + 5884133B14CCEC6B0078027F /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + 5884142514CCF5190078027F /* Conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Conversion.h; path = "Source/SPMySQLConnection Categories/Conversion.h"; sourceTree = "<group>"; }; + 5884142614CCF5190078027F /* Conversion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Conversion.m; path = "Source/SPMySQLConnection Categories/Conversion.m"; sourceTree = "<group>"; }; + 588414BC14CE3B110078027F /* SPMySQLConnectionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLConnectionDelegate.h; path = Source/SPMySQLConnectionDelegate.h; sourceTree = "<group>"; }; + 5884165314D2306A0078027F /* SPMySQLResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLResult.h; path = Source/SPMySQLResult.h; sourceTree = "<group>"; }; + 5884165414D2306A0078027F /* SPMySQLResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPMySQLResult.m; path = Source/SPMySQLResult.m; sourceTree = "<group>"; }; + 58C006C714E0B18A00AC489A /* SPMySQLUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLUtilities.h; path = Source/SPMySQLUtilities.h; sourceTree = "<group>"; }; + 58C008CC14E2AC7D00AC489A /* SPMySQLConnectionProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLConnectionProxy.h; path = Source/SPMySQLConnectionProxy.h; sourceTree = "<group>"; }; + 58C009D314E31D3800AC489A /* SPMySQLStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLStringAdditions.h; path = Source/SPMySQLStringAdditions.h; sourceTree = "<group>"; }; + 58C009D414E31D3800AC489A /* SPMySQLStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPMySQLStringAdditions.m; path = Source/SPMySQLStringAdditions.m; sourceTree = "<group>"; }; + 58C00AA714E4869C00AC489A /* Max Packet Size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Max Packet Size.h"; path = "Source/SPMySQLConnection Categories/Max Packet Size.h"; sourceTree = "<group>"; }; + 58C00AA814E4869C00AC489A /* Max Packet Size.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Max Packet Size.m"; path = "Source/SPMySQLConnection Categories/Max Packet Size.m"; sourceTree = "<group>"; }; + 58C00AB314E4892E00AC489A /* Delegate & Proxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Delegate & Proxy.h"; path = "Source/SPMySQLConnection Categories/Delegate & Proxy.h"; sourceTree = "<group>"; }; + 58C00AB414E4892E00AC489A /* Delegate & Proxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Delegate & Proxy.m"; path = "Source/SPMySQLConnection Categories/Delegate & Proxy.m"; sourceTree = "<group>"; }; + 58C00AD914E4959A00AC489A /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 58C00BCF14E7459600AC489A /* Databases & Tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Databases & Tables.h"; path = "Source/SPMySQLConnection Categories/Databases & Tables.h"; sourceTree = "<group>"; }; + 58C00BD014E7459600AC489A /* Databases & Tables.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Databases & Tables.m"; path = "Source/SPMySQLConnection Categories/Databases & Tables.m"; sourceTree = "<group>"; }; + 58C00CA414E845D800AC489A /* SPMySQL Private APIs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SPMySQL Private APIs.h"; path = "Source/SPMySQL Private APIs.h"; sourceTree = "<group>"; }; + 58C7C1E214DB6E4C00436315 /* SPMySQLFastStreamingResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPMySQLFastStreamingResult.h; path = Source/SPMySQLFastStreamingResult.h; sourceTree = "<group>"; }; + 58C7C1E314DB6E4C00436315 /* SPMySQLFastStreamingResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPMySQLFastStreamingResult.m; path = Source/SPMySQLFastStreamingResult.m; sourceTree = "<group>"; }; + 58C7C1E614DB6E8600436315 /* Field Definitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Field Definitions.h"; path = "Source/SPMySQLResult Categories/Field Definitions.h"; sourceTree = "<group>"; }; + 58C7C1E714DB6E8600436315 /* Field Definitions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "Field Definitions.m"; path = "Source/SPMySQLResult Categories/Field Definitions.m"; sourceTree = "<group>"; }; + 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = "<group>"; }; + 8DC2EF5B0486A6940098B216 /* SPMySQL.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SPMySQL.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D2F7E79907B2D74100F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DC2EF560486A6940098B216 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */, + 584292A714C34B36000F8438 /* libmysqlclient.a in Frameworks */, + 5884133C14CCEC6B0078027F /* libz.dylib in Frameworks */, + 58C00ADA14E4959A00AC489A /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8DC2EF5B0486A6940098B216 /* SPMySQL.framework */, + ); + name = Products; + sourceTree = "<group>"; + }; + 0867D691FE84028FC02AAC07 /* SPMySQLFramework */ = { + isa = PBXGroup; + children = ( + 586AA0E714F1CEC8007F82BF /* Readme.txt */, + 5884127614CC63830078027F /* SPMySQL.h */, + 58C0077714E1DFFF00AC489A /* Protocols */, + 08FB77AEFE84172EC02AAC07 /* Classes */, + 58C009D214E31D1300AC489A /* Category Additions */, + 32C88DFF0371C24200C91783 /* Other Sources */, + 089C1665FE841158C02AAC07 /* Resources */, + 58428DF514BA5A03000F8438 /* Scripts */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DFFF38A50411DB9C8B /* Products */, + ); + name = SPMySQLFramework; + sourceTree = "<group>"; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, + 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, + ); + name = "External Frameworks and Libraries"; + sourceTree = "<group>"; + }; + 089C1665FE841158C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 5842929214C34B36000F8438 /* MySQL Client Libraries */, + 8DC2EF5A0486A6940098B216 /* Info.plist */, + 089C1666FE841158C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = "<group>"; + }; + 08FB77AEFE84172EC02AAC07 /* Classes */ = { + isa = PBXGroup; + children = ( + 58C00CA414E845D800AC489A /* SPMySQL Private APIs.h */, + 58428DFE14BA5FAE000F8438 /* SPMySQLConnection.h */, + 58428DFF14BA5FAE000F8438 /* SPMySQLConnection.m */, + 584294EB14CB8002000F8438 /* Connection Categories */, + 5884165314D2306A0078027F /* SPMySQLResult.h */, + 5884165414D2306A0078027F /* SPMySQLResult.m */, + 586A99F914F02E21007F82BF /* SPMySQLStreamingResult.h */, + 586A99FA14F02E21007F82BF /* SPMySQLStreamingResult.m */, + 58C7C1E214DB6E4C00436315 /* SPMySQLFastStreamingResult.h */, + 58C7C1E314DB6E4C00436315 /* SPMySQLFastStreamingResult.m */, + 58C7C1E114DB6E3000436315 /* Result Categories */, + 580A331B14D75CCF000D6933 /* Result types */, + ); + name = Classes; + sourceTree = "<group>"; + }; + 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, + 5884133B14CCEC6B0078027F /* libz.dylib */, + ); + name = "Linked Frameworks"; + sourceTree = "<group>"; + }; + 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 0867D6A5FE840307C02AAC07 /* AppKit.framework */, + D2F7E79907B2D74100F64583 /* CoreData.framework */, + 0867D69BFE84028FC02AAC07 /* Foundation.framework */, + 58C00AD914E4959A00AC489A /* SystemConfiguration.framework */, + ); + name = "Other Frameworks"; + sourceTree = "<group>"; + }; + 32C88DFF0371C24200C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + 584294E314CB8002000F8438 /* SPMySQLConstants.h */, + 58C006C714E0B18A00AC489A /* SPMySQLUtilities.h */, + 32DBCF5E0370ADEE00C91783 /* SPMySQLFramework_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = "<group>"; + }; + 580A331B14D75CCF000D6933 /* Result types */ = { + isa = PBXGroup; + children = ( + 580A331C14D75CF7000D6933 /* SPMySQLGeometryData.h */, + 580A331D14D75CF7000D6933 /* SPMySQLGeometryData.m */, + ); + name = "Result types"; + sourceTree = "<group>"; + }; + 58428DF514BA5A03000F8438 /* Scripts */ = { + isa = PBXGroup; + children = ( + 58428DF614BA5A13000F8438 /* build-mysql-client.sh */, + ); + name = Scripts; + sourceTree = "<group>"; + }; + 5842929214C34B36000F8438 /* MySQL Client Libraries */ = { + isa = PBXGroup; + children = ( + 5842929314C34B36000F8438 /* include */, + 5842929C14C34B36000F8438 /* lib */, + ); + path = "MySQL Client Libraries"; + sourceTree = "<group>"; + }; + 5842929314C34B36000F8438 /* include */ = { + isa = PBXGroup; + children = ( + 5842929414C34B36000F8438 /* my_alloc.h */, + 5842929514C34B36000F8438 /* my_list.h */, + 5842929614C34B36000F8438 /* mysql.h */, + 5842929714C34B36000F8438 /* mysql_com.h */, + 5842929814C34B36000F8438 /* mysql_embed.h */, + 5842929914C34B36000F8438 /* mysql_time.h */, + 5842929A14C34B36000F8438 /* mysql_version.h */, + 5842929B14C34B36000F8438 /* typelib.h */, + ); + path = include; + sourceTree = "<group>"; + }; + 5842929C14C34B36000F8438 /* lib */ = { + isa = PBXGroup; + children = ( + 5842929D14C34B36000F8438 /* libmysqlclient.a */, + ); + path = lib; + sourceTree = "<group>"; + }; + 584294EB14CB8002000F8438 /* Connection Categories */ = { + isa = PBXGroup; + children = ( + 58C00AB314E4892E00AC489A /* Delegate & Proxy.h */, + 58C00AB414E4892E00AC489A /* Delegate & Proxy.m */, + 58C00BCF14E7459600AC489A /* Databases & Tables.h */, + 58C00BD014E7459600AC489A /* Databases & Tables.m */, + 584294F414CB8002000F8438 /* Querying & Preparation.h */, + 584294F514CB8002000F8438 /* Querying & Preparation.m */, + 584294F814CB8002000F8438 /* Encoding.h */, + 584294F914CB8002000F8438 /* Encoding.m */, + 584294FC14CB8002000F8438 /* Server Info.h */, + 584294FD14CB8002000F8438 /* Server Info.m */, + 58C00AA714E4869C00AC489A /* Max Packet Size.h */, + 58C00AA814E4869C00AC489A /* Max Packet Size.m */, + 5884142414CCF4E60078027F /* Private */, + ); + name = "Connection Categories"; + sourceTree = "<group>"; + }; + 5884142414CCF4E60078027F /* Private */ = { + isa = PBXGroup; + children = ( + 584294EE14CB8002000F8438 /* Ping & KeepAlive.h */, + 584294EF14CB8002000F8438 /* Ping & KeepAlive.m */, + 588412A614CC7A4D0078027F /* Locking.h */, + 588412A714CC7A4D0078027F /* Locking.m */, + 5884142514CCF5190078027F /* Conversion.h */, + 5884142614CCF5190078027F /* Conversion.m */, + ); + name = Private; + sourceTree = "<group>"; + }; + 58C0077714E1DFFF00AC489A /* Protocols */ = { + isa = PBXGroup; + children = ( + 588414BC14CE3B110078027F /* SPMySQLConnectionDelegate.h */, + 58C008CC14E2AC7D00AC489A /* SPMySQLConnectionProxy.h */, + ); + name = Protocols; + sourceTree = "<group>"; + }; + 58C009D214E31D1300AC489A /* Category Additions */ = { + isa = PBXGroup; + children = ( + 58C009D314E31D3800AC489A /* SPMySQLStringAdditions.h */, + 58C009D414E31D3800AC489A /* SPMySQLStringAdditions.m */, + 586AA81214F6C648007F82BF /* SPMySQLArrayAdditions.h */, + ); + name = "Category Additions"; + sourceTree = "<group>"; + }; + 58C7C1E114DB6E3000436315 /* Result Categories */ = { + isa = PBXGroup; + children = ( + 58C7C1E614DB6E8600436315 /* Field Definitions.h */, + 58C7C1E714DB6E8600436315 /* Field Definitions.m */, + 586AA16514F30C5F007F82BF /* Convenience Methods.h */, + 586AA16614F30C5F007F82BF /* Convenience Methods.m */, + ); + name = "Result Categories"; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8DC2EF500486A6940098B216 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 58428E0014BA5FAE000F8438 /* SPMySQLConnection.h in Headers */, + 584294E414CB8002000F8438 /* SPMySQLConstants.h in Headers */, + 584294F614CB8002000F8438 /* Querying & Preparation.h in Headers */, + 584294F014CB8002000F8438 /* Ping & KeepAlive.h in Headers */, + 584294FA14CB8002000F8438 /* Encoding.h in Headers */, + 584294FE14CB8002000F8438 /* Server Info.h in Headers */, + 5842929F14C34B36000F8438 /* my_alloc.h in Headers */, + 584292A014C34B36000F8438 /* my_list.h in Headers */, + 584292A114C34B36000F8438 /* mysql.h in Headers */, + 584292A214C34B36000F8438 /* mysql_com.h in Headers */, + 584292A314C34B36000F8438 /* mysql_embed.h in Headers */, + 584292A414C34B36000F8438 /* mysql_time.h in Headers */, + 584292A514C34B36000F8438 /* mysql_version.h in Headers */, + 584292A614C34B36000F8438 /* typelib.h in Headers */, + 5884127714CC63830078027F /* SPMySQL.h in Headers */, + 588412A814CC7A4D0078027F /* Locking.h in Headers */, + 5884142714CCF5190078027F /* Conversion.h in Headers */, + 588414BD14CE3B110078027F /* SPMySQLConnectionDelegate.h in Headers */, + 5884165514D2306A0078027F /* SPMySQLResult.h in Headers */, + 580A331E14D75CF7000D6933 /* SPMySQLGeometryData.h in Headers */, + 58C7C1E414DB6E4C00436315 /* SPMySQLFastStreamingResult.h in Headers */, + 58C7C1E814DB6E8600436315 /* Field Definitions.h in Headers */, + 58C006C814E0B18A00AC489A /* SPMySQLUtilities.h in Headers */, + 58C008CD14E2AC7D00AC489A /* SPMySQLConnectionProxy.h in Headers */, + 58C009D514E31D3800AC489A /* SPMySQLStringAdditions.h in Headers */, + 58C00AA914E4869C00AC489A /* Max Packet Size.h in Headers */, + 58C00AB514E4892E00AC489A /* Delegate & Proxy.h in Headers */, + 58C00BD114E7459600AC489A /* Databases & Tables.h in Headers */, + 58C00CA514E845D800AC489A /* SPMySQL Private APIs.h in Headers */, + 586A99FB14F02E21007F82BF /* SPMySQLStreamingResult.h in Headers */, + 586AA16714F30C5F007F82BF /* Convenience Methods.h in Headers */, + 586AA81414F6C648007F82BF /* SPMySQLArrayAdditions.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8DC2EF4F0486A6940098B216 /* SPMySQL.framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "SPMySQL.framework" */; + buildPhases = ( + 8DC2EF500486A6940098B216 /* Headers */, + 8DC2EF520486A6940098B216 /* Resources */, + 8DC2EF540486A6940098B216 /* Sources */, + 8DC2EF560486A6940098B216 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SPMySQL.framework; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = SPMySQLFramework; + productReference = 8DC2EF5B0486A6940098B216 /* SPMySQL.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "SPMySQLFramework" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* SPMySQLFramework */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DC2EF4F0486A6940098B216 /* SPMySQL.framework */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8DC2EF520486A6940098B216 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DC2EF540486A6940098B216 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 58428E0114BA5FAE000F8438 /* SPMySQLConnection.m in Sources */, + 584294F114CB8002000F8438 /* Ping & KeepAlive.m in Sources */, + 584294FB14CB8002000F8438 /* Encoding.m in Sources */, + 584294FF14CB8002000F8438 /* Server Info.m in Sources */, + 5884142814CCF5190078027F /* Conversion.m in Sources */, + 5884159514D1A6880078027F /* Querying & Preparation.m in Sources */, + 5884159414D1A6760078027F /* Locking.m in Sources */, + 5884165614D2306A0078027F /* SPMySQLResult.m in Sources */, + 580A331F14D75CF7000D6933 /* SPMySQLGeometryData.m in Sources */, + 58C7C1E514DB6E4C00436315 /* SPMySQLFastStreamingResult.m in Sources */, + 58C7C1E914DB6E8600436315 /* Field Definitions.m in Sources */, + 58C009D614E31D3800AC489A /* SPMySQLStringAdditions.m in Sources */, + 58C00AAA14E4869C00AC489A /* Max Packet Size.m in Sources */, + 58C00AB614E4892E00AC489A /* Delegate & Proxy.m in Sources */, + 58C00BD214E7459600AC489A /* Databases & Tables.m in Sources */, + 586A99FC14F02E21007F82BF /* SPMySQLStreamingResult.m in Sources */, + 586AA16814F30C5F007F82BF /* Convenience Methods.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C1667FE841158C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1DEB91AE08733DA50010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEAD_CODE_STRIPPING = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Source/SPMySQLFramework_Prefix.pch; + INFOPLIST_FILE = Resources/Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks"; + LD_DYLIB_INSTALL_NAME = "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MySQL Client Libraries/lib\"", + ); + PRODUCT_NAME = SPMySQL; + WRAPPER_EXTENSION = framework; + }; + name = Debug; + }; + 1DEB91AF08733DA50010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEAD_CODE_STRIPPING = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Source/SPMySQLFramework_Prefix.pch; + INFOPLIST_FILE = Resources/Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MySQL Client Libraries/lib\"", + ); + PRODUCT_NAME = SPMySQL; + WRAPPER_EXTENSION = framework; + }; + name = Release; + }; + 1DEB91B208733DA50010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + ppc, + x86_64, + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACH_O_TYPE = mh_dylib; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + SDKROOT = macosx10.5; + VALID_ARCHS = "i386 ppc x86_64"; + }; + name = Debug; + }; + 1DEB91B308733DA50010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + ppc, + x86_64, + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACH_O_TYPE = mh_dylib; + PREBINDING = NO; + SDKROOT = macosx10.5; + VALID_ARCHS = "i386 ppc x86_64"; + }; + name = Release; + }; + 586AA55214F5D599007F82BF /* Distribution */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + i386, + ppc, + x86_64, + ); + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_CHECK_SWITCH_STATEMENTS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MISSING_PARENTHESES = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACH_O_TYPE = mh_dylib; + PREBINDING = NO; + SDKROOT = macosx10.5; + VALID_ARCHS = "i386 ppc x86_64"; + }; + name = Distribution; + }; + 586AA55314F5D599007F82BF /* Distribution */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEAD_CODE_STRIPPING = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Source/SPMySQLFramework_Prefix.pch; + INFOPLIST_FILE = Resources/Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MySQL Client Libraries/lib\"", + ); + PRODUCT_NAME = SPMySQL; + WRAPPER_EXTENSION = framework; + }; + name = Distribution; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "SPMySQL.framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91AE08733DA50010E9CD /* Debug */, + 1DEB91AF08733DA50010E9CD /* Release */, + 586AA55314F5D599007F82BF /* Distribution */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "SPMySQLFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91B208733DA50010E9CD /* Debug */, + 1DEB91B308733DA50010E9CD /* Release */, + 586AA55214F5D599007F82BF /* Distribution */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h b/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h new file mode 100644 index 00000000..5772eb72 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h @@ -0,0 +1,110 @@ +// +// $Id$ +// +// SPMySQLConnection_PrivateAPI.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 12, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +/** + * A collection of Private APIs from the various categories, to simplify + * inclusion across the categories. + */ + +#import "Ping & KeepAlive.h" +#import "Locking.h" +#import "Conversion.h" + + +@interface SPMySQLConnection (PrivateAPI) + +- (MYSQL *)_makeRawMySQLConnectionWithEncoding:(NSString *)encodingName isMasterConnection:(BOOL)isMaster; +- (BOOL)_waitForNetworkConnectionWithTimeout:(double)timeoutSeconds; +- (void)_updateConnectionVariables; +- (void)_restoreConnectionVariables; +- (BOOL)_checkConnectionIfNecessary; + +@end + + +@interface SPMySQLConnection (Delegate_and_Proxy_Private_API) + +- (void)_proxyStateChange:(NSObject <SPMySQLConnectionProxy> *)aProxy; +- (SPMySQLConnectionLostDecision)_delegateDecisionForLostConnection; + +@end + + +@interface SPMySQLConnection (Databases_and_Tables_Private_API) + +- (BOOL)_storeAndAlterEncodingToUTF8IfRequired; + +@end + + +@interface SPMySQLConnection (Max_Packet_Size_Private_API) + +- (void)_updateMaxQuerySize; +- (void)_updateMaxQuerySizeEditability; +- (BOOL)_attemptMaxQuerySizeIncreaseTo:(NSUInteger)targetSize; +- (void)_restoreMaximumQuerySizeAfterQuery; + +@end + + +@interface SPMySQLConnection (Querying_and_Preparation_Private_API) + +- (void)_flushMultipleResultSets; +- (void)_updateLastErrorMessage:(NSString *)theErrorMessage; +- (void)_updateLastErrorID:(NSUInteger)theErrorID; + +@end + + +// SPMySQLResult Private API +@interface SPMySQLResult (Private_API) + +- (NSString *)_stringWithBytes:(const void *)bytes length:(NSUInteger)length; +- (void)_setQueryExecutionTime:(double)theExecutionTime; +- (id)_getObjectFromBytes:(char *)bytes ofLength:(NSUInteger)length fieldType:(unsigned int)fieldType fieldDefinitionIndex:(NSUInteger)fieldIndex; + +@end + +/** + * Set up a static function to allow fast calling of SPMySQLResult data conversion with cached selectors + */ +static inline id SPMySQLResultGetObject(SPMySQLResult* self, char* bytes, NSUInteger length, unsigned int fieldType, NSUInteger fieldIndex) +{ + typedef id (*SPMySQLResultGetObjectMethodPtr)(SPMySQLResult*, SEL, char*, NSUInteger, unsigned int, NSUInteger); + static SPMySQLResultGetObjectMethodPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(_getObjectFromBytes:ofLength:fieldType:fieldDefinitionIndex:); + if (!cachedMethodPointer) cachedMethodPointer = (SPMySQLResultGetObjectMethodPtr)[self methodForSelector:cachedSelector]; + + return cachedMethodPointer(self, cachedSelector, bytes, length, fieldType, fieldIndex); +}
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQL.h b/Frameworks/SPMySQLFramework/Source/SPMySQL.h new file mode 100644 index 00000000..3c4c78f8 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQL.h @@ -0,0 +1,63 @@ +// +// $Id$ +// +// SPMySQL.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +@class SPMySQLConnection, SPMySQLResult, SPMySQLStreamingResult, SPMySQLFastStreamingResult; + +// Global include file for the framework. +// Constants +#import "SPMySQLConstants.h" + +// Required category additions +#import "SPMySQLStringAdditions.h" + +// MySQL Connection Delegate and Proxy protocols +#import "SPMySQLConnectionDelegate.h" +#import "SPMySQLConnectionProxy.h" + +// MySQL Connection class and public categories +#import "SPMySQLConnection.h" +#import "Delegate & Proxy.h" +#import "Databases & Tables.h" +#import "Max Packet Size.h" +#import "Querying & Preparation.h" +#import "Encoding.h" +#import "Server Info.h" + +// MySQL result set, streaming subclasses of same, and associated categories +#import "SPMySQLResult.h" +#import "SPMySQLStreamingResult.h" +#import "SPMySQLFastStreamingResult.h" +#import "Field Definitions.h" +#import "Convenience Methods.h" + +// Result data objects +#import "SPMySQLGeometryData.h" diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLArrayAdditions.h b/Frameworks/SPMySQLFramework/Source/SPMySQLArrayAdditions.h new file mode 100644 index 00000000..46c6d8e0 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLArrayAdditions.h @@ -0,0 +1,50 @@ +// +// $Id$ +// +// SPMySQLArrayAdditions.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 23, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +/** + * Set up a static function to allow fast mutable array insertion using + * cached selectors. + * At least in 10.7, inserting items into an array at a known point + * using NSMutableArray methods appears to be the fastest way of adding + * items to a CF/NSMutableArray. + */ +static inline void SPMySQLMutableArrayInsertObject(NSMutableArray *self, id anObject, NSUInteger anIndex) +{ + typedef id (*SPMySQLMutableArrayInsertObjectPtr)(NSMutableArray*, SEL, id, NSUInteger); + static SPMySQLMutableArrayInsertObjectPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(insertObject:atIndex:); + if (!cachedMethodPointer) cachedMethodPointer = (SPMySQLMutableArrayInsertObjectPtr)[self methodForSelector:cachedSelector]; + + cachedMethodPointer(self, cachedSelector, anObject, anIndex); +} diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Conversion.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Conversion.h new file mode 100644 index 00000000..0309ebdb --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Conversion.h @@ -0,0 +1,60 @@ +// +// $Id$ +// +// Encoding.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at <http://code.google.com/p/sequel-pro/> + +// This class is private to the framework. + +@interface SPMySQLConnection (Conversion) + ++ (const char *)_cStringForString:(NSString *)aString usingEncoding:(NSStringEncoding)anEncoding returningLengthAs:(NSUInteger *)cStringLengthPointer; + +- (const char *)_cStringForString:(NSString *)aString; +- (NSString *)_stringForCString:(const char *)cString; + +@end + + +/** + * Set up a static function to allow fast calling with cached selectors + */ +static inline const char* _cStringForStringWithEncoding(NSString* aString, NSStringEncoding anEncoding, NSUInteger *cStringLengthPointer) +{ + static Class cachedClass; + static IMP cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedClass) cachedClass = [SPMySQLConnection class]; + if (!cachedSelector) cachedSelector = @selector(_cStringForString:usingEncoding:returningLengthAs:); + if (!cachedMethodPointer) cachedMethodPointer = [SPMySQLConnection methodForSelector:cachedSelector]; + + return (const char *)(*cachedMethodPointer)(cachedClass, cachedSelector, aString, anEncoding, cStringLengthPointer); +} diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Conversion.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Conversion.m new file mode 100644 index 00000000..0a3cf99b --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Conversion.m @@ -0,0 +1,97 @@ +// +// $Id$ +// +// Encoding.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +// This class is private to the framework. + +#import "Conversion.h" + +@implementation SPMySQLConnection (Conversion) + +/** + * Converts an NSString to a null-terminated C string, using the supplied encoding. + * Uses lossy conversion, so if a string cannot be entirely converted using + * the current encoding, a representation will be returned rather than null. + * The returned cString will correctly preserve any nul characters within the string, + * which prevents the use of faster functions like [NSString cStringUsingEncoding:]. + * Pass in the third parameter to receive the length of the converted string, or pass + * in NULL if you do not want this information. + */ ++ (const char *)_cStringForString:(NSString *)aString usingEncoding:(NSStringEncoding)anEncoding returningLengthAs:(NSUInteger *)cStringLengthPointer +{ + + // Don't try and convert nil strings + if (!aString) return NULL; + + // Perform a lossy conversion, using NSData to do the hard work + NSData *convertedData = [aString dataUsingEncoding:anEncoding allowLossyConversion:YES]; + NSUInteger convertedDataLength = [convertedData length]; + + // Take the converted data - not null-terminated - and copy it to a null-terminated buffer + char *cStringBytes = malloc(convertedDataLength + 1); + memcpy(cStringBytes, [convertedData bytes], convertedDataLength); + cStringBytes[convertedDataLength] = 0L; + + if (cStringLengthPointer) *cStringLengthPointer = convertedDataLength+1; + + // Ensure the memory is autoreleased when needed, and return. + [NSData dataWithBytesNoCopy:cStringBytes length:convertedDataLength+1 freeWhenDone:YES]; + return cStringBytes; +} + +/** + * Converts an NSString to a null-terminated C string, using the current + * connection encoding. + */ +- (const char *)_cStringForString:(NSString *)aString +{ + + // Use a cached reference to avoid dynamic method overhead + return _cStringForStringWithEncoding(aString, stringEncoding, NULL); +} + +/** + * Converts a C string to an NSString using the supplied encoding. + * This method *will not* correctly preserve nul characters within c strings; instead + * the first nul character within the string will be treated as the line ending. This + * is unavoidable without supplying a string length, so this method should not be widely + * used for actual data conversion. + */ +- (NSString *)_stringForCString:(const char *)cString +{ + + // Don't try and convert null strings + if (cString == NULL) return nil; + + return [NSString stringWithCString:cString encoding:stringEncoding]; +} + +@end
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Databases & Tables.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Databases & Tables.h new file mode 100644 index 00000000..332b2680 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Databases & Tables.h @@ -0,0 +1,49 @@ +// +// $Id$ +// +// Databases & Tables.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 11, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLConnection (Databases_and_Tables) + +// Database selection +- (BOOL)selectDatabase:(NSString *)aDatabase; + +// Database lists +- (NSArray *)databases; +- (NSArray *)databasesLike:(NSString *)nameLikeString; + +// Table lists +- (NSArray *)tables; +- (NSArray *)tablesLike:(NSString *)nameLikeString; +- (NSArray *)tablesFromDatabase:(NSString *)aDatabase; +- (NSArray *)tablesLike:(NSString *)nameLikeString fromDatabase:(NSString *)aDatabase; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Databases & Tables.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Databases & Tables.m new file mode 100644 index 00000000..a95e060e --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Databases & Tables.m @@ -0,0 +1,258 @@ +// +// $Id$ +// +// Databases & Tables.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 11, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "Databases & Tables.h" +#import "SPMySQL Private APIs.h" + +@implementation SPMySQLConnection (Databases_and_Tables) + +#pragma mark - +#pragma mark Database selection + +/** + * Selects the database the connection should work with. Typically, a database should be + * set on a connection before any database-specific queries are run. + * Returns whether the database was correctly set or not. + * As MySQL does not support deselecting databases, a nil databaseName will return NO. + */ +- (BOOL)selectDatabase:(NSString *)aDatabase +{ + + // If no database was supplied, can't deselected - return NO. + if (!aDatabase) return NO; + + // Database selection should be made in UTF8 to avoid name encoding issues + BOOL encodingChangeRequired = [self _storeAndAlterEncodingToUTF8IfRequired]; + + // Attempt to select the supplied database + [self queryString:[NSString stringWithFormat:@"USE %@", [aDatabase mySQLBacktickQuotedString]]]; + + // If selecting the database failed, return failure. + if ([self queryErrored]) { + + // If the encoding needs to be restored, the error message and ID have to be stored so the + // actual error is still available to inspect on the class... + if (encodingChangeRequired) { + NSString *theErrorString = [self lastErrorMessage]; + NSUInteger theErrorID = [self lastErrorID]; + + [self restoreStoredEncoding]; + + [self _updateLastErrorMessage:theErrorString]; + [self _updateLastErrorID:theErrorID]; + } + + return NO; + } + + // Restore the connection encoding if necessary + if (encodingChangeRequired) [self restoreStoredEncoding]; + + // Store new database name and return success + if (database) [database release]; + database = [[NSString alloc] initWithString:aDatabase]; + + return YES; +} + +#pragma mark - +#pragma mark Database lists + +/** + * Retrieve an array of databases available to the current user, ordered as MySQL + * returns them. + * If an error occurred while retrieving the list of databases, nil will be returned; + * if no databases are available, an empty array will be returned. + */ +- (NSArray *)databases +{ + + // Wrap the related databasesLike: function to avoid code duplication + return [self databasesLike:nil]; +} + +/** + * Retrieve an array of databases whose names are matched against the supplied name + * using MySQL LIKE syntax (with wildcard support for % and _). If no name is supplied, + * all databases will be returned, in the order that MySQL returns them. + * If an error occurred while retrieving the list of databases, nil will be returned; + * if no matching databases are available, an empty array will be returned. + */ +- (NSArray *)databasesLike:(NSString *)nameLikeString +{ + NSMutableArray *databaseList = nil; + + // Database display should be made in UTF8 to avoid name encoding issues + BOOL encodingChangeRequired = [self _storeAndAlterEncodingToUTF8IfRequired]; + + // Build the query as appropriate + NSMutableString *databaseQuery = [NSMutableString stringWithString:@"SHOW DATABASES"]; + if ([nameLikeString length]) { + [databaseQuery appendFormat:@" LIKE %@", [nameLikeString mySQLTickQuotedString]]; + } + + // Perform the query and record state + SPMySQLResult *databaseResult = [self queryString:databaseQuery]; + [databaseResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; + + // Retrieve the result into an array if the query was successful + if (![self queryErrored]) { + databaseList = [NSMutableArray arrayWithCapacity:(NSUInteger)[databaseResult numberOfRows]]; + for (NSArray *dbRow in databaseResult) { + [databaseList addObject:[dbRow objectAtIndex:0]]; + } + } + + // Restore the connection encoding if necessary + if (encodingChangeRequired) [self restoreStoredEncoding]; + + return databaseList; +} + +#pragma mark - +#pragma mark Table lists + +/** + * Retrieve an array of tables in the currently selected database, ordered as MySQL + * returns them. + * If an error occurred while retrieving the list of tables, nil will be returned; + * if no tables are present, an empty array will be returned. + */ +- (NSArray *)tables +{ + + // Wrap the related tablesLike:fromDatabase: function to avoid code duplication + return [self tablesLike:nil fromDatabase:nil]; +} + +/** + * Retrieve an array of tables in the currently selected database whose names are + * matched against the supplied name using MySQL LIKE syntax (with wildcard + * support for % and _). If no name is supplied, all tables in the selected + * database will be returned, in the order that MySQL returns them. + * If an error occurred while retrieving the list of tables, nil will be returned; + * if no matching tables are present, an empty array will be returned. + */ +- (NSArray *)tablesLike:(NSString *)nameLikeString +{ + + // Wrap the related tablesLike:fromDatabase: function to avoid code duplication + return [self tablesLike:nameLikeString fromDatabase:nil]; + +} + +/** + * Retrieve an array of tables in the specified database, ordered as MySQL returns them. + * If no database is specified, the current database will be used. + * If an error occurred while retrieving the list of tables, nil will be returned; + * if no tables are present in the specified database, an empty array will be returned. + */ +- (NSArray *)tablesFromDatabase:(NSString *)aDatabase +{ + + // Wrap the related tablesLike:fromDatabase: function to avoid code duplication + return [self tablesLike:nil fromDatabase:aDatabase]; + +} + +/** + * Retrieve an array of tables in the specified database whose names are matched + * against the supplied name using MySQL LIKE syntax (with wildcard support + * for % and _). If no name is supplied, all tables in the specified database + * will be returned, in the order that MySQL returns them. + * If no database is specified, the current database will be used. + * If an error occurred while retrieving the list of tables, nil will be returned; + * if no matching tables are present in the specified database, an empty array + * will be returned. + */ +- (NSArray *)tablesLike:(NSString *)nameLikeString fromDatabase:(NSString *)aDatabase +{ + NSMutableArray *tableList = nil; + + // Table display should be made in UTF8 to avoid name encoding issues + BOOL encodingChangeRequired = [self _storeAndAlterEncodingToUTF8IfRequired]; + + // Build up the table lookup query + NSMutableString *tableQuery = [NSMutableString stringWithString:@"SHOW TABLES"]; + if ([aDatabase length]) { + [tableQuery appendFormat:@" FROM %@", [aDatabase mySQLBacktickQuotedString]]; + } + if ([nameLikeString length]) { + [tableQuery appendFormat:@" LIKE %@", [nameLikeString mySQLTickQuotedString]]; + } + + // Perform the query and record state + SPMySQLResult *tableResult = [self queryString:tableQuery]; + [tableResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; + + // Retrieve the result into an array if the query was successful + if (![self queryErrored]) { + tableList = [NSMutableArray arrayWithCapacity:(NSUInteger)[tableResult numberOfRows]]; + for (NSArray *tableRow in tableResult) { + [tableList addObject:[tableRow objectAtIndex:0]]; + } + } + + // Restore the connection encoding if necessary + if (encodingChangeRequired) [self restoreStoredEncoding]; + + return tableList; +} + +@end + +#pragma mark - +#pragma mark Private API + +@implementation SPMySQLConnection (Databases_and_Tables_Private_API) + +/** + * A number of queries regarding database or table information have to be made in UTF8, not + * in the connection encoding, so that names can be fully displayed and used even if they + * use a different encoding. This provides a convenience method to check whether a change + * is required; if so, the current encoding is stored, the encoding is changed, and YES is + * returned so the process can be reversed afterwards. + */ +- (BOOL)_storeAndAlterEncodingToUTF8IfRequired +{ + + // If the encoding is already UTF8, no change is required. + if ([encoding isEqualToString:@"utf8"] && !encodingUsesLatin1Transport) return NO; + + // Store the current encoding for restoration afterwards, and update encoding + [self storeEncodingForRestoration]; + [self setEncoding:@"utf8"]; + + return YES; +} + +@end
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.h new file mode 100644 index 00000000..cf132fcf --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.h @@ -0,0 +1,36 @@ +// +// $Id$ +// +// Delegate & Proxy.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 9, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLConnection (Delegate_and_Proxy) + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m new file mode 100644 index 00000000..3ac013cc --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Delegate & Proxy.m @@ -0,0 +1,133 @@ +// +// $Id$ +// +// Delegate & Proxy.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 9, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "Delegate & Proxy.h" +#import "SPMySQL Private APIs.h" + +@implementation SPMySQLConnection (Delegate_and_Proxy) + +#pragma mark - +#pragma mark Connection delegate + +/** + * Override the synthesized delegate setter, to allow optimisations to oft-made + * checks by precacheing availability. + */ +- (void)setDelegate:(NSObject <SPMySQLConnectionDelegate> *)aDelegate +{ + delegate = aDelegate; + + // Cache whether the delegate implements certain delegate methods + delegateSupportsWillQueryString = [delegate respondsToSelector:@selector(willQueryString:connection:)]; + delegateSupportsConnectionLost = [delegate respondsToSelector:@selector(connectionLost:)]; +} + +#pragma mark - +#pragma mark Connection proxy + +/** + * Override the synthesized proxy setter, to record the initial state and to + * set the state change selector. + */ +- (void)setProxy:(NSObject <SPMySQLConnectionProxy> *)aProxy +{ + proxy = [aProxy retain]; + previousProxyState = [aProxy state]; + + [proxy setConnectionStateChangeSelector:@selector(_proxyStateChange:) delegate:self]; +} + +@end + +#pragma mark - + +@implementation SPMySQLConnection (Delegate_and_Proxy_Private_API) + +/** + * Handle any state changes in the associated connection proxy. + */ +- (void)_proxyStateChange:(NSObject <SPMySQLConnectionProxy> *)aProxy +{ + + // Perform no actions if this isn't the current connection proxy, or if notifications + // are currently set to be ignored + if (aProxy != proxy || proxyStateChangeNotificationsIgnored) return; + + SPMySQLConnectionProxyState newState = [aProxy state]; + + // If the connection proxy disconnects, trigger a reconnect; use a new thread to allow the + // main thread to process events as required. + if (state == SPMySQLConnected && newState == SPMySQLProxyIdle && previousProxyState == SPMySQLProxyConnected) { + + // Clear the state change selector on the proxy until a connection is re-established + proxyStateChangeNotificationsIgnored = YES; + + // Trigger a reconnect + [NSThread detachNewThreadSelector:@selector(reconnect) toTarget:self withObject:nil]; + } + + // Update the state record + previousProxyState = newState; +} + +/** + * Ask the delegate for the connection lost decision. This can be called from + * any thread, and will call itself on the main thread if necessary, updating a global + * variable which is then returned on the child thread. + */ +- (SPMySQLConnectionLostDecision)_delegateDecisionForLostConnection +{ + SPMySQLConnectionLostDecision theDecision = SPMySQLConnectionLostDisconnect; + + // If on the main thread, ask the delegate directly. + if ([NSThread isMainThread]) { + [delegateDecisionLock lock]; + lastDelegateDecisionForLostConnection = [delegate connectionLost:self]; + theDecision = lastDelegateDecisionForLostConnection; + [delegateDecisionLock unlock]; + + // Otherwise call ourself on the main thread, waiting until the reply is received. + } else { + + // First check whether the application is in a modal state; if so, wait + while ([NSApp modalWindow]) usleep(100000); + + [self performSelectorOnMainThread:@selector(_delegateDecisionForLostConnection) withObject:nil waitUntilDone:YES]; + [delegateDecisionLock lock]; + theDecision = lastDelegateDecisionForLostConnection; + [delegateDecisionLock unlock]; + } + + return theDecision; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Encoding.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Encoding.h new file mode 100644 index 00000000..bb5bf25d --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Encoding.h @@ -0,0 +1,53 @@ +// +// $Id$ +// +// Encoding.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLConnection (Encoding) + +// Current connection encoding information +- (NSString *)encoding; +- (NSStringEncoding)stringEncoding; +- (BOOL)encodingUsesLatin1Transport; + +// Setting connection encoding +- (BOOL)setEncoding:(NSString *)theEncoding; +- (BOOL)setEncodingUsesLatin1Transport:(BOOL)useLatin1; + +// Encoding storage and restoration +- (void)storeEncodingForRestoration; +- (void)restoreStoredEncoding; + +// Encoding conversion ++ (NSStringEncoding)stringEncodingForMySQLCharset:(const char *)mysqlCharset; ++ (NSString *)mySQLCharsetForStringEncoding:(NSStringEncoding)aStringEncoding; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Encoding.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Encoding.m new file mode 100644 index 00000000..8f684f29 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Encoding.m @@ -0,0 +1,414 @@ +// +// $Id$ +// +// Encoding.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +#import "Encoding.h" + +@implementation SPMySQLConnection (Encoding) + +#pragma mark - +#pragma mark Current connection encoding information + +/** + * Returns the name of the current encoding - the MySQL character set - in + * use by the connection. + */ +- (NSString *)encoding +{ + return [NSString stringWithString:encoding]; +} + +/** + * Returns the NSStringEncoding currently in use by the connection to process + * queries and results. + */ +- (NSStringEncoding)stringEncoding +{ + return stringEncoding; +} + +/** + * Returns whether the connection is set to use Latin1 transport for queries and + * results. + * Latin1 transport is a compatibility mode in place for compatibility with older + * incorrect setups, where databases and clients might both be set to use UTF8 (or + * other encodings) for storing and retrieving data, but the MySQL link was never + * set to UTF8 mode; as a result, multibyte characters where split by the connection + * into pairs of characters, resulting in malformed storage. The data works + * correctly if written and read in the same way, so this mode allows correct display + * of that data. + */ +- (BOOL)encodingUsesLatin1Transport +{ + return encodingUsesLatin1Transport; +} + +#pragma mark - +#pragma mark Setting connection encoding + +/** + * Set the name of the encoding - the MySQL character set - that the connection + * should use. If an encoding not recognised by the server is supplied, NO is + * returned. + * Calling this resets whether the connection should use Latin1 transport to NO. + */ +- (BOOL)setEncoding:(NSString *)theEncoding +{ + + // MySQL versions prior to 4.1 don't support encoding changes; return NO on those + // versions. + if (![self serverVersionIsGreaterThanOrEqualTo:4 minorVersion:1 releaseVersion:0]) { + return NO; + } + + // If the supplied encoding is already set, return success + if ([encoding isEqualToString:theEncoding] && !encodingUsesLatin1Transport) { + return YES; + } + + // Run a query to set the connection encoding + [self queryString:[NSString stringWithFormat:@"SET NAMES %@", [theEncoding mySQLTickQuotedString]]]; + + // If the query errored, no encoding change occurred - return failure. + if ([self queryErrored]) return NO; + + // Connection encoding was successfully set, update the instance settings, + // and return success. + [encoding release]; + encoding = [[NSString alloc] initWithString:theEncoding]; + stringEncoding = [SPMySQLConnection stringEncodingForMySQLCharset:[theEncoding UTF8String]]; + encodingUsesLatin1Transport = NO; + + return YES; +} + +/** + * Sets the connection to use Latin1 transport for queries and results or not. All + * encodings will default to not use Latin1 transport.. + * Latin1 transport is a compatibility mode in place for compatibility with older + * incorrect setups, where databases and clients might both be set to use UTF8 (or + * other encodings) for storing and retrieving data, but the MySQL link was never + * set to UTF8 mode; as a result, multibyte characters where split by the connection + * into pairs of characters, resulting in malformed storage. The data works + * correctly if written and read in the same way, so this mode allows correct display + * of that data. + */ +- (BOOL)setEncodingUsesLatin1Transport:(BOOL)useLatin1 +{ + + // MySQL versions prior to 4.1 don't support encoding changes; return NO on those + // versions. + if (![self serverVersionIsGreaterThanOrEqualTo:4 minorVersion:1 releaseVersion:0]) { + return NO; + } + + // If the Latin1 mode is already set, return success + if (encodingUsesLatin1Transport == useLatin1) { + return YES; + } + + // If disabling Latin1 transport, just restore the connection encoding + if (!useLatin1) { + return [self setEncoding:encoding]; + } + + // Otherwise attempt to set Latin1 transport. First, the result set encoding. + [self queryString:@"SET CHARACTER_SET_RESULTS=latin1"]; + + // If that failed, no encoding change occurred - return failure. + if ([self queryErrored]) return NO; + + // Next, change the client character set, to also amend queries sent. + [self queryString:@"SET CHARACTER_SET_CLIENT=latin1"]; + + // If that failed, encoding details are in a partial state - attempt to restore + // the original details before returning failure. + if ([self queryErrored]) { + [self setEncoding:encoding]; + return NO; + } + + // Connecting encoding transport was successfully set, update the instance settings, + // and return success. + encodingUsesLatin1Transport = YES; + return YES; +} + +#pragma mark - +#pragma mark Encoding storage and restoration + + +/** + * Store a previous encoding setting, to allow it to be easily restored + * later - used when the encoding needs to be temporarily changed. + */ +- (void)storeEncodingForRestoration +{ + if (previousEncoding) [previousEncoding release]; + previousEncoding = [[NSString alloc] initWithString:encoding]; + previousEncodingUsesLatin1Transport = encodingUsesLatin1Transport; +} + +/** + * Restore a previously stored encoding setting, if available. Used in + * conjunection with -storeEncodingForRestoration for when the encoding needs + * to be temporarily changed. + */ +- (void)restoreStoredEncoding +{ + if (!previousEncoding || state == SPMySQLDisconnected || state == SPMySQLDisconnecting) { + return; + } + + [self setEncoding:previousEncoding]; + [self setEncodingUsesLatin1Transport:previousEncodingUsesLatin1Transport]; +} + +#pragma mark - +#pragma mark Encoding conversion + +/** + * Map MySQL encodings to NSStringEncodings, using the list of encodings sourced + * from http://dev.mysql.com/doc/refman/5.6/en/charset-charsets.html and the same + * list on previous MySQL versions. Older versions also had less-standard lists, + * such as the charset options listed on + * http://dev.mysql.com/doc/refman/4.1/en/charset-map.html . + * For each, the equivalent NSStringEncoding, or conversion from CfStringEncoding, + * was found. + * If a supplied character set can not be matched, logs an error and falls back + * to UTF8 encoding. + */ ++ (NSStringEncoding)stringEncodingForMySQLCharset:(const char *)mysqlCharset +{ + + // Handle the most common cases first + if (!strcmp(mysqlCharset, "utf8")) { + return NSUTF8StringEncoding; + } else if (!strcmp(mysqlCharset, "latin1")) { + return NSISOLatin1StringEncoding; + } else if (!strcmp(mysqlCharset, "ascii")) { + return NSASCIIStringEncoding; + + // Work down the rest of the 4.1+ charsets + } else if (!strcmp(mysqlCharset, "big5")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingBig5); + } else if (!strcmp(mysqlCharset, "dec8")) { + return NSISOLatin1StringEncoding; // Not exact, but very close + } else if (!strcmp(mysqlCharset, "cp850")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSLatin1); + } else if (!strcmp(mysqlCharset, "koi8r")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingKOI8_R); + } else if (!strcmp(mysqlCharset, "latin2")) { + return NSISOLatin2StringEncoding; + } else if (!strcmp(mysqlCharset, "ujis")) { + return NSJapaneseEUCStringEncoding; + } else if (!strcmp(mysqlCharset, "sjis")) { + return NSShiftJISStringEncoding; + } else if (!strcmp(mysqlCharset, "hebrew")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatinHebrew); + } else if (!strcmp(mysqlCharset, "tis620")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatinThai); + } else if (!strcmp(mysqlCharset, "euckr")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR); + } else if (!strcmp(mysqlCharset, "koi8u")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingKOI8_U); + } else if (!strcmp(mysqlCharset, "gb2312")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_2312_80); + } else if (!strcmp(mysqlCharset, "greek")) { + return NSWindowsCP1253StringEncoding; + } else if (!strcmp(mysqlCharset, "cp1250")) { + return NSWindowsCP1250StringEncoding; + } else if (!strcmp(mysqlCharset, "gbk")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGBK_95); + } else if (!strcmp(mysqlCharset, "latin5")) { + return NSWindowsCP1254StringEncoding; + } else if (!strcmp(mysqlCharset, "ucs2")) { + return NSUnicodeStringEncoding; + } else if (!strcmp(mysqlCharset, "cp866")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSRussian); + } else if (!strcmp(mysqlCharset, "macce")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingMacCentralEurRoman); + } else if (!strcmp(mysqlCharset, "macroman")) { + return NSMacOSRomanStringEncoding; + } else if (!strcmp(mysqlCharset, "cp852")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSLatin2); + } else if (!strcmp(mysqlCharset, "latin7")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin7); + } else if (!strcmp(mysqlCharset, "utf8mb4")) { + return NSUnicodeStringEncoding; // Is this correct? + } else if (!strcmp(mysqlCharset, "cp1251")) { + return NSWindowsCP1251StringEncoding; + } else if (!strcmp(mysqlCharset, "utf16")) { + return NSUnicodeStringEncoding; + } else if (!strcmp(mysqlCharset, "utf16le")) { + return NSUTF16LittleEndianStringEncoding; + } else if (!strcmp(mysqlCharset, "cp1256")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsArabic); + } else if (!strcmp(mysqlCharset, "cp1257")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingWindowsBalticRim); + } else if (!strcmp(mysqlCharset, "utf32")) { + return NSUTF32StringEncoding; + } else if (!strcmp(mysqlCharset, "binary")) { + return NSUTF8StringEncoding; + } else if (!strcmp(mysqlCharset, "cp932")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSJapanese); + } else if (!strcmp(mysqlCharset, "eucjpms")) { + return NSJapaneseEUCStringEncoding; + + // Continue with old < 4.1 mappings + } else if (!strcmp(mysqlCharset, "czech")) { + return NSISOLatin2StringEncoding; + } else if (!strcmp(mysqlCharset, "dos")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSLatin1); + } else if (!strcmp(mysqlCharset, "german1")) { + return NSISOLatin1StringEncoding; + } else if (!strcmp(mysqlCharset, "usa7")) { + return NSASCIIStringEncoding; + } else if (!strcmp(mysqlCharset, "danish")) { + return NSISOLatin1StringEncoding; + } else if (!strcmp(mysqlCharset, "win1251")) { + return NSWindowsCP1251StringEncoding; + } else if (!strcmp(mysqlCharset, "euc_kr")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR); + } else if (!strcmp(mysqlCharset, "estonia")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin7); + } else if (!strcmp(mysqlCharset, "hungarian")) { + return NSISOLatin2StringEncoding; + } else if (!strcmp(mysqlCharset, "koi8_ru")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingKOI8_R); + } else if (!strcmp(mysqlCharset, "koi8_ukr")) { + return CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingKOI8_U); + } else if (!strcmp(mysqlCharset, "win1251ukr")) { + return NSWindowsCP1251StringEncoding; + } else if (!strcmp(mysqlCharset, "win1250")) { + return NSWindowsCP1250StringEncoding; + } else if (!strcmp(mysqlCharset, "croat")) { + return NSISOLatin2StringEncoding; + } else if (!strcmp(mysqlCharset, "latin1_de")) { + return NSISOLatin1StringEncoding; + } + + /** + * Finally, certain other encodings, including the following: + * hp8 + * swe7 + * armscii8 + * keybcs2 + * geostd8 + * ...don't appear to have OS X equivalents; for these and unhandled, log and + * fall back to UTF8 handling. + */ + NSLog(@"SPMySQL Framework has encountered the MySQL encoding '%s' which it is unable to process correctly; falling back to UTF8 mapping.", mysqlCharset); + return NSUTF8StringEncoding; +} + +/** + * Match a supplied NSStringEncoding to a MySQL character set, returning the MySQL + * name of that character set as an NSString. + * If the supplied NSStringEncoding could not be matched, logs an error and returns nil. + */ ++ (NSString *)mySQLCharsetForStringEncoding:(NSStringEncoding)aStringEncoding +{ + + // Switch through the list of NSStringEncodings from NSString, returning the most + // appropriate encoding for each + switch (aStringEncoding) { + + case NSASCIIStringEncoding: + return @"ascii"; + + case NSJapaneseEUCStringEncoding: + return @"ujis"; + + case NSUTF8StringEncoding: + return @"utf8"; + + case NSISOLatin1StringEncoding: + return @"latin1"; + + case NSNonLossyASCIIStringEncoding: + return @"utf8"; + + case NSShiftJISStringEncoding: + return @"sjis"; + + case NSISOLatin2StringEncoding: + return @"latin2"; + + case NSUnicodeStringEncoding: + return @"ucs2"; + + case NSWindowsCP1251StringEncoding: + return @"cp1251"; + + case NSWindowsCP1252StringEncoding: + return @"latin1"; + + case NSWindowsCP1253StringEncoding: + return @"greek"; + + case NSWindowsCP1254StringEncoding: + return @"latin5"; + + case NSWindowsCP1250StringEncoding: + return @"cp1250"; + + case NSMacOSRomanStringEncoding: + return @"macroman"; + + case NSUTF16BigEndianStringEncoding: + return @"utf16"; + + case NSUTF16LittleEndianStringEncoding: + return @"utf16le"; + + case NSUTF32StringEncoding: + return @"utf32"; + + case NSUTF32BigEndianStringEncoding: + return @"utf32"; + } + + /** + * Certain string encodings, including the following: + * NSNEXTSTEPStringEncoding + * NSSymbolStringEncoding + * NSISO2022JPStringEncoding + * NSUTF32LittleEndianStringEncoding + * + * ...don't have equivalents; similarly, many CFStringEncodings aren't yet + * matched. For those, log and return nil. + */ + NSLog(@"SPMySQL Framework was asked for the MySQL charset for the string encoding '%llu', which is currently unhandled.", (unsigned long long)aStringEncoding); + return nil; +} +@end
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Locking.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Locking.h new file mode 100644 index 00000000..90e11179 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Locking.h @@ -0,0 +1,41 @@ +// +// $Id$ +// +// Locking.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +// This class is private to the framework. + +@interface SPMySQLConnection (Locking) + +- (void)_lockConnection; +- (BOOL)_tryLockConnection; +- (void)_unlockConnection; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Locking.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Locking.m new file mode 100644 index 00000000..d654066b --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Locking.m @@ -0,0 +1,104 @@ +// +// $Id$ +// +// Locking.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +// This class is private to the framework. + +#import "Locking.h" +#import "SPMySQL Private APIs.h" + +@implementation SPMySQLConnection (Locking) + + +/** + * Lock the connection. This must be done before performing any operation + * that is not thread safe, eg. performing queries or pinging. + */ +- (void)_lockConnection +{ + + // We can only start a query when the condition is SPMySQLConnectionIdle + [connectionLock lockWhenCondition:SPMySQLConnectionIdle]; + + // Set the condition to SPMySQLConnectionBusy + [connectionLock unlockWithCondition:SPMySQLConnectionBusy]; +} + +/** + * Attempt to lock the connection. If the connection is idle (unlocked), this method + * locks the connection and returns YES for success. The connection must afterward + * be unlocked using unlockConnection. If the connection is currently busy (locked), + * this method immediately returns NO and doesn't lock the connection. + */ +- (BOOL)_tryLockConnection +{ + + // If the connection is already is use, return failure + if (![connectionLock tryLockWhenCondition:SPMySQLConnectionIdle]) { + return NO; + } + + // We're allowed to use the connection; set it to busy, and return success + [connectionLock unlockWithCondition:SPMySQLConnectionBusy]; + return YES; +} + + +/** + * Unlock the connection. + */ +- (void)_unlockConnection +{ + + // Always lock the conditional lock before proceeding + [connectionLock lock]; + + // Check if the connection actually was busy. If it wasn't busy, + // it means the connection may have been unlocked twice. This is + // potentially dangerous, so we log this to the console + if ([connectionLock condition] != SPMySQLConnectionBusy) { + NSLog(@"SPMySQLConnection: Tried to unlock the connection, but it wasn't locked."); + } + + // Since we connected with CLIENT_MULTI_RESULT, we must make sure there are not more results! + // This is still a bit of a dirty hack + if (state == SPMySQLConnected + && mySQLConnection && mySQLConnection->net.vio && mySQLConnection->net.buff && mysql_more_results(mySQLConnection)) + { + NSLog(@"SPMySQLConnection: Discarding unretrieved results. This is currently normal when using CALL."); + [self _flushMultipleResultSets]; + } + + // Tell everyone that the connection is available again + [connectionLock unlockWithCondition:SPMySQLConnectionIdle]; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Max Packet Size.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Max Packet Size.h new file mode 100644 index 00000000..faa667d8 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Max Packet Size.h @@ -0,0 +1,40 @@ +// +// $Id$ +// +// Max Packet Size.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 9, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLConnection (Max_Packet_Size) + +- (NSUInteger)maxQuerySize; +- (BOOL)isMaxQuerySizeEditable; +- (NSUInteger)setGlobalMaxQuerySize:(NSUInteger)newMaxSize; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Max Packet Size.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Max Packet Size.m new file mode 100644 index 00000000..e0bfef52 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Max Packet Size.m @@ -0,0 +1,196 @@ +// +// $Id$ +// +// Max Packet Size.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 9, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +#import "Max Packet Size.h" +#import "SPMySQL Private APIs.h" + +@implementation SPMySQLConnection (Max_Packet_Size) + +/** + * Retrieve the current maximum query size (MySQL's max_allowed_packet), as cached + * by the class. If the connection has been unable to retrieve this value, the + * default of 1MB will be returned. + */ +- (NSUInteger)maxQuerySize +{ + return maxQuerySize; +} + +/** + * Retrieve whether the server's maximum query size (MySQL's max_allowed_packet) is + * editable by the current user. + */ +- (BOOL)isMaxQuerySizeEditable +{ + if (!maxQuerySizeEditabilityChecked) { + [self _updateMaxQuerySizeEditability]; + } + + return maxQuerySizeIsEditable; +} + +/** + * Set the servers's global maximum query size - MySQL's max_allowed_packed - to the + * supplied size. Note that this *does not* affect the current connection; a reconnection + * is required to pick up the new size setting. As a result it may be important to restore + * the connection size after use. + * Validates the supplied size (eg 1GB limit) and applies it if appropriate, returning + * the set query size or NSNotFound on error. + */ +- (NSUInteger)setGlobalMaxQuerySize:(NSUInteger)newMaxSize +{ + + // Perform basic validation. First, ensure the max query size is editable + if (![self isMaxQuerySizeEditable]) return NSNotFound; + + // Validate sizes + if (newMaxSize < 1024) return NSNotFound; + if (newMaxSize > (1024 * 1024 * 1024)) newMaxSize = 1024 * 1024 * 1024; + + // Perform a standard query to set the new size + [self queryString:[NSString stringWithFormat:@"SET GLOBAL max_allowed_packet = %lu", newMaxSize]]; + + // On failure, return NSNotFound - error state will have automatically been set + if ([self queryErrored]) return NSNotFound; + + // Otherwise, set the local instance variable and return success + maxQuerySize = newMaxSize; + return maxQuerySize; +} + +@end + +#pragma mark - + +@implementation SPMySQLConnection (Max_Packet_Size_Private_API) + +/** + * Update the max_allowed_packet size - the largest supported query size - from the server. + */ +- (void)_updateMaxQuerySize +{ + + // Determine which query to run based on server version + NSString *packetQueryString; + if ([self serverMajorVersion] == 3) { + packetQueryString = @"SHOW VARIABLES LIKE 'max_allowed_packet'"; + } else { + packetQueryString = @"SELECT @@global.max_allowed_packet"; + } + + // Make a standard query to the server to retrieve the information + SPMySQLResult *result = [self queryString:packetQueryString]; + [result setReturnDataAsStrings:YES]; + + // Get the maximum size string + NSString *maxQuerySizeString = nil; + if ([self serverMajorVersion] == 3) { + maxQuerySizeString = [[result getRowAsArray] objectAtIndex:1]; + } else { + maxQuerySizeString = [[result getRowAsArray] objectAtIndex:0]; + } + + // If a valid size was returned, update the instance variable + if (maxQuerySizeString) { + maxQuerySize = (NSUInteger)[maxQuerySizeString integerValue]; + } +} + +/** + * Perform a query to determine whether the current user has permission to edit the + * max_allowed_packet setting for their connection. + */ +- (void)_updateMaxQuerySizeEditability +{ + [self queryString:@"SET GLOBAL max_allowed_packet = @@global.max_allowed_packet"]; + maxQuerySizeIsEditable = ![self queryErrored]; + maxQuerySizeEditabilityChecked = YES; +} + +/** + * Attempts to change the maximum query size in order to allow a query to be performed. + * Returns whether the change was successfully made. + */ +- (BOOL)_attemptMaxQuerySizeIncreaseTo:(NSUInteger)targetSize +{ + + // If the query size is editable, attempt to increase the size + if ([self isMaxQuerySizeEditable]) { + NSUInteger newSize = [self setGlobalMaxQuerySize:targetSize]; + if (newSize != NSNotFound) { + + // Successfully increased the global size - reconnect to use it, and return success + [self reconnect]; + return YES; + } + } + + // Can not, or failed to, increase the max query size. Record an error message. + NSString *errorMessage = [NSString stringWithFormat:NSLocalizedString(@"The query length of %lu bytes is larger than max_allowed_packet size (%lu).", @"error message if max_allowed_packet < query size"), targetSize, maxQuerySize]; + [self _updateLastErrorMessage:errorMessage]; + + // Update delegate error if it supports the protocol + if ([delegate respondsToSelector:@selector(queryGaveError:connection:)]) { + [delegate queryGaveError:errorMessage connection:self]; + } + + // Display an alert as this is a special failure + if ([delegate respondsToSelector:@selector(showErrorWithTitle:message:)]) { + [delegate showErrorWithTitle:NSLocalizedString(@"Error", @"error") message:errorMessage]; + } else { + NSRunAlertPanel(NSLocalizedString(@"Error", @"error"), errorMessage, @"OK", nil, nil); + } + + return NO; +} + +/** + * Restore a maximum query size after temporarily increasing it for a query. This action + * may be called directly after a query, or may be before the next query if a streaming result + * had to be used. + */ +- (void)_restoreMaximumQuerySizeAfterQuery +{ + + // Return if no action needs to be performed + if (queryActionShouldRestoreMaxQuerySize == NSNotFound) return; + + // Move the target size to a local variable to prevent looping + NSUInteger targetMaxQuerySize = queryActionShouldRestoreMaxQuerySize; + queryActionShouldRestoreMaxQuerySize = NSNotFound; + + // Enact the change + [self setGlobalMaxQuerySize:targetMaxQuerySize]; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h new file mode 100644 index 00000000..3788c653 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h @@ -0,0 +1,58 @@ +// +// $Id$ +// +// Ping & KeepAlive.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +// This class is private to the framework. + +typedef struct { + MYSQL *mySQLConnection; + BOOL *keepAlivePingActivePointer; + BOOL *keepAliveLastPingSuccessPointer; +} SPMySQLConnectionPingDetails; + +@interface SPMySQLConnection (Ping_and_KeepAlive) + +// Setup functions +- (void)_initKeepAlivePingTimer; + +// Keepalive ping initialisation +- (void)_keepAlive:(NSTimer *)theTimer; +- (void)_threadedKeepAlive; + +// Master ping method +- (BOOL)_pingConnectionUsingLoopDelay:(NSUInteger)loopDelay; + +// Ping thread internals +void _backgroundPingTask(void *ptr); +void _forceThreadExit(int signalNumber); +void _pingThreadCleanup(void *pingDetails); + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m new file mode 100644 index 00000000..9e25edcb --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m @@ -0,0 +1,227 @@ +// +// $Id$ +// +// Ping & KeepAlive.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +#import "Ping & KeepAlive.h" +#import "Locking.h" +#import <pthread.h> + +@implementation SPMySQLConnection (Ping_and_KeepAlive) + +#pragma mark - +#pragma mark Setup functions + +/** + * Set up the keepalive timer; this should be called on the main + * thread, to ensure the timer isn't descheduled when child threads + * terminate. + */ +- (void)_initKeepAlivePingTimer +{ + keepAliveTimer = [[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(_keepAlive:) userInfo:nil repeats:YES] retain]; +} + +#pragma mark - +#pragma mark Keepalive ping initialisation + +/** + * Keeps the connection alive by running a ping. + * This method is called every ten seconds and spawns a thread which determines + * whether or not it should perform a ping. + */ +- (void)_keepAlive:(NSTimer *)theTimer +{ + + // Do nothing if not connected or if keepalive is disabled + if (state != SPMySQLConnected || !useKeepAlive) return; + + // Check to see whether a ping is required. First, compare the last query + // and keepalive times against the keepalive interval. + // Compare against interval-1 to allow default keepalive intervals to repeat + // at the correct intervals (eg no timer interval delay). + uint64_t currentTime = mach_absolute_time(); + if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < keepAliveInterval - 1 + || _elapsedSecondsSinceAbsoluteTime(lastKeepAliveTime) < keepAliveInterval - 1) + { + return; + } + + // Attempt to lock the connection. If the connection is currently busy, + // we don't need a ping. + if (![self _tryLockConnection]) return; + [self _unlockConnection]; + + // Store the ping time + lastKeepAliveTime = currentTime; + + [NSThread detachNewThreadSelector:@selector(_threadedKeepAlive) toTarget:self withObject:nil]; +} + +/** + * A threaded keepalive to avoid blocking the interface. Performs safety + * checks, and then creates a child pthread to actually ping the connection, + * forcing the thread to close after the timeout if it hasn't closed already. + */ +- (void)_threadedKeepAlive +{ + + // If the maximum number of ping failures has been reached, trigger a reconnect + if (keepAliveLastPingBlocked || keepAlivePingFailures >= 3) { + [self reconnect]; + return; + } + + // Otherwise, perform a background ping. + BOOL pingResult = [self _pingConnectionUsingLoopDelay:10000]; + if (pingResult) { + keepAlivePingFailures = 0; + } else { + keepAlivePingFailures++; + } +} + +#pragma mark - +#pragma mark Master ping method + +/** + * This function provides a method of pinging the remote server while also enforcing + * the specified connection time. This is required because low-level net reads can + * block indefinitely if the remote server disappears or on network issues - setting + * the MYSQL_OPT_READ_TIMEOUT (and the WRITE equivalent) would "fix" ping, but cause + * long queries to be terminated. + * The supplied loop delay number controls how tight the thread checking loop is, in + * microseconds, to allow differentiating foreground and background pings. + * Unlike mysql_ping, this function returns FALSE on failure and TRUE on success. + */ +- (BOOL)_pingConnectionUsingLoopDelay:(NSUInteger)loopDelay +{ + if (state != SPMySQLConnected) return NO; + + uint64_t pingStartTime_t; + double pingElapsedTime; + BOOL threadCancelled = NO; + + // Set up a query lock + [self _lockConnection]; + + keepAliveLastPingSuccess = NO; + keepAliveLastPingBlocked = NO; + keepAlivePingThreadActive = YES; + + // Use a ping timeout defaulting to thirty seconds, but using the connection timeout if set + NSUInteger pingTimeout = 30; + if (timeout > 0) pingTimeout = timeout; + + // Set up a struct containing details the ping task will need + SPMySQLConnectionPingDetails pingDetails; + pingDetails.mySQLConnection = mySQLConnection; + pingDetails.keepAliveLastPingSuccessPointer = &keepAliveLastPingSuccess; + pingDetails.keepAlivePingActivePointer = &keepAlivePingThreadActive; + + // Create a pthread for the ping + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_create(&keepAlivePingThread, &attr, (void *)&_backgroundPingTask, &pingDetails); + + // Record the ping start time + pingStartTime_t = mach_absolute_time(); + + // Loop until the ping completes + do { + usleep((useconds_t)loopDelay); + pingElapsedTime = _elapsedSecondsSinceAbsoluteTime(pingStartTime_t); + + // If the ping timeout has been exceeded, force a timeout; double-check that the + // thread is still active. + if (pingElapsedTime > pingTimeout && keepAlivePingThreadActive && !threadCancelled) { + pthread_cancel(keepAlivePingThread); + threadCancelled = YES; + + // If the timeout has been exceeded by an additional two seconds, and the thread is + // still active, kill the thread. This can occur in certain network conditions causing + // a blocking read. + } else if (pingElapsedTime > (pingTimeout + 2) && keepAlivePingThreadActive) { + pthread_kill(keepAlivePingThread, SIGUSR1); + keepAlivePingThreadActive = NO; + keepAliveLastPingBlocked = YES; + } + } while (keepAlivePingThreadActive); + + // Clean up + keepAlivePingThread = NULL; + pthread_attr_destroy(&attr); + + // Unlock the connection + [self _unlockConnection]; + + return keepAliveLastPingSuccess; +} + +#pragma mark - +#pragma mark Ping thread internals + +/** + * Actually perform a keepalive ping - intended for use within a pthread. + */ +void _backgroundPingTask(void *ptr) +{ + SPMySQLConnectionPingDetails *pingDetails = (SPMySQLConnectionPingDetails *)ptr; + + // Set up a cleanup routine + pthread_cleanup_push(_pingThreadCleanup, pingDetails); + + // Set up a signal handler for SIGUSR1, to handle forced timeouts. + signal(SIGUSR1, _forceThreadExit); + + // Perform a ping + *(pingDetails->keepAliveLastPingSuccessPointer) = (BOOL)(!mysql_ping(pingDetails->mySQLConnection)); + + // Call the cleanup routine + pthread_cleanup_pop(1); +} + +/** + * Support forcing a thread to exit as a result of a signal. + */ +void _forceThreadExit(int signalNumber) +{ + pthread_exit(NULL); +} + +void _pingThreadCleanup(void *pingDetails) +{ + SPMySQLConnectionPingDetails *pingDetailsStruct = pingDetails; + *(pingDetailsStruct->keepAlivePingActivePointer) = NO; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.h new file mode 100644 index 00000000..9ab8bc6a --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.h @@ -0,0 +1,107 @@ +// +// $Id$ +// +// Querying & Preparation.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLConnection (Querying_and_Preparation) + +// Data preparation +- (NSString *)escapeAndQuoteString:(NSString *)theString; +- (NSString *)escapeString:(NSString *)theString includingQuotes:(BOOL)includeQuotes; +- (NSString *)escapeAndQuoteData:(NSData *)theData; +- (NSString *)escapeData:(NSData *)theData includingQuotes:(BOOL)includeQuotes; + +// Queries +- (SPMySQLResult *)queryString:(NSString *)theQueryString; +- (SPMySQLFastStreamingResult *)streamingQueryString:(NSString *)theQueryString; +- (id)streamingQueryString:(NSString *)theQueryString useLowMemoryBlockingStreaming:(BOOL)fullStreaming; +- (id)queryString:(NSString *)theQueryString usingEncoding:(NSStringEncoding)theEncoding withResultType:(SPMySQLResultType)theReturnType; + +// Query convenience functions +- (NSArray *)getAllRowsFromQuery:(NSString *)theQueryString; +- (id)getFirstFieldFromQuery:(NSString *)theQueryString; + +// Query information +- (unsigned long long)rowsAffectedByLastQuery; +- (unsigned long long)lastInsertID; + +// Connection and query error state +- (BOOL)queryErrored; +- (NSString *)lastErrorMessage; +- (NSUInteger)lastErrorID; ++ (BOOL)isErrorIDConnectionError:(NSUInteger)theErrorID; + +// Query cancellation +- (void)cancelCurrentQuery; +- (BOOL)lastQueryWasCancelled; +- (BOOL)lastQueryWasCancelledUsingReconnect; + +@end + +/** + * Set up static functions to allow fast calling with cached selectors + */ + +static inline id SPMySQLConnectionEscapeString(SPMySQLConnection* self, NSString *theString, BOOL encloseInQuotes) +{ + typedef id (*SPMySQLConnectionEscapeStringMethodPtr)(SPMySQLConnection*, SEL, NSString *, BOOL); + static SPMySQLConnectionEscapeStringMethodPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(escapeString:includingQuotes:); + if (!cachedMethodPointer) cachedMethodPointer = (SPMySQLConnectionEscapeStringMethodPtr)[self methodForSelector:cachedSelector]; + + return cachedMethodPointer(self, cachedSelector, theString, encloseInQuotes); +} + +static inline id SPMySQLConnectionEscapeData(SPMySQLConnection* self, NSData *theData, BOOL encloseInQuotes) +{ + typedef id (*SPMySQLConnectionEscapeDataMethodPtr)(SPMySQLConnection*, SEL, NSData *, BOOL); + static SPMySQLConnectionEscapeDataMethodPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(escapeData:includingQuotes:); + if (!cachedMethodPointer) cachedMethodPointer = (SPMySQLConnectionEscapeDataMethodPtr)[self methodForSelector:cachedSelector]; + + return cachedMethodPointer(self, cachedSelector, theData, encloseInQuotes); +} + +static inline id SPMySQLConnectionQueryString(SPMySQLConnection* self, NSString *theQueryString, NSStringEncoding theEncoding, SPMySQLResultType theReturnType) +{ + typedef id (*SPMySQLConnectionQueryStringMethodPtr)(SPMySQLConnection*, SEL, NSString *, NSStringEncoding, SPMySQLResultType); + static SPMySQLConnectionQueryStringMethodPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(queryString:usingEncoding:withResultType:); + if (!cachedMethodPointer) cachedMethodPointer = (SPMySQLConnectionQueryStringMethodPtr)[self methodForSelector:cachedSelector]; + + return cachedMethodPointer(self, cachedSelector, theQueryString, theEncoding, theReturnType); +} diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m new file mode 100644 index 00000000..cb5ce70d --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m @@ -0,0 +1,644 @@ +// +// $Id$ +// +// Querying & Preparation.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +#import "SPMySQLConnection.h" +#import "SPMySQL Private APIs.h" + +@implementation SPMySQLConnection (Querying_and_Preparation) + +#pragma mark - +#pragma mark Data preparation + +/** + * See also the NSString methods mySQLTickQuotedString and mySQLBacktickQuotedString, + * added via an NSString category; however these methods are safer and more complete + * as they use the current connection encoding to quote characters. + */ + + +/** + * Take a string, escapes any special character, and surrounds it with single quotes + * for safe use within a query; correctly escapes any characters within the string + * using the current connection encoding. + */ +- (NSString *)escapeAndQuoteString:(NSString *)theString +{ + return SPMySQLConnectionEscapeString(self, theString, YES); +} + +/** + * Take a string and escapes any special character for safe use within a query; correctly + * escapes any characters within the string using the current connection encoding. + * Allows control over whether to also wrap the string in single quotes. + */ +- (NSString *)escapeString:(NSString *)theString includingQuotes:(BOOL)includeQuotes +{ + + // Return nil strings untouched + if (!theString) return theString; + + // To correctly escape the string, an active connection is required, so verify. + if (state == SPMySQLDisconnected || state == SPMySQLConnecting) { + if ([delegate respondsToSelector:@selector(noConnectionAvailable:)]) { + [delegate noConnectionAvailable:self]; + } + return nil; + } + if (![self _checkConnectionIfNecessary]) return nil; + + // Perform a lossy conversion to bytes, using NSData to do the hard work. Preserves + // nul characters correctly. + NSData *cData = [theString dataUsingEncoding:stringEncoding allowLossyConversion:YES]; + NSUInteger cDataLength = [cData length]; + + // Create a buffer for mysql_real_escape_string to place the converted string into; + // the max length is 2*length (if every character was quoted) + 2 (quotes/terminator). + // Adding quotes in this way makes the logic below *slightly* harder to follow but + // makes the addition of the quotes almost free, which is much nicer when building + // lots of strings. + char *escBuffer = (char *)malloc((cDataLength * 2) + 2); + + // Use mysql_real_escape_string to perform the escape, starting one character in + NSUInteger escapedLength = mysql_real_escape_string(mySQLConnection, escBuffer+1, [cData bytes], cDataLength); + + // Set up an NSData object to allow conversion back to NSString while preserving + // any nul characters contained in the string. + NSData *escapedData; + if (includeQuotes) { + + // Add quotes if requested + escBuffer[0] = '\''; + escBuffer[escapedLength+1] = '\''; + + escapedData = [NSData dataWithBytesNoCopy:escBuffer length:escapedLength+2 freeWhenDone:NO]; + } else { + escapedData = [NSData dataWithBytesNoCopy:escBuffer+1 length:escapedLength freeWhenDone:NO]; + } + + // Convert to the string to return + NSString *escapedString = [[NSString alloc] initWithData:escapedData encoding:stringEncoding]; + + // Free up any memory and return + free(escBuffer); + return [escapedString autorelease]; +} + +/** + * Take NSData and hex-encodes the contents for safe transmission to a server, + * preserving all bytes whatever the encoding. Surrounds the hex-encoded resulting + * string with single quotes and precedes it with the hex-marker X for safe inclusion + * in a query. + */ +- (NSString *)escapeAndQuoteData:(NSData *)theData +{ + return SPMySQLConnectionEscapeData(self, theData, YES); +} + +/** + * Takes NSData and hex-encodes the contents for safe transmission to a server, + * preserving all bytes whatever the encoding. + * Allows control over whether to also wrap the string in single quotes and a + * preceding X (X'...') for safe use in queries. + */ +- (NSString *)escapeData:(NSData *)theData includingQuotes:(BOOL)includeQuotes +{ + + // Return nil datas as nil strings + if (!theData) return nil; + + NSUInteger dataLength = [theData length]; + + // Create a buffer for mysql_real_escape_string to place the converted string into; + // the max length is 2*length (if every character was quoted) + 3 (quotes/terminator). + // Adding quotes in this way makes the logic below *slightly* harder to follow but + // makes the addition of the quotes almost free, which is much nicer when building + // lots of strings. + char *hexBuffer = (char *)malloc((dataLength * 2) + 3); + + // Use mysql_hex_string to perform the escape, starting two characters in + NSUInteger hexLength = mysql_hex_string(hexBuffer+2, [theData bytes], dataLength); + + // Set up the return NSString + NSString *hexString; + if (includeQuotes) { + + // Add quotes if requested + hexBuffer[0] = 'X'; + hexBuffer[1] = '\''; + hexBuffer[hexLength+2] = '\''; + + hexString = [[NSString alloc] initWithBytes:hexBuffer length:hexLength+3 encoding:NSASCIIStringEncoding]; + } else { + hexString = [[NSString alloc] initWithBytes:hexBuffer+2 length:hexLength encoding:NSASCIIStringEncoding]; + } + + // Free up any memory and return + free(hexBuffer); + return [hexString autorelease]; +} + +#pragma mark - +#pragma mark Queries + +/** + * Run a query, provided as a string, on the active connection in the current connection + * encoding. Stores all the results before returning the complete result set. + */ +- (SPMySQLResult *)queryString:(NSString *)theQueryString +{ + return SPMySQLConnectionQueryString(self, theQueryString, stringEncoding, SPMySQLResultAsResult); +} + +/** + * Run a query, provided as a string, on the active connection in the current connection + * encoding. Returns the result as a fast streaming query set, where not all the results + * may be available at time of return. + */ +- (SPMySQLFastStreamingResult *)streamingQueryString:(NSString *)theQueryString +{ + return SPMySQLConnectionQueryString(self, theQueryString, stringEncoding, SPMySQLResultAsFastStreamingResult); +} + +/** + * Run a query, provided as a string, on the active connection in the current connection + * encoding. Returns the result as a streaming query set, where not all the results may + * be available at time of return. + * Supports a flag specifying whether streaming should be low-memory blocking (results are + * read from the server as the code retrives them, possibly blocking other queries on the + * server) or fast streaming (results are cached in the result object as fast as possible, + * freeing up the server even in the local rows are still being read from the result object). + * Will return a SPMySQLStreamingResult or SPMySQLFastStreamingResult as appropriate. + */ +- (id)streamingQueryString:(NSString *)theQueryString useLowMemoryBlockingStreaming:(BOOL)fullStreaming +{ + return SPMySQLConnectionQueryString(self, theQueryString, stringEncoding, fullStreaming?SPMySQLResultAsLowMemStreamingResult:SPMySQLResultAsFastStreamingResult); +} + +/** + * Run a query, provided as a string, on the active connection. The query and its result + * set are interpreted according to the supplied encoding, which should usually match + * the connection encoding. + * The result type desired can be specified, supporting either standard or streaming + * result sets. + */ +- (id)queryString:(NSString *)theQueryString usingEncoding:(NSStringEncoding)theEncoding withResultType:(SPMySQLResultType)theReturnType +{ + double queryExecutionTime; + lastQueryWasCancelled = NO; + lastQueryWasCancelledUsingReconnect = NO; + + // Check the connection state - if no connection is available, log an + // error and return. + if (state == SPMySQLDisconnected || state == SPMySQLConnecting) { + if ([delegate respondsToSelector:@selector(queryGaveError:connection:)]) { + [delegate queryGaveError:@"No connection available!" connection:self]; + } + if ([delegate respondsToSelector:@selector(noConnectionAvailable:)]) { + [delegate noConnectionAvailable:self]; + } + return nil; + } + + // Check the connection if necessary, returning nil if the query couldn't be validated + if (![self _checkConnectionIfNecessary]) return nil; + + // Determine whether a maximum query size needs to be restored from a previous query + if (queryActionShouldRestoreMaxQuerySize != NSNotFound) { + [self _restoreMaximumQuerySizeAfterQuery]; + } + + // If delegate logging is enabled, and the protocol is implemented, inform the delegate + if (delegateQueryLogging && delegateSupportsWillQueryString) { + [delegate willQueryString:theQueryString connection:self]; + } + + // Retrieve a C-style query string from the supplied NSString + NSUInteger cQueryStringLength; + const char *cQueryString = _cStringForStringWithEncoding(theQueryString, theEncoding, &cQueryStringLength); + + // Check the query length against the current maximum query length. If it is + // larger, the query would error (and probably cause a disconnect), so if + // the maximum size is editable, increase it and reconnect. + if (cQueryStringLength > maxQuerySize) { + queryActionShouldRestoreMaxQuerySize = maxQuerySize; + if (![self _attemptMaxQuerySizeIncreaseTo:(cQueryStringLength + 1024)]) { + queryActionShouldRestoreMaxQuerySize = NSNotFound; + return nil; + } + } + + // Prepare to enter a loop to run the query, allowing reattempts if appropriate + NSUInteger queryAttemptsAllowed = 1; + if (retryQueriesOnConnectionFailure) queryAttemptsAllowed++; + int queryStatus; + + // Lock the connection while it's actively in use + [self _lockConnection]; + + while (queryAttemptsAllowed > 0) { + + // While recording the overall execution time (including network lag!), run + // the raw query + uint64_t queryStartTime = mach_absolute_time(); + queryStatus = mysql_real_query(mySQLConnection, cQueryString, cQueryStringLength); + queryExecutionTime = _elapsedSecondsSinceAbsoluteTime(queryStartTime); + lastConnectionUsedTime = mach_absolute_time(); + + // If the query succeeded, no need to re-attempt. + if (!queryStatus) { + break; + + // If the query failed, determine whether to reattempt the query + } else { + + // Prevent retries if the query was cancelled or not a connection error + if (lastQueryWasCancelled && ![SPMySQLConnection isErrorIDConnectionError:mysql_errno(mySQLConnection)]) { + break; + } + } + + // Query has failed - check the connection + if (![self checkConnection]) { + [self _unlockConnection]; + return nil; + } + + queryAttemptsAllowed--; + } + + unsigned long long theAffectedRowCount = mysql_affected_rows(mySQLConnection); + id theResult = nil; + + // On success, if there is a query result, retrieve the result data type + if (!queryStatus && mysql_field_count(mySQLConnection)) { + MYSQL_RES *mysqlResult; + + switch (theReturnType) { + + // For standard result sets, retrieve all the results now, and afterwards + // update the affected row count. + case SPMySQLResultAsResult: + mysqlResult = mysql_store_result(mySQLConnection); + theResult = [[SPMySQLResult alloc] initWithMySQLResult:mysqlResult stringEncoding:theEncoding]; + theAffectedRowCount = mysql_affected_rows(mySQLConnection); + break; + + // For fast streaming and low memory streaming result sets, set up the result + case SPMySQLResultAsLowMemStreamingResult: + mysqlResult = mysql_use_result(mySQLConnection); + theResult = [[SPMySQLStreamingResult alloc] initWithMySQLResult:mysqlResult stringEncoding:theEncoding connection:self]; + break; + + case SPMySQLResultAsFastStreamingResult: + mysqlResult = mysql_use_result(mySQLConnection); + theResult = [[SPMySQLFastStreamingResult alloc] initWithMySQLResult:mysqlResult stringEncoding:theEncoding connection:self]; + break; + } + } + + // Record the error state now, as it may be affected by subsequent clean-up queries + NSString *theErrorMessage = [self _stringForCString:mysql_error(mySQLConnection)]; + NSUInteger theErrorID = mysql_errno(mySQLConnection); + + // If the query was cancelled, override the error state + if (lastQueryWasCancelled) { + theErrorMessage = NSLocalizedString(@"Query cancelled.", @"Query cancelled error"); + theErrorID = 1317; + } + + // Unlock the connection if appropriate - if not a streaming result type. + if (![theResult isKindOfClass:[SPMySQLStreamingResult class]]) { + [self _unlockConnection]; + + // Also perform restore if appropriate + if (queryActionShouldRestoreMaxQuerySize != NSNotFound) { + [self _restoreMaximumQuerySizeAfterQuery]; + } + } + + // Update error string and ID, and the rows affected + [self _updateLastErrorMessage:theErrorMessage]; + [self _updateLastErrorID:theErrorID]; + lastQueryAffectedRowCount = theAffectedRowCount; + + // Store the result time on the response object + [theResult _setQueryExecutionTime:queryExecutionTime]; + + return [theResult autorelease]; +} + +#pragma mark - +#pragma mark Query convenience functions + +/** + * Run a query and retrieve the entire result set as an array of dictionaries. + * Returns nil if there was a problem running the query or retrieving any results. + */ +- (NSArray *)getAllRowsFromQuery:(NSString *)theQueryString +{ + return [[self queryString:theQueryString] getAllRows]; +} + +/** + * Run a query and retrieve the first field of any response. Returns nil if there + * was a problem running the query or retrieving any results. + */ +- (id)getFirstFieldFromQuery:(NSString *)theQueryString +{ + return [[[self queryString:theQueryString] getRowAsArray] objectAtIndex:0]; +} + +#pragma mark - +#pragma mark Query information + +/** + * Returns the number of rows changed, deleted, inserted, or selected by + * the last query. + */ +- (unsigned long long)rowsAffectedByLastQuery +{ + return lastQueryAffectedRowCount; +} + +/** + * Returns the insert ID for the previous query which inserted a row. Note that + * this value persists through other SELECT/UPDATE etc queries. + */ +- (unsigned long long)lastInsertID +{ + return lastQueryInsertID; +} + +#pragma mark - +#pragma mark Retrieving connection and query error state + +/** + * Return whether the last query errored or not. + */ +- (BOOL)queryErrored +{ + return (queryErrorMessage)?YES:NO; +} + +/** + * If the last query (or connection) triggered an error, returns the error + * message as a string; if the last query did not error, nil is returned. + */ +- (NSString *)lastErrorMessage +{ + return queryErrorMessage; +} + +/** + * If the last query (or connection) triggered an error, returns the error + * ID; if the last query did not error, 0 is returned. + */ +- (NSUInteger)lastErrorID +{ + return queryErrorID; +} + +/** + * Determines whether a supplied error ID can be classed as a connection error. + */ ++ (BOOL)isErrorIDConnectionError:(NSUInteger)theErrorID +{ + switch (theErrorID) { + case 2001: // CR_SOCKET_CREATE_ERROR + case 2002: // CR_CONNECTION_ERROR + case 2003: // CR_CONN_HOST_ERROR + case 2004: // CR_IPSOCK_ERROR + case 2005: // CR_UNKNOWN_HOST + case 2006: // CR_SERVER_GONE_ERROR + case 2007: // CR_VERSION_ERROR + case 2009: // CR_WRONG_HOST_INFO + case 2012: // CR_SERVER_HANDSHAKE_ERR + case 2013: // CR_SERVER_LOST + case 2027: // CR_MALFORMED_PACKET + case 2032: // CR_DATA_TRUNCATED + case 2047: // CR_CONN_UNKNOW_PROTOCOL + case 2048: // CR_INVALID_CONN_HANDLE + case 2050: // CR_FETCH_CANCELED + case 2055: // CR_SERVER_LOST_EXTENDED + return YES; + } + + return NO; +} + +#pragma mark - +#pragma mark Query cancellation + +/** + * Cancel the currently running query. This tries to kill the current query, + * and if that isn't possible - for example, on MySQL < 5 or if the current user + * does not have the relevant permissions - resets the connection. + */ +- (void)cancelCurrentQuery +{ + + // If not connected, no action is required + if (state != SPMySQLConnected && state != SPMySQLDisconnecting) return; + + // Check whether a query is actually being performed - if not, return + if ([self _tryLockConnection]) { + [self _unlockConnection]; + return; + } + + // Mark that the last query was cancelled to prevent query retries from occurring + lastQueryWasCancelled = YES; + + // The query cancellation cannot occur on the connection actively running a query + // so set up a new connection to run the KILL command. + MYSQL *killerConnection = [self _makeRawMySQLConnectionWithEncoding:@"utf8" isMasterConnection:NO]; + + + // If the new connection was successfully set up, use it to run a KILL command. + if (killerConnection) { + NSStringEncoding aStringEncoding = [SPMySQLConnection stringEncodingForMySQLCharset:mysql_character_set_name(killerConnection)]; + BOOL killQuerySupported = [self serverVersionIsGreaterThanOrEqualTo:5 minorVersion:0 releaseVersion:0]; + + // Build the kill query + NSMutableString *killQuery = [NSMutableString stringWithString:@"KILL"]; + if (killQuerySupported) [killQuery appendString:@" QUERY"]; + [killQuery appendFormat:@" %lu", mySQLConnection->thread_id]; + + // Convert to a C string + NSUInteger killQueryCStringLength; + const char *killQueryCString = [SPMySQLConnection _cStringForString:killQuery usingEncoding:aStringEncoding returningLengthAs:&killQueryCStringLength]; + + // Run the query + int killQueryStatus = mysql_real_query(killerConnection, killQueryCString, killQueryCStringLength); + + // Close the temporary connection + mysql_close(killerConnection); + + // If the kill query succeeded, the active query was cancelled. + if (killQueryStatus == 0) { + + // On MySQL < 5, the entire connection will have been reset. Ensure it's + // restored. + if (!killQuerySupported) { + [self checkConnection]; + lastQueryWasCancelledUsingReconnect = YES; + } else { + lastQueryWasCancelledUsingReconnect = NO; + } + + // Ensure the tracking bool is re-set to cover encompassed queries and return + lastQueryWasCancelled = YES; + return; + } else { + NSLog(@"SPMySQL Framework: query cancellation failed due to cancellation query error (status %d)", killQueryStatus); + } + } else { + NSLog(@"SPMySQL Framework: query cancellation failed because connection failed"); + } + + // A full reconnect is required at this point to force a cancellation. As the + // connection may have finished processing the query at this point (depending how + // long the connection attempt took), check whether we can skip the reconnect. + if ([self _tryLockConnection]) { + [self _unlockConnection]; + return; + } + + if (state == SPMySQLDisconnecting) return; + + // Reset the connection with a reconnect. Unlock the connection beforehand, + // to allow the reconnect, but lock it again afterwards to restore the expected + // state (query execution process should unlock as appropriate). + [self _unlockConnection]; + [self reconnect]; + [self _lockConnection]; + + // Reset tracking bools to cover encompassed queries + lastQueryWasCancelled = YES; + lastQueryWasCancelledUsingReconnect = YES; +} + +/** + * Returns whether the last query was cancelled using cancelCurrentQuery. + */ +- (BOOL)lastQueryWasCancelled +{ + return lastQueryWasCancelled; +} + +/** + * If the last query was cancelled, returns whether that query cancellation + * required the connection to be reset or whether the query was successfully + * cancelled leaving the connection intact. + * If the last query was not cancelled, this will return NO. + */ +- (BOOL)lastQueryWasCancelledUsingReconnect +{ + return lastQueryWasCancelledUsingReconnect; +} + +@end + +#pragma mark - +#pragma mark Private API + +@implementation SPMySQLConnection (Querying_and_Preparation_Private_API) + +/** + * Retrieves all remaining results and discards them. + * This is necessary to correctly process multiple result sets on the connection - as + * we currently don't fully support multiple result, this at least allows the connection + * to function after running statements with multiple result sets. + */ +- (void)_flushMultipleResultSets +{ + + // Repeat as long as there are results + while (!mysql_next_result(mySQLConnection)) { + MYSQL_RES *eachResult = mysql_use_result(mySQLConnection); + + // Ensure the result is really a result + if (eachResult) { + + // Retrieve and discard all rows + while (mysql_fetch_row(eachResult)); + + // Free the result set + mysql_free_result(eachResult); + } + } +} + +/** + * Update the MySQL error message for this connection. If an error is supplied + * it will be stored and returned to anything asking the instance for the last + * error; if no error is supplied, the connection will be used to derive (or clear) + * the error string. + */ +- (void)_updateLastErrorMessage:(NSString *)theErrorMessage +{ + + // If an error message wasn't supplied, select one from the connection + if (!theErrorMessage) { + theErrorMessage = [self _stringForCString:mysql_error(mySQLConnection)]; + } + + // Clear the last error message stored on the instance + if (queryErrorMessage) [queryErrorMessage release], queryErrorMessage = nil; + + // If we have an error message *with a length*, update the instance error message + if (theErrorMessage && [theErrorMessage length]) { + queryErrorMessage = [[NSString alloc] initWithString:theErrorMessage]; + } +} + +/** + * Update the MySQL error ID for this connection. If an error ID is supplied, + * it will be stored and returned to anything asking the instance for the last + * error; if an NSNotFound error ID is supplied, the connection will be used to + * set the error ID. Note that an error ID of 0 corresponds to no error. + */ +- (void)_updateLastErrorID:(NSUInteger)theErrorID +{ + + // If NSNotFound was supplied as the ID, ask the connection for the last error + if (theErrorID == NSNotFound) { + queryErrorID = mysql_errno(mySQLConnection); + + // Otherwise, update the error ID with the supplied ID + } else { + queryErrorID = theErrorID; + } +} + +@end
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.h new file mode 100644 index 00000000..d8f5f183 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.h @@ -0,0 +1,50 @@ +// +// $Id$ +// +// Server Info.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +@class SPMySQLResult; + +@interface SPMySQLConnection (Server_Info) + +// Server version information +- (NSString *)serverVersionString; +- (NSUInteger)serverMajorVersion; +- (NSUInteger)serverMinorVersion; +- (NSUInteger)serverReleaseVersion; + +// Server version comparisons +- (BOOL)serverVersionIsGreaterThanOrEqualTo:(NSUInteger)aMajorVersion minorVersion:(NSUInteger)aMinorVersion releaseVersion:(NSUInteger)aReleaseVersion; + +// Server tasks & processes +- (SPMySQLResult *)listProcesses; +- (BOOL)killQueryOnThreadID:(unsigned long)theThreadID; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m new file mode 100644 index 00000000..f695d977 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m @@ -0,0 +1,175 @@ +// +// $Id$ +// +// Server Info.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +#import "Server Info.h" +#import "SPMySQL Private APIs.h" + +@implementation SPMySQLConnection (Server_Info) + +#pragma mark - +#pragma mark Server version information + +/** + * Return the server version string, or nil on failure. + */ +- (NSString *)serverVersionString +{ + if (serverVersionString) { + return [NSString stringWithString:serverVersionString]; + } + + return nil; +} + +/** + * Return the server major version or NSNotFound on failure + */ +- (NSUInteger)serverMajorVersion +{ + + if (serverVersionString != nil) { + NSString *s = [[serverVersionString componentsSeparatedByString:@"."] objectAtIndex:0]; + return (NSUInteger)[s integerValue]; + } + + return NSNotFound; +} + +/** + * Return the server minor version or NSNotFound on failure + */ +- (NSUInteger)serverMinorVersion +{ + if (serverVersionString != nil) { + NSString *s = [[serverVersionString componentsSeparatedByString:@"."] objectAtIndex:1]; + return (NSUInteger)[s integerValue]; + } + + return NSNotFound; +} + +/** + * Return the server release version or NSNotFound on failure + */ +- (NSUInteger)serverReleaseVersion +{ + if (serverVersionString != nil) { + NSString *s = [[serverVersionString componentsSeparatedByString:@"."] objectAtIndex:2]; + return (NSUInteger)[[[s componentsSeparatedByString:@"-"] objectAtIndex:0] integerValue]; + } + + return NSNotFound; +} + +#pragma mark - +#pragma mark Server version comparisons + +/** + * Returns whether the connected server version is greater than or equal to the + * supplied version number. Returns NO if no connection is active. + */ +- (BOOL)serverVersionIsGreaterThanOrEqualTo:(NSUInteger)aMajorVersion minorVersion:(NSUInteger)aMinorVersion releaseVersion:(NSUInteger)aReleaseVersion +{ + if (!serverVersionString) return NO; + + NSArray *serverVersionParts = [serverVersionString componentsSeparatedByString:@"."]; + + NSUInteger serverMajorVersion = (NSUInteger)[[serverVersionParts objectAtIndex:0] integerValue]; + if (serverMajorVersion < aMajorVersion) return NO; + if (serverMajorVersion > aMajorVersion) return YES; + + NSUInteger serverMinorVersion = (NSUInteger)[[serverVersionParts objectAtIndex:1] integerValue]; + if (serverMinorVersion < aMinorVersion) return NO; + if (serverMinorVersion > aMinorVersion) return YES; + + NSString *serverReleasePart = [serverVersionParts objectAtIndex:2]; + NSUInteger serverReleaseVersion = (NSUInteger)[[[serverReleasePart componentsSeparatedByString:@"-"] objectAtIndex:0] integerValue]; + if (serverReleaseVersion < aReleaseVersion) return NO; + return YES; +} + +#pragma mark - +#pragma mark Server tasks & processes + +/** + * Returns a result set describing the current server threads and their tasks. Note that + * the resulting process list defaults to the short form; run a manual SHOW FULL PROCESSLIST + * to retrieve tasks in non-truncated form. + * Returns nil on error. + */ +- (SPMySQLResult *)listProcesses +{ + if (state != SPMySQLConnected) return nil; + + // Check the connection if appropriate + if (![self _checkConnectionIfNecessary]) return nil; + + // Lock the connection before using it + [self _lockConnection]; + + // Get the process list + MYSQL_RES *mysqlResult = mysql_list_processes(mySQLConnection); + + // Convert to SPMySQLResult + SPMySQLResult *theResult = [[SPMySQLResult alloc] initWithMySQLResult:mysqlResult stringEncoding:stringEncoding]; + + // Unlock and return + [self _unlockConnection]; + return [theResult autorelease]; +} + +/** + * Kill the process with the supplied thread ID. On MySQL version 5 or later, this kills + * the query; on older servers this kills the entire connection. Note that the SUPER + * privilege is required to kill queries and processes not belonging to the currently + * connected user, while only PROCESS is required to see other user's processes. + * Returns a boolean indicating success or failure. + */ +- (BOOL)killQueryOnThreadID:(unsigned long)theThreadID +{ + + // Note that mysql_kill has been deprecated, so use a query to perform this task. + NSMutableString *killQuery = [NSMutableString stringWithString:@"KILL"]; + if ([self serverVersionIsGreaterThanOrEqualTo:5 minorVersion:0 releaseVersion:0]) { + [killQuery appendString:@" QUERY"]; + } + [killQuery appendFormat:@" %lu", theThreadID]; + + // Run the query + [self queryString:killQuery]; + + // Return a value based on whether the query errored or not + return ![self queryErrored]; +} + +@end
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h new file mode 100644 index 00000000..5d1a5d11 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h @@ -0,0 +1,177 @@ +// +// $Id$ +// +// SPMySQLConnection.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 8, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +@interface SPMySQLConnection : NSObject { + + // Delegate + NSObject <SPMySQLConnectionDelegate> *delegate; + BOOL delegateSupportsWillQueryString; + BOOL delegateSupportsConnectionLost; + BOOL delegateQueryLogging; // Defaults to YES if protocol implemented + + // Basic connection details + NSString *host; + NSString *username; + NSString *password; + NSUInteger port; + BOOL useSocket; + NSString *socketPath; + + // SSL connection details + BOOL useSSL; + NSString *sslKeyFilePath; + NSString *sslCertificatePath; + NSString *sslCACertificatePath; + + // MySQL connection details and state + struct st_mysql *mySQLConnection; + SPMySQLConnectionState state; + BOOL connectedWithSSL; + BOOL userTriggeredDisconnect; + BOOL isReconnecting; + uint64_t initialConnectTime; + unsigned long mysqlConnectionThreadId; + + // Connection proxy + NSObject <SPMySQLConnectionProxy> *proxy; + SPMySQLConnectionProxyState previousProxyState; + BOOL proxyStateChangeNotificationsIgnored; + + // Connection lock to prevent non-thread-safe query misuse + NSConditionLock *connectionLock; + + // Currently selected database + NSString *database; + + // Delegate connection lost decisions + NSUInteger reconnectionRetryAttempts; + SPMySQLConnectionLostDecision lastDelegateDecisionForLostConnection; + NSLock *delegateDecisionLock; + + // Timeout and keep-alive + NSUInteger timeout; + BOOL useKeepAlive; + NSTimer *keepAliveTimer; + CGFloat keepAliveInterval; + uint64_t lastKeepAliveTime; + NSUInteger keepAlivePingFailures; + pthread_t keepAlivePingThread; + BOOL keepAlivePingThreadActive; + BOOL keepAliveLastPingSuccess; + BOOL keepAliveLastPingBlocked; + + // Encoding details - and also a record of any previous encoding to allow + // switching back and forth + NSString *encoding; + NSStringEncoding stringEncoding; + BOOL encodingUsesLatin1Transport; + NSString *previousEncoding; + BOOL previousEncodingUsesLatin1Transport; + + // Server details + NSString *serverVersionString; + + // Error state for the last query or connection state + NSUInteger queryErrorID; + NSString *queryErrorMessage; + + // Query details + unsigned long long lastQueryAffectedRowCount; + unsigned long long lastQueryInsertID; + + // Query cancellation details + BOOL lastQueryWasCancelled; + BOOL lastQueryWasCancelledUsingReconnect; + + // Timing details + uint64_t lastConnectionUsedTime; + double lastQueryExecutionTime; + + // Maximum query size + NSUInteger maxQuerySize; + BOOL maxQuerySizeIsEditable; + BOOL maxQuerySizeEditabilityChecked; + NSUInteger queryActionShouldRestoreMaxQuerySize; + + // Queries + BOOL retryQueriesOnConnectionFailure; +} + +#pragma mark - +#pragma mark Synthesized properties + +@property (readwrite, assign, nonatomic) NSObject <SPMySQLConnectionDelegate> *delegate; +@property (readwrite, assign, nonatomic) NSObject <SPMySQLConnectionProxy> *proxy; + +@property (readwrite, retain) NSString *host; +@property (readwrite, retain) NSString *username; +@property (readwrite, retain) NSString *password; +@property (readwrite, assign) NSUInteger port; +@property (readwrite, assign) BOOL useSocket; +@property (readwrite, retain) NSString *socketPath; + +@property (readwrite, assign) BOOL useSSL; +@property (readwrite, retain) NSString *sslKeyFilePath; +@property (readwrite, retain) NSString *sslCertificatePath; +@property (readwrite, retain) NSString *sslCACertificatePath; + +@property (readwrite, assign) NSUInteger timeout; +@property (readwrite, assign) BOOL useKeepAlive; +@property (readwrite, assign) CGFloat keepAliveInterval; + +@property (readonly) unsigned long mysqlConnectionThreadId; +@property (readwrite, assign) BOOL retryQueriesOnConnectionFailure; + +@property (readwrite, assign) BOOL delegateQueryLogging; + +#pragma mark - +#pragma mark Connection and disconnection + +- (BOOL)connect; +- (BOOL)reconnect; +- (void)disconnect; + +#pragma mark - +#pragma mark Connection state + +- (BOOL)isConnected; +- (BOOL)isConnectedViaSSL; +- (BOOL)checkConnection; +- (double)timeConnected; +- (BOOL)userTriggeredDisconnect; + +#pragma mark - +#pragma mark Connection utility + ++ (NSString *)findSocketPath; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m new file mode 100644 index 00000000..4968266d --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m @@ -0,0 +1,834 @@ +// +// $Id$ +// +// SPMySQLConnection.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 8, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQL Private APIs.h" +#include <mach/mach_time.h> +#include <pthread.h> +#include <SystemConfiguration/SCNetworkReachability.h> + + +#pragma mark Class constants + +// The default connection options for MySQL connections +const NSUInteger SPMySQLConnectionOptions = + CLIENT_COMPRESS | // Enable protocol compression - almost always a win + CLIENT_INTERACTIVE | // Mark ourselves as an interactive client + CLIENT_MULTI_RESULTS; // Multiple result support (very basic, but present) + +// List of permissible ciphers to use for SSL connections +const char *SPMySQLSSLPermissibleCiphers = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RSA-AES128-SHA:AES128-SHA:AES256-RMD:AES128-RMD:DES-CBC3-RMD:DHE-RSA-AES256-RMD:DHE-RSA-AES128-RMD:DHE-RSA-DES-CBC3-RMD:RC4-SHA:RC4-MD5:DES-CBC3-SHA:DES-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC-SHA"; + + +@implementation SPMySQLConnection + +#pragma mark - +#pragma mark Synthesized properties + +@synthesize delegate; +@synthesize proxy; +@synthesize host; +@synthesize username; +@synthesize password; +@synthesize port; +@synthesize useSocket; +@synthesize socketPath; +@synthesize useSSL; +@synthesize sslKeyFilePath; +@synthesize sslCertificatePath; +@synthesize sslCACertificatePath; +@synthesize timeout; +@synthesize useKeepAlive; +@synthesize keepAliveInterval; +@synthesize mysqlConnectionThreadId; +@synthesize retryQueriesOnConnectionFailure; +@synthesize delegateQueryLogging; + +#pragma mark - +#pragma mark Initialisation and teardown + +/** + * Initialise the SPMySQLConnection object, setting up class defaults. + * + * Typically initialisation would be followed by setting the connection details + * and then calling -connect. + */ +- (id)init +{ + if ((self = [super init])) { + mySQLConnection = NULL; + state = SPMySQLDisconnected; + userTriggeredDisconnect = NO; + isReconnecting = NO; + mysqlConnectionThreadId = 0; + initialConnectTime = 0; + + port = 3306; + + // Default to socket connections if no other details have been provided + useSocket = YES; + + // Start with no proxy + proxy = nil; + proxyStateChangeNotificationsIgnored = NO; + + // Start with no selected database + database = nil; + + // Set a timeout of 30 seconds, with keepalive on and acting every sixty seconds + timeout = 30; + useKeepAlive = YES; + keepAliveInterval = 60; + keepAlivePingFailures = 0; + lastKeepAliveTime = 0; + keepAlivePingThread = NULL; + keepAlivePingThreadActive = NO; + keepAliveLastPingSuccess = NO; + keepAliveLastPingBlocked = NO; + + // Set up default encoding variables + encoding = [[NSString alloc] initWithString:@"utf8"]; + stringEncoding = NSUTF8StringEncoding; + encodingUsesLatin1Transport = NO; + previousEncoding = nil; + previousEncodingUsesLatin1Transport = NO; + + // Initialise default delegate settings + delegateSupportsWillQueryString = NO; + delegateSupportsConnectionLost = NO; + delegateQueryLogging = YES; + + // Delegate disconnection decisions + reconnectionRetryAttempts = 0; + lastDelegateDecisionForLostConnection = SPMySQLConnectionLostDisconnect; + delegateDecisionLock = [[NSLock alloc] init]; + + // Set up the connection lock + connectionLock = [[NSConditionLock alloc] initWithCondition:SPMySQLConnectionIdle]; + [connectionLock setName:@"SPMySQLConnection query lock"]; + + // Ensure the server detail records are initialised + serverVersionString = nil; + + // Start with a blank error state + queryErrorID = 0; + queryErrorMessage = nil; + + // Start with empty cancellation details + lastQueryWasCancelled = NO; + lastQueryWasCancelledUsingReconnect = NO; + + // Empty or reset the timing variables + lastConnectionUsedTime = 0; + lastQueryExecutionTime = 0; + + // Default to editable query size of 1MB + maxQuerySize = 1048576; + maxQuerySizeIsEditable = YES; + maxQuerySizeEditabilityChecked = NO; + queryActionShouldRestoreMaxQuerySize = NSNotFound; + + // Default to allowing queries to be automatically retried if the connection drops + // while running them + retryQueriesOnConnectionFailure = YES; + + // Start the ping keepalive timer + if ([NSThread isMainThread]) { + [self _initKeepAlivePingTimer]; + } else { + [self performSelectorOnMainThread:@selector(_initKeepAlivePingTimer) withObject:nil waitUntilDone:YES]; + } + } + + return self; +} + +/** + * Object deallocation. + */ +- (void) dealloc +{ + userTriggeredDisconnect = YES; + + // Unset the delegate + [self setDelegate:nil]; + + // Disconnect if appropriate (which should also disconnect any proxy) + [self disconnect]; + + // Clean up the connection proxy, if any + if (proxy) { + [proxy setConnectionStateChangeSelector:NULL delegate:nil]; + [proxy release]; + } + + // Ensure the query lock is unlocked, thereafter setting to nil in case of pending calls + if ([connectionLock condition] != SPMySQLConnectionIdle) { + [self _unlockConnection]; + } + [connectionLock release], connectionLock = nil; + + [encoding dealloc]; + if (previousEncoding) [previousEncoding release], previousEncoding = nil; + + if (database) [database release], database = nil; + if (serverVersionString) [serverVersionString release], serverVersionString = nil; + if (queryErrorMessage) [queryErrorMessage release], queryErrorMessage = nil; + [keepAliveTimer invalidate]; + [keepAliveTimer release]; + [delegateDecisionLock release]; + + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + + [super dealloc]; +} + +#pragma mark - +#pragma mark Connection and disconnection + +/** + * Trigger a connection to the specified host, if any, using any connection details + * that have been set. + * Returns whether the connection was successful. + */ +- (BOOL)connect +{ + + // If a connection is already active in some form, throw an exception + if (state != SPMySQLDisconnected) { + [NSException raise:NSInternalInconsistencyException format:@"Attempted to connect a connection that is not disconnected."]; + return NO; + } + state = SPMySQLConnecting; + + // Lock the connection for safety + [self _lockConnection]; + + // Attempt the connection + mySQLConnection = [self _makeRawMySQLConnectionWithEncoding:encoding isMasterConnection:YES]; + + // If the connection failed, reset state and return + if (!mySQLConnection) { + [self _unlockConnection]; + state = SPMySQLDisconnected; + return NO; + } + + // Successfully connected - record connected state and reset tracking variables + state = SPMySQLConnected; + userTriggeredDisconnect = NO; + reconnectionRetryAttempts = 0; + initialConnectTime = mach_absolute_time(); + mysqlConnectionThreadId = mySQLConnection->thread_id; + lastConnectionUsedTime = 0; + + // Update SSL state + connectedWithSSL = NO; + if (useSSL) connectedWithSSL = (mysql_get_ssl_cipher(mySQLConnection))?YES:NO; + if (useSSL && !connectedWithSSL) { + if ([delegate respondsToSelector:@selector(connectionFellBackToNonSSL:)]) { + [delegate connectionFellBackToNonSSL:self]; + } + } + + // Reset keepalive variables + lastKeepAliveTime = 0; + keepAlivePingFailures = 0; + + // Clear the connection error record + [self _updateLastErrorID:NSNotFound]; + [self _updateLastErrorMessage:nil]; + + // Unlock the connection + [self _unlockConnection]; + + // Update connection variables to be in sync with the server state. As this performs + // a query, ensure the connection is still up afterwards (!) + [self _updateConnectionVariables]; + if (state != SPMySQLConnected) return NO; + + // Update the maximum query size + [self _updateMaxQuerySize]; + + return YES; +} + +/** + * Reconnect to the currently "active" - but possibly disconnected - connection, using the + * stored details. + * Error checks extensively - if this method fails, it will ask how to proceed and loop depending + * on the status, not returning control until either a connection has been established or + * the connection and document have been closed. + * Runs its own autorelease pool as sometimes called in a thread following proxy changes + * (where the return code doesn't matter). + */ +- (BOOL)reconnect +{ + if (userTriggeredDisconnect) return NO; + + NSAutoreleasePool *reconnectionPool = [[NSAutoreleasePool alloc] init]; + + // Check whether a reconnection attempt is already being made - if so, wait + // and return the status of that reconnection attempt. This improves threaded + // use of the connection by preventing reconnect races. + if (isReconnecting) { + + // Loop in a panel runloop mode until the reconnection has processed; if an iteration + // takes less than the requested 0.1s, sleep instead. + while (isReconnecting) { + uint64_t loopIterationStart_t = mach_absolute_time(); + + [[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + if (_elapsedSecondsSinceAbsoluteTime(loopIterationStart_t) < 0.1) { + usleep(100000 - (useconds_t)(1000000 * _elapsedSecondsSinceAbsoluteTime(loopIterationStart_t))); + } + } + + [reconnectionPool drain]; + return (state == SPMySQLConnected); + } + + isReconnecting = YES; + + // Store certain details about the connection, so that if the reconnection is successful + // they can be restored. This has to be treated separately from _restoreConnectionDetails + // as a full connection reinitialises certain values from the server. + NSString *preReconnectEncoding = [NSString stringWithString:encoding]; + BOOL preReconnectEncodingUsesLatin1 = encodingUsesLatin1Transport; + NSString *preReconnectDatabase = nil; + if (database) preReconnectDatabase = [NSString stringWithString:database]; + + // If there is a connection proxy, temporarily disassociate the state change action + if (proxy) proxyStateChangeNotificationsIgnored = YES; + + // Close the connection if it's active + [self disconnect]; + + // Lock the connection while waiting for network and proxy + [self _lockConnection]; + + // If no network is present, wait for a short time for one to become available + [self _waitForNetworkConnectionWithTimeout:10]; + + // If there is a proxy, attempt to reconnect it in blocking fashion + if (proxy) { + uint64_t loopIterationStart_t, proxyWaitStart_t; + + // If the proxy is not yet idle after requesting a disconnect, wait for a short time + // to allow it to disconnect. + if ([proxy state] != SPMySQLProxyIdle) { + + proxyWaitStart_t = mach_absolute_time(); + while ([proxy state] != SPMySQLProxyIdle) { + loopIterationStart_t = mach_absolute_time(); + + // If the connection timeout has passed, break out of the loop + if (_elapsedSecondsSinceAbsoluteTime(proxyWaitStart_t) > timeout) break; + + // Allow events to process for 0.25s, sleeping to completion on early return + [[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; + if (_elapsedSecondsSinceAbsoluteTime(loopIterationStart_t) < 0.25) { + usleep(250000 - (useconds_t)(1000000 * _elapsedSecondsSinceAbsoluteTime(loopIterationStart_t))); + } + } + } + + // Request that the proxy re-establishes its connection + [proxy connect]; + + // Wait while the proxy connects + proxyWaitStart_t = mach_absolute_time(); + while (1) { + loopIterationStart_t = mach_absolute_time(); + + // If the proxy has connected, record the new local port and break out of the loop + if ([proxy state] == SPMySQLProxyConnected) { + port = [proxy localPort]; + break; + } + + // If the proxy connection attempt time has exceeded the timeout, break of of the loop. + if (_elapsedSecondsSinceAbsoluteTime(proxyWaitStart_t) > (timeout + 1)) { + [proxy disconnect]; + break; + } + + // Process events for a short time, allowing dialogs to be shown but waiting for + // the proxy. Capture how long this interface action took, standardising the + // overall time. + [[NSRunLoop mainRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; + if (_elapsedSecondsSinceAbsoluteTime(loopIterationStart_t) < 0.25) { + usleep((useconds_t)(250000 - (1000000 * _elapsedSecondsSinceAbsoluteTime(loopIterationStart_t)))); + } + + // Extend the connection timeout by any interface time + if ([proxy state] == SPMySQLProxyWaitingForAuth) { + proxyWaitStart_t += mach_absolute_time() - loopIterationStart_t; + } + } + + // Having in theory performed the proxy connect, update state + previousProxyState = [proxy state]; + proxyStateChangeNotificationsIgnored = NO; + } + + // Unlock the connection + [self _unlockConnection]; + + // If not using a proxy, or if the proxy successfully connected, trigger a connection + if (!proxy || [proxy state] == SPMySQLProxyConnected) { + [self connect]; + } + + // If the connection failed, retry the reconnection or cancel as appropriate. + if (state != SPMySQLConnected) { + + // Default to attempting another reconnect + SPMySQLConnectionLostDecision connectionLostDecision = SPMySQLConnectionLostReconnect; + + // If the delegate supports the decision process, ask it how to proceed + if (delegateSupportsConnectionLost) { + connectionLostDecision = [self _delegateDecisionForLostConnection]; + + // Otherwise default to reconnect, but only a set number of times to prevent a runaway loop + } else { + if (reconnectionRetryAttempts < 5) { + connectionLostDecision = SPMySQLConnectionLostReconnect; + } else { + connectionLostDecision = SPMySQLConnectionLostDisconnect; + } + reconnectionRetryAttempts++; + } + + switch (connectionLostDecision) { + case SPMySQLConnectionLostDisconnect: + [self _updateLastErrorMessage:NSLocalizedString(@"User triggered disconnection", @"User triggered disconnection")]; + userTriggeredDisconnect = YES; + isReconnecting = NO; + [reconnectionPool release]; + return NO; + default: + isReconnecting = NO; + [reconnectionPool release]; + return [self reconnect]; + } + } + + // If the connection was successfully established, restore the connection + // state if appropriate. + if (preReconnectDatabase) { + [self selectDatabase:preReconnectDatabase]; + } + [self setEncoding:preReconnectEncoding]; + [self setEncodingUsesLatin1Transport:preReconnectEncodingUsesLatin1]; + + isReconnecting = NO; + [reconnectionPool release]; + return YES; +} + +/** + * Trigger a disconnection if the connection is currently active. + */ +- (void)disconnect +{ + + // Only continue if a connection is active + if (state != SPMySQLConnected && state != SPMySQLConnecting) return; + state = SPMySQLDisconnecting; + + // If a query is active, cancel it + [self cancelCurrentQuery]; + + // Allow any pings or cancelled queries to complete, inside a time limit of ten seconds + uint64_t disconnectStartTime_t = mach_absolute_time(); + do { + usleep(100000); + if (_elapsedSecondsSinceAbsoluteTime(disconnectStartTime_t) > 10) break; + } while (![self _tryLockConnection]); + [self _unlockConnection]; + if (keepAlivePingThread != NULL) pthread_cancel(keepAlivePingThread), keepAlivePingThread = NULL; + + // Close the underlying MySQL connection if it still appears to be active, and not reading + // or writing. While this may result in a leak of the MySQL object, it prevents crashes + // due to attempts to close a blocked/stuck connection. + if (!mySQLConnection->net.reading_or_writing && mySQLConnection->net.vio && mySQLConnection->net.buff) { + mysql_close(mySQLConnection); + } + mySQLConnection = NULL; + + // If using a connection proxy, disconnect that too + if (proxy) { + [proxy performSelectorOnMainThread:@selector(disconnect) withObject:nil waitUntilDone:YES]; + } + + // Clear host-specific information + if (serverVersionString) [serverVersionString release], serverVersionString = nil; + if (database) [database release], database = nil; + + state = SPMySQLDisconnected; +} + +#pragma mark - +#pragma mark Connection state + +/** + * Retrieve whether the connection instance is connected to the remote host. + * Returns NO if the connection is still in process, YES if a disconnection is + * being actively performed. + */ +- (BOOL)isConnected +{ + return (state == SPMySQLConnected || state == SPMySQLDisconnecting); +} + +/** + * Returns YES if the MCPConnection is connected to a server via SSL, NO otherwise. + */ +- (BOOL)isConnectedViaSSL +{ + if (![self isConnected]) return NO; + return connectedWithSSL; +} + +/** + * Checks whether the connection to the server is still active. This verifies + * the connection using a ping, and if the connection is found to be down attempts + * to quickly restore it, including the previous state. + */ +- (BOOL)checkConnection +{ + + // If the connection is not seen as active, don't proceed + if (state != SPMySQLConnected) return NO; + + // Similarly, if the connection is currently locked, that indicates it's in use. This + // could be because queries are actively being run, or that a ping is running. + if ([connectionLock condition] == SPMySQLConnectionBusy) { + + // If a ping thread is not active queries are being performed - return success. + if (!keepAlivePingThreadActive) return YES; + + // If a ping thread is active, wait for it to complete before checking the connection + while (keepAlivePingThreadActive) { + usleep(10000); + } + } + + // Confirm whether the connection is still responding by using a ping + BOOL connectionVerified = [self _pingConnectionUsingLoopDelay:400]; + + // If the connection didn't respond, trigger a reconnect. This will automatically + // attempt to reconnect once, and if that fails will ask the user how to proceed - whether + // to keep reconnecting, or whether to disconnect. + if (!connectionVerified) { + connectionVerified = [self reconnect]; + } + + return connectionVerified; +} + +/** + * Retrieve the time elapsed since the connection was established, in seconds. + * This time is retrieved in a monotonically increasing fashion and is high + * precision; it is used internally for query timing, and is reset on reconnections. + * If no connection is currently active, returns -1. + */ +- (double)timeConnected +{ + if (initialConnectTime == 0) return -1; + + return _elapsedSecondsSinceAbsoluteTime(initialConnectTime); +} + +/** + * Returns YES if the user chose to disconnect at the last "connection failure" + * prompt, NO otherwise. This can be used to alter behaviour in response to state + * changes. + */ +- (BOOL)userTriggeredDisconnect +{ + return userTriggeredDisconnect; +} + +#pragma mark - +#pragma mark General connection utilities + ++ (NSString *)findSocketPath +{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + + NSArray *possibleSocketLocations = [NSArray arrayWithObjects: + @"/tmp/mysql.sock", // Default + @"/Applications/MAMP/tmp/mysql/mysql.sock", // MAMP default location + @"/Applications/xampp/xamppfiles/var/mysql/mysql.sock", // XAMPP default location + @"/var/mysql/mysql.sock", // Mac OS X Server default + @"/opt/local/var/run/mysqld/mysqld.sock", // Darwinports MySQL + @"/opt/local/var/run/mysql4/mysqld.sock", // Darwinports MySQL 4 + @"/opt/local/var/run/mysql5/mysqld.sock", // Darwinports MySQL 5 + @"/usr/local/zend/mysql/tmp/mysql.sock", // Zend Server CE (see Issue #1251) + @"/var/run/mysqld/mysqld.sock", // As used on Debian/Gentoo + @"/var/tmp/mysql.sock", // As used on FreeBSD + @"/var/lib/mysql/mysql.sock", // As used by Fedora + @"/opt/local/lib/mysql/mysql.sock", // Alternate fedora + nil]; + + for (NSUInteger i = 0; i < [possibleSocketLocations count]; i++) { + if ([fileManager fileExistsAtPath:[possibleSocketLocations objectAtIndex:i]]) + return [possibleSocketLocations objectAtIndex:i]; + } + + return nil; +} + +@end + +#pragma mark - +#pragma mark Private API + +@implementation SPMySQLConnection (PrivateAPI) + +/** + * Make a connection using the class connection settings, returning a MySQL + * connection object on success. + */ +- (MYSQL *)_makeRawMySQLConnectionWithEncoding:(NSString *)encodingName isMasterConnection:(BOOL)isMaster +{ + + // Set up the MySQL connection object + MYSQL *theConnection = mysql_init(NULL); + if (!theConnection) return NULL; + + // Disable automatic reconnection, as it's handled in-framework to preserve + // options, encodings and connection state. + my_bool falseMyBool = FALSE; + mysql_options(theConnection, MYSQL_OPT_RECONNECT, &falseMyBool); + + // Set the connection timeout + mysql_options(theConnection, MYSQL_OPT_CONNECT_TIMEOUT, (const void *)&timeout); + + // Set the connection encoding + mysql_options(theConnection, MYSQL_SET_CHARSET_NAME, [encodingName UTF8String]); + + // Set up the connection variables in the format MySQL needs, from the class-wide variables + const char *theHost = NULL; + const char *theUsername = ""; + const char *thePassword = NULL; + const char *theSocket = NULL; + + if (host) theHost = [self _cStringForString:host]; + if (username) theUsername = [self _cStringForString:username]; + + // If a password was supplied, use it; otherwise ask the delegate if appropriate + if (password) { + thePassword = [self _cStringForString:password]; + } else if ([delegate respondsToSelector:@selector(keychainPasswordForConnection:)]) { + thePassword = [self _cStringForString:[delegate keychainPasswordForConnection:self]]; + } + + // If set to use a socket and a socket was supplied, use it; otherwise, search for a socket to use + if (useSocket) { + if (socketPath) { + theSocket = [self _cStringForString:socketPath]; + } else { + theSocket = [self _cStringForString:[SPMySQLConnection findSocketPath]]; + } + } + + // Apply SSL if appropriate + if (useSSL) { + const char *theSSLKeyFilePath = NULL; + const char *theSSLCertificatePath = NULL; + const char *theCACertificatePath = NULL; + + if (sslKeyFilePath) { + theSSLKeyFilePath = [[sslKeyFilePath stringByExpandingTildeInPath] UTF8String]; + } + if (sslCertificatePath) { + theSSLCertificatePath = [[sslCertificatePath stringByExpandingTildeInPath] UTF8String]; + } + if (sslCACertificatePath) { + theCACertificatePath = [[sslCACertificatePath stringByExpandingTildeInPath] UTF8String]; + } + + mysql_ssl_set(theConnection, theSSLKeyFilePath, theSSLCertificatePath, theCACertificatePath, NULL, SPMySQLSSLPermissibleCiphers); + } + + MYSQL *connectionStatus = mysql_real_connect(theConnection, theHost, theUsername, thePassword, NULL, (unsigned int)port, theSocket, SPMySQLConnectionOptions); + + // If the connection failed, return NULL + if (theConnection != connectionStatus) { + + // If the connection is the master connection, record the error state + if (isMaster) { + [self _updateLastErrorMessage:[self _stringForCString:mysql_error(theConnection)]]; + [self _updateLastErrorID:mysql_errno(theConnection)]; + } + + return NULL; + } + + // Ensure automatic reconnection is disabled for older versions + theConnection->reconnect = 0; + + // Successful connection - return the handle + return theConnection; +} + +/** + * Loop while a connection isn't available; allows blocking while the network is disconnected + * or still connecting (eg Airport still coming up after sleep). + */ +- (BOOL)_waitForNetworkConnectionWithTimeout:(double)timeoutSeconds +{ + BOOL hostReachable; + Boolean flagsValid; + SCNetworkReachabilityRef reachabilityTarget; + SCNetworkConnectionFlags reachabilityStatus; + + // Set up the reachability target - the host is not important, and is not connected to. + reachabilityTarget = SCNetworkReachabilityCreateWithName(NULL, "dev.mysql.com"); + + // In a loop until success or the timeout, test reachability + uint64_t loopStart_t = mach_absolute_time(); + while (1) { + + // Check reachability + flagsValid = SCNetworkReachabilityGetFlags(reachabilityTarget, &reachabilityStatus); + + hostReachable = flagsValid ? YES : NO; + + // Ensure that the network is reachable + if (hostReachable && !(reachabilityStatus & kSCNetworkFlagsReachable)) hostReachable = NO; + + // Ensure that Airport is up/connected if present + if (hostReachable && (reachabilityStatus & kSCNetworkFlagsConnectionRequired)) hostReachable = NO; + + // If the host *is* reachable, return success + if (hostReachable) return YES; + + // If the timeout has been exceeded, break out of the loop + if (_elapsedSecondsSinceAbsoluteTime(loopStart_t) >= timeoutSeconds) break; + + // Sleep before the next loop iteration + usleep(250000); + } + + // All checks failed - return failure + return NO; +} + +/** + * Update connection variables from the server, collecting state and ensuring + * settings like encoding are in sync. + */ +- (void)_updateConnectionVariables +{ + if (state != SPMySQLConnected && state != SPMySQLConnecting) return; + + // Retrieve all variables from the server in a single query + SPMySQLResult *theResult = [self queryString:@"SHOW VARIABLES"]; + if (![theResult numberOfRows]) return; + + // SHOW VARIABLES can return binary results on certain MySQL 4 versions; ensure string output + [theResult setReturnDataAsStrings:YES]; + + // Convert the result set into a variables dictionary + [theResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; + NSMutableDictionary *variables = [NSMutableDictionary new]; + for (NSArray *variableRow in theResult) { + [variables setObject:[variableRow objectAtIndex:1] forKey:[variableRow objectAtIndex:0]]; + } + + // Copy the server version string to the instance variable + if (serverVersionString) [serverVersionString release], serverVersionString = nil; + serverVersionString = [[variables objectForKey:@"version"] retain]; + + // Get the connection encoding. Although a specific encoding may have been requested on + // connection, it may be overridden by init_connect commands or connection state changes. + // Default to latin1 for older server versions. + NSString *retrievedEncoding = @"latin1"; + if ([variables objectForKey:@"character_set_results"]) { + retrievedEncoding = [variables objectForKey:@"character_set_results"]; + } else if ([variables objectForKey:@"character_set"]) { + retrievedEncoding = [variables objectForKey:@"character_set"]; + } + + // Update instance variables + if (encoding) [encoding release]; + encoding = [[NSString alloc] initWithString:retrievedEncoding]; + stringEncoding = [SPMySQLConnection stringEncodingForMySQLCharset:[self _cStringForString:encoding]]; + encodingUsesLatin1Transport = NO; + + // Check the interactive timeout - if it's below five minutes, increase it to ten + // to imprive timeout/keepalive behaviour + if ([variables objectForKey:@"interactive_timeout"]) { + if ([[variables objectForKey:@"interactive_timeout"] integerValue] < 300) { + [self queryString:@"SET interactive_timeout=600"]; + } + } + + [variables release]; +} + +/** + * Restore the connection encoding details as necessary based on previously set + * details. + */ +- (void)_restoreConnectionVariables +{ + mysqlConnectionThreadId = mySQLConnection->thread_id; + initialConnectTime = mach_absolute_time(); + + [self selectDatabase:database]; + + [self setEncoding:encoding]; + [self setEncodingUsesLatin1Transport:encodingUsesLatin1Transport]; +} + +/** + * If thirty seconds have passed since the last time the connection was + * used, check the connection. + * This minimises the impact of continuous additional connection checks - + * each of which requires a round trip to the server - but handles most + * network issues. + * Returns whether the connection is considered still valid. + */ +- (BOOL)_checkConnectionIfNecessary +{ + + // If the connection was recently used, return success + if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 30) return YES; + + // Otherwise check the connection + return [self checkConnection]; +} +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnectionDelegate.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnectionDelegate.h new file mode 100644 index 00000000..97e94170 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnectionDelegate.h @@ -0,0 +1,108 @@ +// +// $Id$ +// +// SPMySQLConnectionDelegate.h +// SPMySQLFramework +// +// Created by Stuart Connolly (stuconnolly.com) on October 20, 2010. +// Copyright (c) 2010 Stuart Connolly. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQLConstants.h" + +@protocol SPMySQLConnectionDelegate <NSObject> +@optional + +/** + * Notifies the delegate that a query will be performed. + * + * @param query The query string that will be sent to the MySQL server + * @param connection The connection instance performing the query + */ +- (void)willQueryString:(NSString *)query connection:(id)connection; + +/** + * Notifies the delegate that a query that was just performed gave + * an error. + * + * @param error The query error, as a string + * @param connection The connection instance which received the error + */ +- (void)queryGaveError:(NSString *)error connection:(id)connection; + +/** + * Notifies the delegate that it should display the supplied error. + * The connection may sometimes want to notify the user directly + * about certain issues, and will use this method to allow the + * delegate to do so. + * + * @param title The title of the message to display to the user + * @param message The main text of the message to display to the user + */ +- (void)showErrorWithTitle:(NSString *)title message:(NSString *)message; + +/** + * Requests the keychain password for the connection. + * When a connection is being made to a server, it is best not to + * set the password on the class; instead, it should be kept within + * the secure store, and the other connection details (user, host) + * can be used to look it up and supplied on demand. + * + * @param connection The connection instance to supply the password for + */ +- (NSString *)keychainPasswordForConnection:(id)connection; + +/** + * Notifies the delegate that no underlying connection is available, + * typically when the connection has been asked to perform a query + * or some other action for which a connection must be present. + * Those actions will still return false or error states as appropriate, + * but the delegate may wish to perform actions as a result of a total + * loss of connection. + * + * @param connection The connection instance which has lost the connection to the host + */ +- (void)noConnectionAvailable:(id)connection; + +/** + * Notifies the delegate that although a SSL connection was requested, + * MySQL made the connection without using SSL. This can happen because + * the server connected to doesn't support SSL or had it disabled, or + * that insufficient details were provided to make the connection over + * SSL. + */ +- (void)connectionFellBackToNonSSL:(id)connection; + +/** + * Notifies the delegate that the connection has been temporarily lost, + * and asks the delegate for guidance on how to proceed. If the delegate + * does not implement this method, reconnections will automatically be + * attempted - up to a small limit of attempts. + * + * @param connection The connection instance that requires a decision on how to proceed + */ +- (SPMySQLConnectionLostDecision)connectionLost:(id)connection; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnectionProxy.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnectionProxy.h new file mode 100644 index 00000000..2da553c6 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnectionProxy.h @@ -0,0 +1,77 @@ +// +// $Id$ +// +// SPMySQLConnectionProxy.h +// SPMySQLFramework +// +// Created by Stuart Connolly (stuconnolly.com) on July 2, 2009. +// Copyright (c) 2009 Stuart Connolly. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +/** + * Connection proxy state constants. + */ +typedef enum { + SPMySQLProxyIdle = 0, + SPMySQLProxyConnecting = 1, + SPMySQLProxyWaitingForAuth = 2, + SPMySQLProxyConnected = 3, + SPMySQLProxyForwardingFailed = 4 +} SPMySQLConnectionProxyState; + + +@protocol SPMySQLConnectionProxy <NSObject> + +/** + * All the methods for this protocol are required. + */ + +/** + * Connect the proxy. + */ +- (void)connect; + +/** + * Disconnect the proxy. + */ +- (void)disconnect; + +/** + * Get the current state of the proxy. + */ +- (SPMySQLConnectionProxyState)state; + +/** + * Get the local port being provided by the proxy. + */ +- (NSUInteger)localPort; + +/** + * Sets the method the proxy should call whenever the state of the connection changes. + */ +- (BOOL)setConnectionStateChangeSelector:(SEL)theStateChangeSelector delegate:(id)theDelegate; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConstants.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConstants.h new file mode 100644 index 00000000..b1689569 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConstants.h @@ -0,0 +1,76 @@ +// +// $Id$ +// +// SPMySQLConstants.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 14, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +// Connection state +typedef enum { + SPMySQLDisconnected = 0, + SPMySQLConnecting = 1, + SPMySQLConnected = 2, + SPMySQLDisconnecting = 3 +} SPMySQLConnectionState; + +// Connection lock state +typedef enum { + SPMySQLConnectionIdle = 0, + SPMySQLConnectionBusy = 1 +} SPMySQLConnectionLockState; + +// Decision on how to handle lost connections +// Connection check constants +typedef enum { + SPMySQLConnectionLostDisconnect = 0, + SPMySQLConnectionLostReconnect = 1 +} SPMySQLConnectionLostDecision; + +// Result set row types +typedef enum { + SPMySQLResultRowAsDefault = 0, + SPMySQLResultRowAsArray = 1, + SPMySQLResultRowAsDictionary = 2 +} SPMySQLResultRowType; + +// Result charset list +typedef struct { + NSUInteger nr; + const char *name; + const char *collation; + NSUInteger char_minlen; + NSUInteger char_maxlen; +} SPMySQLResultCharset; + +// Query result types +typedef enum { + SPMySQLResultAsResult = 0, + SPMySQLResultAsFastStreamingResult = 1, + SPMySQLResultAsLowMemStreamingResult = 2 +} SPMySQLResultType; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLFastStreamingResult.h b/Frameworks/SPMySQLFramework/Source/SPMySQLFastStreamingResult.h new file mode 100644 index 00000000..a4f07cdd --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLFastStreamingResult.h @@ -0,0 +1,47 @@ +// +// $Id$ +// +// SPMySQLFastStreamingResult.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 2, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLFastStreamingResult : SPMySQLStreamingResult { + + // Linked list setup + struct st_spmysqlstreamingrowdata *currentDataStoreEntry; + struct st_spmysqlstreamingrowdata *lastDataStoreEntry; + + // Additional counts and memory length tracking + NSUInteger processedRowCount; + + // Thread safety + pthread_mutex_t dataLock; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLFastStreamingResult.m b/Frameworks/SPMySQLFramework/Source/SPMySQLFastStreamingResult.m new file mode 100644 index 00000000..8ba55134 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLFastStreamingResult.m @@ -0,0 +1,405 @@ +// +// $Id$ +// +// SPMySQLFastStreamingResult.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 2, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQLFastStreamingResult.h" +#import "SPMySQL Private APIs.h" +#import "SPMySQLArrayAdditions.h" +#include <pthread.h> + +static id NSNullPointer; + +/** + * This type of streaming result operates in a multithreaded fashion - a worker + * thread is set up to download the results as fast as possible in the background, + * while the results are made available via blocking (and so single-thread-compatible) + * calls. This provides the benefit of allowing a progress bar to be shown during + * downloads, and threaded processing, but still has reasonable memory usage for the + * downloaded result - and won't block the server. + */ + +typedef struct st_spmysqlstreamingrowdata { + char *data; + unsigned long *dataLengths; + struct st_spmysqlstreamingrowdata *nextRow; +} SPMySQLStreamingRowData; + +@interface SPMySQLFastStreamingResult (Private_API) + +- (void) _downloadAllData; + +@end + +#pragma mark - + +@implementation SPMySQLFastStreamingResult + +#pragma mark - + +/** + * In the one-off class initialisation, cache static variables + */ ++ (void)initialize +{ + + // Cached NSNull singleton reference + if (!NSNullPointer) NSNullPointer = [NSNull null]; +} + +/** + * Standard init method, constructing the SPMySQLStreamingResult around a MySQL + * result pointer and the encoding to use when working with the data. + * As opposed to SPMySQLResult, defaults to returning rows as arrays, as the result + * sets are likely to be larger and processed in loops. + */ +- (id)initWithMySQLResult:(void *)theResult stringEncoding:(NSStringEncoding)theStringEncoding connection:(SPMySQLConnection *)theConnection +{ + + // If no result set was passed in, return nil. + if (!theResult) return nil; + + if ((self = [super initWithMySQLResult:theResult stringEncoding:theStringEncoding connection:theConnection])) { + + // Initialise the extra streaming result counts and tracking + processedRowCount = 0; + + // Initialise the linked list pointers + currentDataStoreEntry = NULL; + lastDataStoreEntry = NULL; + + // Set up the linked list lock + pthread_mutex_init(&dataLock, NULL); + + // Start the data download thread + [NSThread detachNewThreadSelector:@selector(_downloadAllData) toTarget:self withObject:nil]; + } + + return self; +} + +/** + * Deallocate the result and ensure the parent connection is unlocked for further use. + */ +- (void)dealloc +{ + + // Ensure all data is processed and the parent connection is unlocked + [self cancelResultLoad]; + + // Destroy the linked list lock + pthread_mutex_destroy(&dataLock); + + // Call dealloc on super to clean up everything else, and to throw an exception if + // the parent connection hasn't been cleaned up correctly. + [super dealloc]; +} + +#pragma mark - +#pragma mark Data retrieval + +/** + * Override the convenience selectors so that forwarding works correctly. + */ +- (id)getRow +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsDefault); +} +- (NSArray *)getRowAsArray +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsArray); +} +- (NSDictionary *)getRowAsDictionary +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsDictionary); +} + +/** + * Retrieve the next row in the result set, using the internal pointer, in the specified + * return format. + * If there are no rows remaining in the current iteration, returns nil. + */ +- (id)getRowAsType:(SPMySQLResultRowType)theType +{ + NSUInteger copiedDataLength = 0; + char *theRowData; + unsigned long *fieldLengths; + id theReturnData; + + // If the target type was unspecified, use the instance default + if (theType == SPMySQLResultRowAsDefault) theType = defaultRowReturnType; + + // Set up the return data as appropriate + if (theType == SPMySQLResultRowAsArray) { + theReturnData = [NSMutableArray arrayWithCapacity:numberOfFields]; + } else { + theReturnData = [NSMutableDictionary dictionaryWithCapacity:numberOfFields]; + } + + // Lock the data mutex for safe access of variables and counters + pthread_mutex_lock(&dataLock); + + // Determine whether any data is available; if not, wait 1ms before trying again + while (!dataDownloaded && processedRowCount == downloadedRowCount) { + pthread_mutex_unlock(&dataLock); + usleep(1000); + pthread_mutex_lock(&dataLock); + } + + // If all rows have been processed, the end of the result set has been reached; return nil. + if (processedRowCount == downloadedRowCount) { + pthread_mutex_unlock(&dataLock); + return nil; + } + + // Unlock the data mutex now checks are complete + pthread_mutex_unlock(&dataLock); + + // Get a reference to the data for the current row; this is safe to do outside the lock + // as the pointer won't change until markers are changed at the end of this process + theRowData = currentDataStoreEntry->data; + fieldLengths = currentDataStoreEntry->dataLengths; + + // Convert each of the cells in the row in turn + unsigned long fieldLength; + id cellData; + char *rawCellData; + for (NSUInteger i = 0; i < numberOfFields; i++) { + fieldLength = fieldLengths[i]; + + // If the length of this cell is NSNotFound, it's a null reference + if (fieldLength == NSNotFound) { + cellData = nil; + + // Otherwise grab a reference to that data using pointer arithmetic + } else { + rawCellData = theRowData + copiedDataLength; + copiedDataLength += fieldLength; + + // Convert to the correct object type + cellData = SPMySQLResultGetObject(self, rawCellData, fieldLength, fieldTypes[i], i); + } + + // If object creation failed, display a null + if (!cellData) cellData = NSNullPointer; + + // Add to the result array/dictionary + if (theType == SPMySQLResultRowAsArray) { + SPMySQLMutableArrayInsertObject(theReturnData, cellData, i); + } else { + [(NSMutableDictionary *)theReturnData setObject:cellData forKey:fieldNames[i]]; + } + } + + // Get a reference to the current item + SPMySQLStreamingRowData *previousDataStoreEntry = currentDataStoreEntry; + + // Lock the mutex before updating counters and linked lists + pthread_mutex_lock(&dataLock); + + // Update the active-data pointer to the next item in the list (which may be NULL) + currentDataStoreEntry = currentDataStoreEntry->nextRow; + if (!currentDataStoreEntry) lastDataStoreEntry = NULL; + + // Increment the processed counter and row index + processedRowCount++; + currentRowIndex++; + if (dataDownloaded && processedRowCount == downloadedRowCount) currentRowIndex = NSNotFound; + + // Unlock the mutex + pthread_mutex_unlock(&dataLock); + + // Free the memory for the processed row + free(previousDataStoreEntry->dataLengths); + if (previousDataStoreEntry->data != NULL) free(previousDataStoreEntry->data); + free(previousDataStoreEntry); + + return theReturnData; +} + +/* + * Ensure the result set is fully processed and freed without any processing + * This method ensures that the connection is unlocked. + */ +- (void)cancelResultLoad +{ + + // If data has already been downloaded successfully, no further action is required + if (dataDownloaded && processedRowCount == downloadedRowCount) return; + + // Loop until all data is fetched and freed + while (1) { + + // Check to see whether we need to wait for the data to be available + // - if so, wait 1ms before checking again + while (!dataDownloaded && processedRowCount == downloadedRowCount) usleep(1000); + + // If all rows have been processed, we're at the end of the result set - return + if (processedRowCount == downloadedRowCount) { + + // We don't need to unlock the connection because the data loading thread + // has already taken care of that + return; + } + + // Mark the row entry as processed without performing any actions + pthread_mutex_lock(&dataLock); + SPMySQLStreamingRowData *previousDataStoreEntry = currentDataStoreEntry; + + // Update the active-data pointer to the next item in the list (which may be NULL) + currentDataStoreEntry = currentDataStoreEntry->nextRow; + if (!currentDataStoreEntry) lastDataStoreEntry = NULL; + + processedRowCount++; + currentRowIndex++; + if (dataDownloaded && processedRowCount == downloadedRowCount) currentRowIndex = NSNotFound; + + // Unlock the mutex + pthread_mutex_unlock(&dataLock); + + // Free the memory for the processed row + free(previousDataStoreEntry->dataLengths); + if (previousDataStoreEntry->data != NULL) free(previousDataStoreEntry->data); + free(previousDataStoreEntry); + } +} + +#pragma mark - +#pragma mark Data retrieval for fast enumeration + +/** + * Implement the fast enumeration endpoint. Rows for fast enumeration are retrieved in + * the instance default, as specified in setDefaultRowReturnType: or defaulting to + * NSDictionary. + */ +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len +{ + + // To avoid lock issues, return one row at a time. + id nextRow = SPMySQLResultGetRow(self, SPMySQLResultRowAsDefault); + + // If no row was available, return 0 to stop iteration. + if (!nextRow) return 0; + + // Otherwise, add the item to the buffer and return the appropriate state. + stackbuf[0] = nextRow; + + state->state += 1; + state->itemsPtr = stackbuf; + state->mutationsPtr = (unsigned long *)self; + + return 1; +} + +@end + +#pragma mark - +#pragma mark Result set internals + +@implementation SPMySQLFastStreamingResult (Private_API) + +/** + * Used internally to download results in a background thread + */ +- (void)_downloadAllData +{ + NSAutoreleasePool *downloadPool = [[NSAutoreleasePool alloc] init]; + MYSQL_ROW theRow; + unsigned long *fieldLengths; + NSUInteger i, dataCopiedLength, rowDataLength; + SPMySQLStreamingRowData *newRowStore; + + size_t sizeOfStreamingRowData = sizeof(SPMySQLStreamingRowData); + size_t sizeOfDataLengths = (size_t)(sizeof(unsigned long) * numberOfFields); + size_t sizeOfChar = sizeof(char); + + // Loop through the rows until the end of the data is reached - indicated via a NULL + while ( + (*isConnectedPtr)(parentConnection, isConnectedSelector) + && (theRow = mysql_fetch_row(resultSet)) + ) + { + + // Retrieve the lengths of the returned data + fieldLengths = mysql_fetch_lengths(resultSet); + rowDataLength = 0; + dataCopiedLength = 0; + for (i = 0; i < numberOfFields; i++) { + rowDataLength += fieldLengths[i]; + } + + // Initialise memory for the row and set a NULL pointer for the next item + newRowStore = malloc(sizeOfStreamingRowData); + newRowStore->nextRow = NULL; + + // Set up the row data store - a char* - and copy in the data if there is any. + newRowStore->data = malloc(sizeOfChar * rowDataLength); + for (i = 0; i < numberOfFields; i++) { + if (theRow[i] != NULL) { + memcpy(newRowStore->data+dataCopiedLength, theRow[i], fieldLengths[i]); + dataCopiedLength += fieldLengths[i]; + } else { + fieldLengths[i] = NSNotFound; + } + } + + // Set up the memory for, and copy in, the field lengths + newRowStore->dataLengths = memcpy(malloc(sizeOfDataLengths), fieldLengths, sizeOfDataLengths); + + // Lock the data mutex + pthread_mutex_lock(&dataLock); + + // Add the newly allocated row to end of the storage linked list + if (lastDataStoreEntry) { + lastDataStoreEntry->nextRow = newRowStore; + } + lastDataStoreEntry = newRowStore; + if (!currentDataStoreEntry) currentDataStoreEntry = newRowStore; + + // Update the downloaded row count + downloadedRowCount++; + + // Unlock the mutex + pthread_mutex_unlock(&dataLock); + } + + // Update the connection's error statuses to reflect any errors during the content download + [parentConnection _updateLastErrorID:NSNotFound]; + [parentConnection _updateLastErrorMessage:nil]; + + // Unlock the parent connection now all data has been retrieved + [parentConnection _unlockConnection]; + connectionUnlocked = YES; + + dataDownloaded = YES; + [downloadPool drain]; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLFramework_Prefix.pch b/Frameworks/SPMySQLFramework/Source/SPMySQLFramework_Prefix.pch new file mode 100644 index 00000000..8528c29c --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLFramework_Prefix.pch @@ -0,0 +1,11 @@ +// +// Prefix header for all source files of the 'SPMySQLFramework' target in the 'SPMySQLFramework' project. +// + +#ifdef __OBJC__ + #import <Cocoa/Cocoa.h> +#endif + +#import "mysql.h" +#import "SPMySQL.h" +#import "SPMySQLUtilities.h"
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLGeometryData.h b/Frameworks/SPMySQLFramework/Source/SPMySQLGeometryData.h new file mode 100644 index 00000000..e1313032 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLGeometryData.h @@ -0,0 +1,53 @@ +// +// $Id$ +// +// SPMySQLGeometryData.h +// sequel-pro +// +// Created by Hans-Jörg Bibiko on October 07, 2010 +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLGeometryData : NSObject +{ + // Holds the WKB bytes coming from SQL server + Byte *geoBuffer; + + // Holds the buffer length + NSUInteger bufferLength; + +} + +- (id)initWithBytes:(const void *)geoData length:(NSUInteger)length; ++ (id)dataWithBytes:(const void *)geoData length:(NSUInteger)length; +- (NSString *)description; +- (NSUInteger)length; +- (NSData *)data; +- (NSString *)wktString; +- (NSDictionary *)coordinates; +- (NSInteger)wkbType; +- (NSString *)wktType; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLGeometryData.m b/Frameworks/SPMySQLFramework/Source/SPMySQLGeometryData.m new file mode 100644 index 00000000..3c37e403 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLGeometryData.m @@ -0,0 +1,810 @@ +// +// $Id$ +// +// SPMySQLGeometryData.m +// sequel-pro +// +// Created by Hans-Jörg Bibiko on October 07, 2010 +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQLGeometryData.h" + +enum wkbType +{ + wkb_point = 1, + wkb_linestring = 2, + wkb_polygon = 3, + wkb_multipoint = 4, + wkb_multilinestring = 5, + wkb_multipolygon = 6, + wkb_geometrycollection = 7 +}; + +typedef struct st_point_2d_ +{ + double x; + double y; +} st_point_2d; + +#define SIZEOF_STORED_UINT32 4 +#define SIZEOF_STORED_DOUBLE 8 +#define POINT_DATA_SIZE (SIZEOF_STORED_DOUBLE*2) +#define WKB_HEADER_SIZE (1+SIZEOF_STORED_UINT32) +#define BUFFER_START 0 + +@implementation SPMySQLGeometryData + +/** + * Initialize the SPMySQLGeometryData object + */ +- (id)init +{ + if ((self = [super init])) { + geoBuffer = nil; + bufferLength = 0; + } + return self; +} + +/** + * Initialize the SPMySQLGeometryData object with the WKB data + */ +- (id)initWithBytes:(const void *)geoData length:(NSUInteger)length +{ + if ((self = [self init])) { + bufferLength = length; + geoBuffer = malloc(bufferLength); + memcpy(geoBuffer, geoData, bufferLength); + } + return self; +} + +/** + * Return an autorelease SPMySQLGeometryData object + */ ++ (id)dataWithBytes:(const void *)geoData length:(NSUInteger)length +{ + return [[[SPMySQLGeometryData alloc] initWithBytes:geoData length:length] autorelease]; +} + +/** + * copyWithZone + */ +- (id)copyWithZone:(NSZone *)zone +{ + return [self retain]; +} + +/** + * Return the hex representation of the WKB buffer (only for convenience) + */ +- (NSString*)description +{ + return [[NSData dataWithBytes:geoBuffer length:bufferLength] description]; +} + +/** + * Return the length of the WKB buffer + */ +- (NSUInteger)length +{ + return bufferLength; +} + +/** + * Return NSData pointer of the WKB buffer + */ +- (NSData *)data +{ + return [NSData dataWithBytes:geoBuffer length:bufferLength]; +} + +/** + * Return a human readable WKT string of the internal format (imitating the SQL function AsText()). + */ +- (NSString *)wktString +{ + char byteOrder; + uint32_t geoType, numberOfItems, numberOfSubItems, numberOfSubSubItems, numberOfCollectionItems; + int32_t srid; + st_point_2d aPoint; + + uint32_t i, j, k, n; // Loop counter for numberOf...Items + uint32_t ptr = BUFFER_START; // pointer to geoBuffer while parsing + + NSMutableString *wkt = [NSMutableString string]; + + if (bufferLength < WKB_HEADER_SIZE) + return @""; + + memcpy(&srid, &geoBuffer[0], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + + byteOrder = (char)geoBuffer[ptr]; + + if (byteOrder != 0x1) + return @"Byte order not yet supported"; + + ptr++; + geoType = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + switch (geoType) { + + case wkb_point: + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + return [NSString stringWithFormat:@"POINT(%.16g %.16g)%@", aPoint.x, aPoint.y, (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + break; + + case wkb_linestring: + [wkt setString:@"LINESTRING("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + return wkt; + break; + + case wkb_polygon: + [wkt setString:@"POLYGON("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; + } + [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + return wkt; + break; + + case wkb_multipoint: + [wkt setString:@"MULTIPOINT("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; + } + [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + return wkt; + break; + + case wkb_multilinestring: + [wkt setString:@"MULTILINESTRING("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + ptr += WKB_HEADER_SIZE; + [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; + } + [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + return wkt; + break; + + case wkb_multipolygon: + [wkt setString:@"MULTIPOLYGON("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (k=0; k < numberOfSubSubItems; k++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (k < numberOfSubSubItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + [wkt appendFormat:@")%@", (j < numberOfSubItems-1) ? @"," : @""]; + } + ptr += WKB_HEADER_SIZE; + [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; + } + [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + return wkt; + break; + + case wkb_geometrycollection: + [wkt setString:@"GEOMETRYCOLLECTION("]; + numberOfCollectionItems = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + for (n=0; n < numberOfCollectionItems; n++) { + + byteOrder = (char)geoBuffer[ptr]; + + if(byteOrder != 0x1) + return @"Byte order not yet supported"; + + ptr++; + geoType = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + switch(geoType) { + + case wkb_point: + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"POINT(%.16g %.16g)", aPoint.x, aPoint.y]; + ptr += POINT_DATA_SIZE; + break; + + case wkb_linestring: + [wkt appendString:@"LINESTRING("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + [wkt appendString:@")"]; + break; + + case wkb_polygon: + [wkt appendString:@"POLYGON("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; + } + [wkt appendString:@")"]; + break; + + case wkb_multipoint: + [wkt appendString:@"MULTIPOINT("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (i < numberOfItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; + } + ptr -= WKB_HEADER_SIZE; + [wkt appendString:@")"]; + break; + + case wkb_multilinestring: + [wkt appendString:@"MULTILINESTRING("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (j < numberOfSubItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + ptr += WKB_HEADER_SIZE; + [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; + } + ptr -= WKB_HEADER_SIZE; + [wkt appendString:@")"]; + break; + + case wkb_multipolygon: + [wkt appendString:@"MULTIPOLYGON("]; + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + [wkt appendString:@"("]; + for (k=0; k < numberOfSubSubItems; k++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + [wkt appendFormat:@"%.16g %.16g%@", aPoint.x, aPoint.y, (k < numberOfSubSubItems-1) ? @"," : @""]; + ptr += POINT_DATA_SIZE; + } + [wkt appendFormat:@")%@", (j < numberOfSubItems-1) ? @"," : @""]; + } + ptr += WKB_HEADER_SIZE; + [wkt appendFormat:@")%@", (i < numberOfItems-1) ? @"," : @""]; + } + ptr -= WKB_HEADER_SIZE; + [wkt appendString:@")"]; + break; + + default: + return @"Error geometrycollection type parsing"; + } + [wkt appendString:(n < numberOfCollectionItems-1) ? @"," : @""]; + } + [wkt appendFormat:@")%@", (srid) ? [NSString stringWithFormat:@",%d",srid]: @""]; + return wkt; + break; + + default: + return @"Error geometry type parsing"; + } + + return @"Error while parsing"; +} + +/** + * Return a dictionary of coordinates, bbox, etc. to be able to draw the given geometry. + * + * @return A dictionary having the following keys: "bbox" as NSArray of NSNumbers of x_min x_max y_min y_max, "coordinates" as NSArray containing the + * the to be drawn points as NSPoint strings, "type" as NSString + */ +- (NSDictionary *)coordinates +{ + char byteOrder; + uint32_t geoType, numberOfItems, numberOfSubItems, numberOfSubSubItems, numberOfCollectionItems; + int32_t srid; + st_point_2d aPoint; + + uint32_t i, j, k, n; // Loop counter for numberOf...Items + uint32_t ptr = BUFFER_START; // pointer to geoBuffer while parsing + + double x_min = DBL_MAX; + double x_max = -DBL_MAX; + double y_min = DBL_MAX; + double y_max = -DBL_MAX; + + NSMutableArray *coordinates = [NSMutableArray array]; + NSMutableArray *subcoordinates = [NSMutableArray array]; + NSMutableArray *pointcoordinates = [NSMutableArray array]; + NSMutableArray *linecoordinates = [NSMutableArray array]; + NSMutableArray *linesubcoordinates = [NSMutableArray array]; + NSMutableArray *polygoncoordinates = [NSMutableArray array]; + NSMutableArray *polygonsubcoordinates = [NSMutableArray array]; + + if (bufferLength < WKB_HEADER_SIZE) + return nil; + + memcpy(&srid, &geoBuffer[0], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + + byteOrder = (char)geoBuffer[ptr]; + + if (byteOrder != 0x1) + return nil; + + ptr++; + geoType = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + switch(geoType) { + + case wkb_point: + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = aPoint.x; + x_max = aPoint.x; + y_min = aPoint.y; + y_max = aPoint.y; + [coordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + coordinates, @"coordinates", + [NSNumber numberWithInt:srid], @"srid", + @"POINT", @"type", + nil]; + break; + + case wkb_linestring: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [coordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + [NSArray arrayWithObjects:coordinates,nil], @"coordinates", + @"LINESTRING", @"type", + nil]; + break; + + case wkb_polygon: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [subcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + [coordinates addObject:[[subcoordinates copy] autorelease]]; + [subcoordinates removeAllObjects]; + } + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + coordinates, @"coordinates", + [NSNumber numberWithInt:srid], @"srid", + @"POLYGON", @"type", + nil]; + break; + + case wkb_multipoint: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [coordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; + } + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + coordinates, @"coordinates", + [NSNumber numberWithInt:srid], @"srid", + @"MULTIPOINT", @"type", + nil]; + break; + + case wkb_multilinestring: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [subcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + ptr += WKB_HEADER_SIZE; + [coordinates addObject:[[subcoordinates copy] autorelease]]; + [subcoordinates removeAllObjects]; + } + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + coordinates, @"coordinates", + [NSNumber numberWithInt:srid], @"srid", + @"MULTILINESTRING", @"type", + nil]; + break; + + case wkb_multipolygon: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (k=0; k < numberOfSubSubItems; k++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [subcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + [coordinates addObject:[[subcoordinates copy] autorelease]]; + [subcoordinates removeAllObjects]; + } + ptr += WKB_HEADER_SIZE; + } + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + coordinates, @"coordinates", + [NSNumber numberWithInt:srid], @"srid", + @"MULTIPOLYGON", @"type", + nil]; + break; + + case wkb_geometrycollection: + numberOfCollectionItems = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + for (n=0; n < numberOfCollectionItems; n++) { + + byteOrder = (char)geoBuffer[ptr]; + + if (byteOrder != 0x1) + return nil; + + ptr++; + geoType = geoBuffer[ptr]; + ptr += SIZEOF_STORED_UINT32; + + switch(geoType) { + + case wkb_point: + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [pointcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + break; + + case wkb_linestring: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [linesubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + [linecoordinates addObject:[[linesubcoordinates copy] autorelease]]; + [linesubcoordinates removeAllObjects]; + break; + + case wkb_polygon: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [polygonsubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + [polygoncoordinates addObject:[[polygonsubcoordinates copy] autorelease]]; + [polygonsubcoordinates removeAllObjects]; + } + break; + + case wkb_multipoint: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [pointcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE+WKB_HEADER_SIZE; + } + ptr -= WKB_HEADER_SIZE; + break; + + case wkb_multilinestring: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [linesubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + [linecoordinates addObject:[[linesubcoordinates copy] autorelease]]; + [linesubcoordinates removeAllObjects]; + ptr += WKB_HEADER_SIZE; + } + ptr -= WKB_HEADER_SIZE; + break; + + case wkb_multipolygon: + memcpy(&numberOfItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32+WKB_HEADER_SIZE; + for (i=0; i < numberOfItems; i++) { + memcpy(&numberOfSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (j=0; j < numberOfSubItems; j++) { + memcpy(&numberOfSubSubItems, &geoBuffer[ptr], SIZEOF_STORED_UINT32); + ptr += SIZEOF_STORED_UINT32; + for (k=0; k < numberOfSubSubItems; k++) { + memcpy(&aPoint, &geoBuffer[ptr], POINT_DATA_SIZE); + x_min = (aPoint.x < x_min) ? aPoint.x : x_min; + x_max = (aPoint.x > x_max) ? aPoint.x : x_max; + y_min = (aPoint.y < y_min) ? aPoint.y : y_min; + y_max = (aPoint.y > y_max) ? aPoint.y : y_max; + [polygonsubcoordinates addObject:NSStringFromPoint(NSMakePoint((CGFloat)aPoint.x, (CGFloat)aPoint.y))]; + ptr += POINT_DATA_SIZE; + } + [polygoncoordinates addObject:[[polygonsubcoordinates copy] autorelease]]; + [polygonsubcoordinates removeAllObjects]; + } + ptr += WKB_HEADER_SIZE; + } + ptr -= WKB_HEADER_SIZE; + break; + + default: + return nil; + } + } + return [NSDictionary dictionaryWithObjectsAndKeys: + [NSArray arrayWithObjects: + [NSNumber numberWithDouble:x_min], + [NSNumber numberWithDouble:x_max], + [NSNumber numberWithDouble:y_min], + [NSNumber numberWithDouble:y_max], + nil], @"bbox", + [NSArray arrayWithObjects:pointcoordinates, linecoordinates, polygoncoordinates, nil], @"coordinates", + @"GEOMETRYCOLLECTION", @"type", + nil]; + break; + + default: + return nil; + } + + return nil; +} + +/** + * Return the WKB type of the geoBuffer ie if buffer represents a POINT, LINESTRING, etc. + * according to stored wkbType in header file. It returns -1 if an error occurred. + */ +- (NSInteger)wkbType +{ + char byteOrder; + SInt32 geoType; + + NSUInteger ptr = BUFFER_START; // pointer to geoBuffer while parsing + + if (bufferLength < WKB_HEADER_SIZE) + return -1; + + byteOrder = (char)geoBuffer[ptr]; + + if (byteOrder != 0x1) + return -1; + + ptr++; + geoType = geoBuffer[ptr]; + + if (geoType > 0 && geoType < 8) + return geoType; + else + return -1; + +} + +/** + * Return the WKT type of the geoBuffer ie if buffer represents a POINT, LINESTRING, etc. + * according to stored wkbType in header file. It returns nil if an error occurred. + */ +- (NSString *)wktType +{ + switch ([self wkbType]) + { + case wkb_point: + return @"POINT"; + case wkb_linestring: + return @"LINESTRING"; + case wkb_polygon: + return @"POLYGON"; + case wkb_multipoint: + return @"MULTIPOINT"; + case wkb_multilinestring: + return @"MULTILINESTRING"; + case wkb_multipolygon: + return @"MULTIPOLYGON"; + case wkb_geometrycollection: + return @"GEOMETRYCOLLECTION"; + default: + return nil; + } + return nil; +} + +/** + * dealloc + */ +- (void)dealloc +{ + if (geoBuffer && bufferLength) free(geoBuffer); + [super dealloc]; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Convenience Methods.h b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Convenience Methods.h new file mode 100644 index 00000000..7d870a93 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Convenience Methods.h @@ -0,0 +1,38 @@ +// +// $Id$ +// +// Convenience Methods.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 20, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLResult (Convenience_Methods) + +- (NSArray *)getAllRows; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Convenience Methods.m b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Convenience Methods.m new file mode 100644 index 00000000..2b049264 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Convenience Methods.m @@ -0,0 +1,71 @@ +// +// $Id$ +// +// Convenience Methods.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 20, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "Convenience Methods.h" + +@implementation SPMySQLResult (Convenience_Methods) + +/** + * Iterates over the result set, retrieving all the rows, and returns them + * as an array. + * The rows are in the default format for this instance, as controlled via + * -setDefaultRowReturnType:. + * Returns nil if there are no rows to return. + */ +- (NSArray *)getAllRows +{ + unsigned long long previousSeekPosition = currentRowIndex; + + NSMutableArray *rowsToReturn; + + // If the number of rows is known, pre-set the size; otherwise just create an array + if (numberOfRows != NSNotFound) { + rowsToReturn = [[NSMutableArray alloc] initWithCapacity:(NSUInteger)numberOfRows]; + } else { + rowsToReturn = [[NSMutableArray alloc] init]; + } + + // Loop through the rows in the instance-specified return format + for (id eachRow in self) { + [rowsToReturn addObject:eachRow]; + } + + // Seek to the previous position if appropriate + if (previousSeekPosition) [self seekToRow:previousSeekPosition]; + + // Instead of empty arrays, return nil if there are no rows. + if (![rowsToReturn count]) return nil; + + return rowsToReturn; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.h b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.h new file mode 100644 index 00000000..20e1ddc9 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.h @@ -0,0 +1,38 @@ +// +// $Id$ +// +// Field Definitions.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 2, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface SPMySQLResult (Field_Definitions) + +- (NSArray *)fieldDefinitions; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.m b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.m new file mode 100644 index 00000000..59e75d2f --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLResult Categories/Field Definitions.m @@ -0,0 +1,557 @@ +// +// $Id$ +// +// Field Definitions.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 2, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "Field Definitions.h" + +@interface SPMySQLResult (Field_Definitions_Private_API) + +- (NSUInteger)_findCharsetMaxByteLengthPerCharForMySQLNumber:(NSUInteger)charsetnr; +- (NSString *)_charsetNameForMySQLNumber:(NSUInteger)charsetnr; +- (NSString *)_charsetCollationForMySQLNumber:(NSUInteger)charsetnr; +- (NSString *)_mysqlTypeToStringForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags withLength:(unsigned long long)length; +- (NSString *)_mysqlTypeToGroupForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags; + +@end + +// Import a private declaration from the SPMySQLResult file for use +@interface SPMySQLResult (Private_API) + +- (NSString *)_stringWithBytes:(const void *)bytes length:(NSUInteger)length; + +@end + +#define MAGIC_BINARY_CHARSET_NR 63 + +const SPMySQLResultCharset SPMySQLCharsetMap[] = +{ + {1, "big5","big5_chinese_ci", 1, 2}, + {3, "dec8", "dec8_swedisch_ci", 1, 1}, + {4, "cp850", "cp850_general_ci", 1, 1}, + {6, "hp8", "hp8_english_ci", 1, 1}, + {7, "koi8r", "koi8r_general_ci", 1, 1}, + {8, "latin1", "latin1_swedish_ci", 1, 1}, + {9, "latin2", "latin2_general_ci", 1, 1}, + {10, "swe7", "swe7_swedish_ci", 1, 1}, + {11, "ascii", "ascii_general_ci", 1, 1}, + {12, "ujis", "ujis_japanese_ci", 1, 3}, + {13, "sjis", "sjis_japanese_ci", 1, 2}, + {16, "hebrew", "hebrew_general_ci", 1, 1}, + {18, "tis620", "tis620_thai_ci", 1, 1}, + {19, "euckr", "euckr_korean_ci", 1, 2}, + {22, "koi8u", "koi8u_general_ci", 1, 1}, + {24, "gb2312", "gb2312_chinese_ci", 1, 2}, + {25, "greek", "greek_general_ci", 1, 1}, + {26, "cp1250", "cp1250_general_ci", 1, 1}, + {28, "gbk", "gbk_chinese_ci", 1, 2}, + {30, "latin5", "latin5_turkish_ci", 1, 1}, + {32, "armscii8", "armscii8_general_ci", 1, 1}, + {33, "utf8", "utf8_general_ci", 1, 3}, + {35, "ucs2", "ucs2_general_ci", 2, 2}, + {36, "cp866", "cp866_general_ci", 1, 1}, + {37, "keybcs2", "keybcs2_general_ci", 1, 1}, + {38, "macce", "macce_general_ci", 1, 1}, + {39, "macroman", "macroman_general_ci", 1, 1}, + {40, "cp852", "cp852_general_ci", 1, 1}, + {41, "latin7", "latin7_general_ci", 1, 1}, + {51, "cp1251", "cp1251_general_ci", 1, 1}, + {57, "cp1256", "cp1256_general_ci", 1, 1}, + {59, "cp1257", "cp1257_general_ci", 1, 1}, + {63, "binary", "binary", 1, 1}, + {92, "geostd8", "geostd8_general_ci", 1, 1}, + {95, "cp932", "cp932_japanese_ci", 1, 2}, + {97, "eucjpms", "eucjpms_japanese_ci", 1, 3}, + {2, "latin2", "latin2_czech_cs", 1, 1}, + {5, "latin1", "latin1_german_ci", 1, 1}, + {14, "cp1251", "cp1251_bulgarian_ci", 1, 1}, + {15, "latin1", "latin1_danish_ci", 1, 1}, + {17, "filename", "filename", 1, 5}, + {20, "latin7", "latin7_estonian_cs", 1, 1}, + {21, "latin2", "latin2_hungarian_ci", 1, 1}, + {23, "cp1251", "cp1251_ukrainian_ci", 1, 1}, + {27, "latin2", "latin2_croatian_ci", 1, 1}, + {29, "cp1257", "cp1257_lithunian_ci", 1, 1}, + {31, "latin1", "latin1_german2_ci", 1, 1}, + {34, "cp1250", "cp1250_czech_cs", 1, 1}, + {42, "latin7", "latin7_general_cs", 1, 1}, + {43, "macce", "macce_bin", 1, 1}, + {44, "cp1250", "cp1250_croatian_ci", 1, 1}, + {45, "utf8", "utf8_general_ci", 1, 1}, + {46, "utf8", "utf8_bin", 1, 1}, + {47, "latin1", "latin1_bin", 1, 1}, + {48, "latin1", "latin1_general_ci", 1, 1}, + {49, "latin1", "latin1_general_cs", 1, 1}, + {50, "cp1251", "cp1251_bin", 1, 1}, + {52, "cp1251", "cp1251_general_cs", 1, 1}, + {53, "macroman", "macroman_bin", 1, 1}, + {58, "cp1257", "cp1257_bin", 1, 1}, + {60, "armascii8", "armascii8_bin", 1, 1}, + {65, "ascii", "ascii_bin", 1, 1}, + {66, "cp1250", "cp1250_bin", 1, 1}, + {67, "cp1256", "cp1256_bin", 1, 1}, + {68, "cp866", "cp866_bin", 1, 1}, + {69, "dec8", "dec8_bin", 1, 1}, + {70, "greek", "greek_bin", 1, 1}, + {71, "hebew", "hebrew_bin", 1, 1}, + {72, "hp8", "hp8_bin", 1, 1}, + {73, "keybcs2", "keybcs2_bin", 1, 1}, + {74, "koi8r", "koi8r_bin", 1, 1}, + {75, "koi8u", "koi8u_bin", 1, 1}, + {77, "latin2", "latin2_bin", 1, 1}, + {78, "latin5", "latin5_bin", 1, 1}, + {79, "latin7", "latin7_bin", 1, 1}, + {80, "cp850", "cp850_bin", 1, 1}, + {81, "cp852", "cp852_bin", 1, 1}, + {82, "swe7", "swe7_bin", 1, 1}, + {93, "geostd8", "geostd8_bin", 1, 1}, + {83, "utf8", "utf8_bin", 1, 3}, + {84, "big5", "big5_bin", 1, 2}, + {85, "euckr", "euckr_bin", 1, 2}, + {86, "gb2312", "gb2312_bin", 1, 2}, + {87, "gbk", "gbk_bin", 1, 2}, + {88, "sjis", "sjis_bin", 1, 2}, + {89, "tis620", "tis620_bin", 1, 1}, + {90, "ucs2", "ucs2_bin", 2, 2}, + {91, "ujis", "ujis_bin", 1, 3}, + {94, "latin1", "latin1_spanish_ci", 1, 1}, + {96, "cp932", "cp932_bin", 1, 2}, + {99, "cp1250", "cp1250_polish_ci", 1, 1}, + {98, "eucjpms", "eucjpms_bin", 1, 3}, + {128, "ucs2", "ucs2_unicode_ci", 2, 2}, + {129, "ucs2", "ucs2_icelandic_ci", 2, 2}, + {130, "ucs2", "ucs2_latvian_ci", 2, 2}, + {131, "ucs2", "ucs2_romanian_ci", 2, 2}, + {132, "ucs2", "ucs2_slovenian_ci", 2, 2}, + {133, "ucs2", "ucs2_polish_ci", 2, 2}, + {134, "ucs2", "ucs2_estonian_ci", 2, 2}, + {135, "ucs2", "ucs2_spanish_ci", 2, 2}, + {136, "ucs2", "ucs2_swedish_ci", 2, 2}, + {137, "ucs2", "ucs2_turkish_ci", 2, 2}, + {138, "ucs2", "ucs2_czech_ci", 2, 2}, + {139, "ucs2", "ucs2_danish_ci", 2, 2}, + {140, "ucs2", "ucs2_lithunian_ci", 2, 2}, + {141, "ucs2", "ucs2_slovak_ci", 2, 2}, + {142, "ucs2", "ucs2_spanish2_ci", 2, 2}, + {143, "ucs2", "ucs2_roman_ci", 2, 2}, + {144, "ucs2", "ucs2_persian_ci", 2, 2}, + {145, "ucs2", "ucs2_esperanto_ci", 2, 2}, + {146, "ucs2", "ucs2_hungarian_ci", 2, 2}, + {147, "ucs2", "ucs2_sinhala_ci", 2, 2}, + {192, "utf8mb3", "utf8mb3_general_ci", 1, 3}, + {193, "utf8mb3", "utf8mb3_icelandic_ci", 1, 3}, + {194, "utf8mb3", "utf8mb3_latvian_ci", 1, 3}, + {195, "utf8mb3", "utf8mb3_romanian_ci", 1, 3}, + {196, "utf8mb3", "utf8mb3_slovenian_ci", 1, 3}, + {197, "utf8mb3", "utf8mb3_polish_ci", 1, 3}, + {198, "utf8mb3", "utf8mb3_estonian_ci", 1, 3}, + {119, "utf8mb3", "utf8mb3_spanish_ci", 1, 3}, + {200, "utf8mb3", "utf8mb3_swedish_ci", 1, 3}, + {201, "utf8mb3", "utf8mb3_turkish_ci", 1, 3}, + {202, "utf8mb3", "utf8mb3_czech_ci", 1, 3}, + {203, "utf8mb3", "utf8mb3_danish_ci", 1, 3}, + {204, "utf8mb3", "utf8mb3_lithunian_ci", 1, 3}, + {205, "utf8mb3", "utf8mb3_slovak_ci", 1, 3}, + {206, "utf8mb3", "utf8mb3_spanish2_ci", 1, 3}, + {207, "utf8mb3", "utf8mb3_roman_ci", 1, 3}, + {208, "utf8mb3", "utf8mb3_persian_ci", 1, 3}, + {209, "utf8mb3", "utf8mb3_esperanto_ci", 1, 3}, + {210, "utf8mb3", "utf8mb3_hungarian_ci", 1, 3}, + {211, "utf8mb3", "utf8mb3_sinhala_ci", 1, 3}, + {224, "utf8", "utf8_unicode_ci", 1, 3}, + {225, "utf8", "utf8_icelandic_ci", 1, 3}, + {226, "utf8", "utf8_latvian_ci", 1, 3}, + {227, "utf8", "utf8_romanian_ci", 1, 3}, + {228, "utf8", "utf8_slovenian_ci", 1, 3}, + {229, "utf8", "utf8_polish_ci", 1, 3}, + {230, "utf8", "utf8_estonian_ci", 1, 3}, + {231, "utf8", "utf8_spanish_ci", 1, 3}, + {232, "utf8", "utf8_swedish_ci", 1, 3}, + {233, "utf8", "utf8_turkish_ci", 1, 3}, + {234, "utf8", "utf8_czech_ci", 1, 3}, + {235, "utf8", "utf8_danish_ci", 1, 3}, + {236, "utf8", "utf8_lithuanian_ci", 1, 3}, + {237, "utf8", "utf8_slovak_ci", 1, 3}, + {238, "utf8", "utf8_spanish2_ci", 1, 3}, + {239, "utf8", "utf8_roman_ci", 1, 3}, + {240, "utf8", "utf8_persian_ci", 1, 3}, + {241, "utf8", "utf8_esperanto_ci", 1, 3}, + {242, "utf8", "utf8_hungarian_ci", 1, 3}, + {243, "utf8", "utf8_sinhala_ci", 1, 3}, + {254, "utf8mb3", "utf8mb3_general_cs", 1, 3}, + {0, NULL, NULL, 0, 0} +}; + +#pragma mark - + +@implementation SPMySQLResult (Field_Definitions) + +/** + * Return an array of NSDictionaries, each containing information about one of + * the columns in the result set. + * MySQL returns non-valid details as empty strings - these are converted to + * unset entries in the dictionary. + */ +- (NSArray *)fieldDefinitions +{ + NSUInteger i; + NSMutableArray *theFieldDefinitions = [NSMutableArray array]; + NSMutableDictionary *eachField; + MYSQL_FIELD mysqlField; + + for (i = 0; i < numberOfFields; i++) { + eachField = [NSMutableDictionary dictionary]; + mysqlField = fieldDefinitions[i]; + + // Record the original column position within the result set + [eachField setObject:[NSString stringWithFormat:@"%llu", (unsigned long long)i] forKey:@"datacolumnindex"]; + + // Record the column name, or alias if one is being used + [eachField setObject:[self _stringWithBytes:mysqlField.name length:mysqlField.name_length] forKey:@"name"]; + + // Record the original column name if using an alias + [eachField setObject:[self _stringWithBytes:mysqlField.org_name length:mysqlField.org_name_length] forKey:@"org_name"]; + + // If the column had an underlying table, record the table name, respecting aliases + if (mysqlField.table_length) { + [eachField setObject:[self _stringWithBytes:mysqlField.table length:mysqlField.table_length] forKey:@"table"]; + } + + // If the column had an underlying table, record the original table name, ignoring aliases + if (mysqlField.org_table_length) { + [eachField setObject:[self _stringWithBytes:mysqlField.org_table length:mysqlField.org_table_length] forKey:@"org_table"]; + } + + // If the column had an underlying database, record the database name + if (mysqlField.db_length) { + [eachField setObject:[self _stringWithBytes:mysqlField.db length:mysqlField.db_length] forKey:@"db"]; + } + + // Width of column (minimum real length in bytes) + [eachField setObject:[NSNumber numberWithUnsignedLongLong:mysqlField.length] forKey:@"byte_length"]; + + // Width of column (as in create) + // TODO: Discuss the logic of this with Hans-Jörg Bibiko; is this related to max_byte_length? + [eachField setObject:[NSNumber numberWithUnsignedLongLong:(mysqlField.length/[self _findCharsetMaxByteLengthPerCharForMySQLNumber:mysqlField.charsetnr])] forKey:@"char_length"]; + + // Max width (bytes) for selected set. Note that this will be 0 for streaming results. + [eachField setObject:[NSNumber numberWithUnsignedLongLong:mysqlField.max_length] forKey:@"max_byte_length"]; + + // Bit-flags that describe the field, in entirety and split out + [eachField setObject:[NSNumber numberWithUnsignedInt:mysqlField.flags] forKey:@"flags"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & NOT_NULL_FLAG) ? YES : NO] forKey:@"null"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & PRI_KEY_FLAG) ? YES : NO] forKey:@"PRI_KEY_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & UNIQUE_KEY_FLAG) ? YES : NO] forKey:@"UNIQUE_KEY_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & MULTIPLE_KEY_FLAG) ? YES : NO] forKey:@"MULTIPLE_KEY_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & BLOB_FLAG) ? YES : NO] forKey:@"BLOB_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & UNSIGNED_FLAG) ? YES : NO] forKey:@"UNSIGNED_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & ZEROFILL_FLAG) ? YES : NO] forKey:@"ZEROFILL_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & BINARY_FLAG) ? YES : NO] forKey:@"BINARY_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & ENUM_FLAG) ? YES : NO] forKey:@"ENUM_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & AUTO_INCREMENT_FLAG) ? YES : NO] forKey:@"AUTO_INCREMENT_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & SET_FLAG) ? YES : NO] forKey:@"SET_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & NUM_FLAG) ? YES : NO] forKey:@"NUM_FLAG"]; + [eachField setObject:[NSNumber numberWithBool:(mysqlField.flags & PART_KEY_FLAG) ? YES : NO] forKey:@"PART_KEY_FLAG"]; + + // For numeric fields, record the number of decimals + [eachField setObject:[NSNumber numberWithUnsignedInteger:mysqlField.decimals] forKey:@"decimals"]; + + // Character set details + [eachField setObject:[NSNumber numberWithUnsignedInteger:mysqlField.charsetnr] forKey:@"charsetnr"]; + [eachField setObject:[self _charsetNameForMySQLNumber:mysqlField.charsetnr] forKey:@"charset_name"]; + [eachField setObject:[self _charsetCollationForMySQLNumber:mysqlField.charsetnr] forKey:@"charset_collation"]; + + /* Table type */ + [eachField setObject:[self _mysqlTypeToStringForType:mysqlField.type + withCharsetNr:mysqlField.charsetnr + withFlags:mysqlField.flags + withLength:mysqlField.length + ] forKey:@"type"]; + + /* Table type group*/ + [eachField setObject:[self _mysqlTypeToGroupForType:mysqlField.type + withCharsetNr:mysqlField.charsetnr + withFlags:mysqlField.flags + ] forKey:@"typegrouping"]; + + [theFieldDefinitions addObject:eachField]; + } + + return theFieldDefinitions; +} + +@end + +#pragma mark - +#pragma mark Field defintion internals + +@implementation SPMySQLResult (Field_Definitions_Private_API) + +/** + * Return the maximum byte length to store a char by using + * a specific mysql_charsetnr + */ +- (NSUInteger)_findCharsetMaxByteLengthPerCharForMySQLNumber:(NSUInteger)charsetnr +{ + const SPMySQLResultCharset *c = SPMySQLCharsetMap; + + do { + if (c->nr == charsetnr) + return c->char_maxlen; + ++c; + } while (c[0].nr != 0); + + return 1; +} + +/** + * Convert a mysql_charsetnr into a charset name as string + */ +- (NSString *)_charsetNameForMySQLNumber:(NSUInteger)charsetnr +{ + const SPMySQLResultCharset *c = SPMySQLCharsetMap; + + do { + if (c->nr == charsetnr) + return [NSString stringWithCString:c->name encoding:stringEncoding]; + ++c; + } while (c[0].nr != 0); + + return @"UNKNOWN"; +} + +/** + * Convert a mysql_charsetnr into a collation name as string + */ +- (NSString *)_charsetCollationForMySQLNumber:(NSUInteger)charsetnr +{ + const SPMySQLResultCharset *c = SPMySQLCharsetMap; + + do { + if (c->nr == charsetnr) + return [NSString stringWithCString:c->collation encoding:stringEncoding]; + ++c; + } while (c[0].nr != 0); + + return @"UNKNOWN"; +} + +/** + * Convert a mysql_type to a string + */ +- (NSString *)_mysqlTypeToStringForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags withLength:(unsigned long long)length +{ + + switch (type) { + + case FIELD_TYPE_BIT: + return @"BIT"; + + case MYSQL_TYPE_DECIMAL: + case MYSQL_TYPE_NEWDECIMAL: + return @"DECIMAL"; + + case MYSQL_TYPE_TINY: + return @"TINYINT"; + + case MYSQL_TYPE_SHORT: + return @"SMALLINT"; + + case MYSQL_TYPE_LONG: + return @"INT"; + + case MYSQL_TYPE_FLOAT: + return @"FLOAT"; + + case MYSQL_TYPE_DOUBLE: + return @"DOUBLE"; + + case MYSQL_TYPE_NULL: + return @"NULL"; + + case MYSQL_TYPE_TIMESTAMP: + return @"TIMESTAMP"; + + case MYSQL_TYPE_LONGLONG: + return @"BIGINT"; + + case MYSQL_TYPE_INT24: + return @"MEDIUMINT"; + + case MYSQL_TYPE_DATE: + return @"DATE"; + + case MYSQL_TYPE_TIME: + return @"TIME"; + + case MYSQL_TYPE_DATETIME: + return @"DATETIME"; + + case MYSQL_TYPE_TINY_BLOB:// should no appear over the wire + case MYSQL_TYPE_MEDIUM_BLOB:// should no appear over the wire + case MYSQL_TYPE_LONG_BLOB:// should no appear over the wire + case MYSQL_TYPE_BLOB: + { + BOOL isBlob = (charsetnr == MAGIC_BINARY_CHARSET_NR); + switch (length/[self _findCharsetMaxByteLengthPerCharForMySQLNumber:charsetnr]) { + case 255: return isBlob? @"TINYBLOB":@"TINYTEXT"; + case 65535: return isBlob? @"BLOB":@"TEXT"; + case 16777215: return isBlob? @"MEDIUMBLOB":@"MEDIUMTEXT"; + case 4294967295: return isBlob? @"LONGBLOB":@"LONGTEXT"; + default: + switch (length) { + case 255: return isBlob? @"TINYBLOB":@"TINYTEXT"; + case 65535: return isBlob? @"BLOB":@"TEXT"; + case 16777215: return isBlob? @"MEDIUMBLOB":@"MEDIUMTEXT"; + case 4294967295: return isBlob? @"LONGBLOB":@"LONGTEXT"; + default: + return @"UNKNOWN"; + } + } + } + + case MYSQL_TYPE_VAR_STRING: + if (flags & ENUM_FLAG) { + return @"ENUM"; + } + if (flags & SET_FLAG) { + return @"SET"; + } + if (charsetnr == MAGIC_BINARY_CHARSET_NR) { + return @"VARBINARY"; + } + return @"VARCHAR"; + + case MYSQL_TYPE_STRING: + if (flags & ENUM_FLAG) { + return @"ENUM"; + } + if (flags & SET_FLAG) { + return @"SET"; + } + if ((flags & BINARY_FLAG) && charsetnr == MAGIC_BINARY_CHARSET_NR) { + return @"BINARY"; + } + return @"CHAR"; + + case MYSQL_TYPE_ENUM: + /* This should never happen */ + return @"ENUM"; + + case MYSQL_TYPE_YEAR: + return @"YEAR"; + + case MYSQL_TYPE_SET: + /* This should never happen */ + return @"SET"; + + case MYSQL_TYPE_GEOMETRY: + return @"GEOMETRY"; + + default: + return @"UNKNOWN"; + } +} + +/** + * Merge mysql_types into type groups + */ +- (NSString *)_mysqlTypeToGroupForType:(NSUInteger)type withCharsetNr:(NSUInteger)charsetnr withFlags:(NSUInteger)flags +{ + switch(type){ + + case FIELD_TYPE_BIT: + return @"bit"; + + case MYSQL_TYPE_TINY: + case MYSQL_TYPE_SHORT: + case MYSQL_TYPE_LONG: + case MYSQL_TYPE_LONGLONG: + case MYSQL_TYPE_INT24: + return @"integer"; + + case MYSQL_TYPE_FLOAT: + case MYSQL_TYPE_DOUBLE: + case MYSQL_TYPE_DECIMAL: + case MYSQL_TYPE_NEWDECIMAL: + return @"float"; + + case MYSQL_TYPE_YEAR: + case MYSQL_TYPE_DATETIME: + case MYSQL_TYPE_TIME: + case MYSQL_TYPE_DATE: + case MYSQL_TYPE_TIMESTAMP: + return @"date"; + + case MYSQL_TYPE_VAR_STRING: + if (flags & ENUM_FLAG) { + return @"enum"; + } + if (flags & SET_FLAG) { + return @"enum"; + } + if (charsetnr == MAGIC_BINARY_CHARSET_NR) { + return @"binary"; + } + return @"string"; + + case MYSQL_TYPE_STRING: + if (flags & ENUM_FLAG) { + return @"enum"; + } + if (flags & SET_FLAG) { + return @"enum"; + } + if ((flags & BINARY_FLAG) && charsetnr == MAGIC_BINARY_CHARSET_NR) { + return @"binary"; + } + return @"string"; + + case MYSQL_TYPE_TINY_BLOB: // should no appear over the wire + case MYSQL_TYPE_MEDIUM_BLOB: // should no appear over the wire + case MYSQL_TYPE_LONG_BLOB: // should no appear over the wire + case MYSQL_TYPE_BLOB: + { + if (charsetnr == MAGIC_BINARY_CHARSET_NR) { + return @"blobdata"; + } else { + return @"textdata"; + } + } + + case MYSQL_TYPE_GEOMETRY: + return @"geometry"; + + default: + return @"blobdata"; + } +} + +@end
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLResult.h b/Frameworks/SPMySQLFramework/Source/SPMySQLResult.h new file mode 100644 index 00000000..29518b5d --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLResult.h @@ -0,0 +1,121 @@ +// +// $Id$ +// +// SPMySQLResult.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 26, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +typedef enum { + SPMySQLResultFieldAsUnhandled = 0, + SPMySQLResultFieldAsString = 1, + SPMySQLResultFieldAsStringOrBlob = 2, + SPMySQLResultFieldAsBlob = 3, + SPMySQLResultFieldAsBit = 4, + SPMySQLResultFieldAsGeometry = 5, + SPMySQLResultFieldAsNull = 6 +} SPMySQLResultFieldProcessor; + +@interface SPMySQLResult : NSObject <NSFastEnumeration> { + + // Wrapped MySQL result set and its encoding + struct st_mysql_res *resultSet; + NSStringEncoding stringEncoding; + + // Number of fields in the result set, and the field names and information + NSUInteger numberOfFields; + struct st_mysql_field *fieldDefinitions; + unsigned int *fieldTypes; + NSString **fieldNames; + + // Number of rows in the result set and an internal data position counter + unsigned long long numberOfRows; + unsigned long long currentRowIndex; + + // How long it took to execute the query that produced this result + double queryExecutionTime; + + // The target result set type for fast enumeration and unspecified row retrieval + SPMySQLResultRowType defaultRowReturnType; + + // Whether all data should be returned as strings - useful for working with some older server types + BOOL returnDataAsStrings; +} + +// Master init method +- (id)initWithMySQLResult:(void *)theResult stringEncoding:(NSStringEncoding)theStringEncoding; + +// Result set information +- (NSUInteger)numberOfFields; +- (unsigned long long)numberOfRows; +- (double)queryExecutionTime; + +// Column information +- (NSArray *)fieldNames; + +// Data retrieval (note that fast enumeration is also supported, using instance-default format) +- (void)seekToRow:(unsigned long long)targetRow; +- (id)getRow; +- (NSArray *)getRowAsArray; +- (NSDictionary *)getRowAsDictionary; +- (id)getRowAsType:(SPMySQLResultRowType)theType; + +// Data conversion ++ (NSString *)bitStringWithBytes:(const char *)bytes length:(NSUInteger)length padToLength:(NSUInteger)padLength; + +#pragma mark - +#pragma mark Synthesized properties + +/** + * Set whether the result should return data types as strings. This may be useful + * for queries where the result may be returned in either string or data form, but + * will be converted to string for display and use anyway. + * Note that certain MySQL versions also return data types for strings - eg SHOW + * commands like SHOW CREATE TABLE or SHOW VARIABLES, and this conversion can be + * necessary there. + */ +@property (readwrite, assign) BOOL returnDataAsStrings; + +@property (readwrite, assign) SPMySQLResultRowType defaultRowReturnType; + +@end + +/** + * Set up a static function to allow fast calling with cached selectors + */ +static inline id SPMySQLResultGetRow(SPMySQLResult* self, SPMySQLResultRowType rowType) +{ + typedef id (*SPMySQLResultGetRowMethodPtr)(SPMySQLResult*, SEL, SPMySQLResultRowType); + static SPMySQLResultGetRowMethodPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(getRowAsType:); + if (!cachedMethodPointer) cachedMethodPointer = (SPMySQLResultGetRowMethodPtr)[self methodForSelector:cachedSelector]; + + return cachedMethodPointer(self, cachedSelector, rowType); +} diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLResult.m b/Frameworks/SPMySQLFramework/Source/SPMySQLResult.m new file mode 100644 index 00000000..3ccd5727 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLResult.m @@ -0,0 +1,464 @@ +// +// $Id$ +// +// SPMySQLResult.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on January 26, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQLResult.h" +#import "SPMySQL Private APIs.h" +#import "SPMySQLArrayAdditions.h" + +static SPMySQLResultFieldProcessor fieldProcessingMap[256]; +static id NSNullPointer; + +@implementation SPMySQLResult + +#pragma mark - +#pragma mark Synthesized properties + +@synthesize returnDataAsStrings; +@synthesize defaultRowReturnType; + +#pragma mark - +#pragma mark Setup and teardown + +/** + * In the one-off class initialisation, set up the result processing map + */ ++ (void)initialize +{ + + // Cached NSNull singleton reference + if (!NSNullPointer) NSNullPointer = [NSNull null]; + + // Go through the list of enum_field_types in mysql_com.h, mapping each to the method for + // processing that result set. + fieldProcessingMap[MYSQL_TYPE_DECIMAL] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_TINY] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_SHORT] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_LONG] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_FLOAT] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_DOUBLE] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_NULL] = SPMySQLResultFieldAsNull; + fieldProcessingMap[MYSQL_TYPE_TIMESTAMP] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_LONGLONG] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_INT24] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_DATE] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_TIME] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_DATETIME] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_YEAR] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_NEWDATE] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_VARCHAR] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_BIT] = SPMySQLResultFieldAsBit; + fieldProcessingMap[MYSQL_TYPE_NEWDECIMAL] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_ENUM] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_SET] = SPMySQLResultFieldAsString; + fieldProcessingMap[MYSQL_TYPE_TINY_BLOB] = SPMySQLResultFieldAsBlob; + fieldProcessingMap[MYSQL_TYPE_MEDIUM_BLOB] = SPMySQLResultFieldAsBlob; + fieldProcessingMap[MYSQL_TYPE_LONG_BLOB] = SPMySQLResultFieldAsBlob; + fieldProcessingMap[MYSQL_TYPE_BLOB] = SPMySQLResultFieldAsBlob; + fieldProcessingMap[MYSQL_TYPE_VAR_STRING] = SPMySQLResultFieldAsStringOrBlob; + fieldProcessingMap[MYSQL_TYPE_STRING] = SPMySQLResultFieldAsStringOrBlob; + fieldProcessingMap[MYSQL_TYPE_GEOMETRY] = SPMySQLResultFieldAsGeometry; + fieldProcessingMap[MYSQL_TYPE_DECIMAL] = SPMySQLResultFieldAsString; +} + +/** + * Prevent SPMySQLResults from being init'd normally. + */ +- (id)init +{ + [NSException raise:NSInternalInconsistencyException format:@"SPMySQLResults should not be init'd directly; use initWithMySQLResult:stringEncoding: instead."]; + return nil; +} + +/** + * Standard init method, constructing the SPMySQLResult around a MySQL + * result pointer and the encoding to use when working with the data. + */ +- (id)initWithMySQLResult:(void *)theResult stringEncoding:(NSStringEncoding)theStringEncoding +{ + + // If no result set was passed in, return nil. + if (!theResult) return nil; + + if ((self = [super init])) { + stringEncoding = theStringEncoding; + queryExecutionTime = -1; + + // Get the result set and cache the number of fields and number of rows + resultSet = theResult; + numberOfFields = mysql_num_fields(resultSet); + numberOfRows = mysql_num_rows(resultSet); + currentRowIndex = 0; + + // Cache the field definitions and build up an array of cached field names and types + fieldDefinitions = mysql_fetch_fields(resultSet); + fieldNames = malloc(sizeof(NSString *) * numberOfFields); + fieldTypes = malloc(sizeof(unsigned int) * numberOfFields); + for (NSUInteger i = 0; i < numberOfFields; i++) { + MYSQL_FIELD aField = fieldDefinitions[i]; + fieldNames[i] = [[self _stringWithBytes:aField.name length:aField.name_length] retain]; + fieldTypes[i] = aField.type; + } + + defaultRowReturnType = SPMySQLResultRowAsDictionary; + } + + return self; +} + +- (void)dealloc +{ + mysql_free_result(resultSet); + + for (NSUInteger i = 0; i < numberOfFields; i++) { + [fieldNames[i] release]; + } + free(fieldNames); + free(fieldTypes); + + [super dealloc]; +} + +#pragma mark - +#pragma mark Result set information + +/** + * Return the number of fields in the result set. + */ +- (NSUInteger)numberOfFields +{ + return numberOfFields; +} + +/** + * Return the number of data rows in the result set. + */ +- (unsigned long long)numberOfRows +{ + return numberOfRows; +} + +/** + * Return how long the original query took to execute - including connection lag! + */ +- (double)queryExecutionTime +{ + return queryExecutionTime; +} + +#pragma mark - +#pragma mark Column information + +/** + * Retrieve the field names for the result set, as an NSArray of NSStrings. + */ +- (NSArray *)fieldNames +{ + return [NSArray arrayWithObjects:fieldNames count:numberOfFields]; +} + +/** + * For field definitions, see Result Categories/Field Definitions.h/m + */ + +#pragma mark - +#pragma mark Data retrieval + +/** + * Jump to a specified row in the result set; when the result set is initialised, + * the internal pointer automatically starts at 0. + */ +- (void)seekToRow:(unsigned long long)targetRow +{ + if (targetRow == currentRowIndex) return; + + if (targetRow >= numberOfRows) { + targetRow = numberOfRows - 1; + } + + mysql_data_seek(resultSet, targetRow); + currentRowIndex = targetRow; +} + +/** + * Retrieve the next row in the result set, using the internal pointer, in the + * instance-specified setDefaultRowReturnType: row format (defaulting to NSDictionary). + * If there are no rows remaining, returns nil. + */ +- (id)getRow +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsDefault); +} + +/** + * Retrieve the next row in the result set, using the internal pointer, in the + * instance-specified setDefaultRowReturnType: row format (defaulting to NSDictionary). + * If there are no rows remaining, returns nil. + */ +- (NSArray *)getRowAsArray +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsArray); +} + +/** + * Retrieve the next row in the result set, using the internal pointer, in the + * instance-specified setDefaultRowReturnType: row format (defaulting to NSDictionary). + * If there are no rows remaining, returns nil. + */ +- (NSDictionary *)getRowAsDictionary +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsDictionary); +} + +/** + * Retrieve the next row in the result set, using the internal pointer, in the specified + * return format. + * If there are no rows remaining in the current iteration, returns nil. + */ +- (id)getRowAsType:(SPMySQLResultRowType)theType +{ + MYSQL_ROW theRow; + unsigned long *theRowDataLengths; + id theReturnData; + + // Retrieve the row in MySQL format, and the length of the data within the row + theRow = mysql_fetch_row(resultSet); + theRowDataLengths = mysql_fetch_lengths(resultSet); + + // If no row was returned, likely at the end of the result set - return nil + if (!theRow) return nil; + + // If the target type was unspecified, use the instance default + if (theType == SPMySQLResultRowAsDefault) theType = defaultRowReturnType; + + // Set up the return data as appropriate + if (theType == SPMySQLResultRowAsArray) { + theReturnData = [NSMutableArray arrayWithCapacity:numberOfFields]; + } else { + theReturnData = [NSMutableDictionary dictionaryWithCapacity:numberOfFields]; + } + + // Convert each of the cells in the row in turn + for (NSUInteger i = 0; i < numberOfFields; i++) { + id cellData = SPMySQLResultGetObject(self, theRow[i], theRowDataLengths[i], fieldTypes[i], i); + + // If object creation failed, display a null + if (!cellData) cellData = NSNullPointer; + + // Add to the result array/dictionary + if (theType == SPMySQLResultRowAsArray) { + SPMySQLMutableArrayInsertObject(theReturnData, cellData, i); + } else { + [(NSMutableDictionary *)theReturnData setObject:cellData forKey:fieldNames[i]]; + } + } + + // Increment the row pointer index and set to NSNotFound if the end of the result set has + // been reached + currentRowIndex++; + if (currentRowIndex > numberOfRows) currentRowIndex = NSNotFound; + + return theReturnData; +} + +#pragma mark - +#pragma mark Data retrieval for fast enumeration + +/** + * Implement the fast enumeration endpoint. Rows for fast enumeration are retrieved in + * the instance default, as specified in setDefaultRowReturnType: or defaulting to + * NSDictionary. + */ +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len +{ + + // If the start index is out of bounds, return 0 to indicate end of results + if (state->state >= numberOfRows) return 0; + + // Sync up the MySQL pointer position with the requested state if necessary + if (state->state != currentRowIndex) [self seekToRow:state->state]; + + // Determine how many objects to return - 128, len, or all items remaining + NSUInteger itemsToReturn = 128; + if (len < 128) itemsToReturn = len; + if (numberOfRows - state->state < itemsToReturn) { + itemsToReturn = (unsigned long)(numberOfRows - state->state); + } + + // Loop through the rows and add them to the result stack + NSUInteger i; + for (i = 0; i < itemsToReturn; i++) { + stackbuf[i] = SPMySQLResultGetRow(self, SPMySQLResultRowAsDefault); + } + + state->state += itemsToReturn; + state->itemsPtr = stackbuf; + state->mutationsPtr = (unsigned long *)self; + + return itemsToReturn; +} + +#pragma mark - +#pragma mark Data conversion + +/** + * Provides a binary representation of the supplied bytes as a returned NSString. + * The resulting binary representation will be zero-padded according to the supplied + * field length. + */ ++ (NSString *)bitStringWithBytes:(const char *)bytes length:(NSUInteger)length padToLength:(NSUInteger)padLength +{ + if (bytes == NULL) return nil; + + NSUInteger i = 0; + length--; + padLength--; + + // Generate a C string representation of the binary data + char *cStringBuffer = malloc(length + 1); + while (i <= padLength) { + cStringBuffer[padLength - i++] = ( (bytes[length - (i >> 3)] >> (i & 0x7)) & 1 ) ? '1' : '0'; + } + cStringBuffer[padLength+1] = '\0'; + + // Convert to a string + NSString *returnString = [NSString stringWithUTF8String:cStringBuffer]; + + // Free up memory and return + free(cStringBuffer); + return returnString; +} + +@end + +#pragma mark - +#pragma mark Result set internals + +@implementation SPMySQLResult (Private_API) + +/** + * Support internal string conversions which take a supplied byte sequence and length + * and convert them to an NSString using the instance encoding. Will preserve nul + * characters within the string. + */ +- (id)_stringWithBytes:(const void *)bytes length:(NSUInteger)length +{ + return [[[NSString alloc] initWithBytes:bytes length:length encoding:stringEncoding] autorelease]; +} + +/** + * Allow setting the execution time for the original query (including connection lag) + * so it can be requested later without relying on connection state. + */ +- (void)_setQueryExecutionTime:(double)theExecutionTime +{ + queryExecutionTime = theExecutionTime; +} + +/** + * Core data conversion function, taking C data provided by MySQL and converting + * to an appropriate return type. + * Note that the data passed in currently is *not* nul-terminated for fast + * streaming results, which is safe for the current implementation but should be + * kept in mind for future changes. + */ +- (id)_getObjectFromBytes:(char *)bytes ofLength:(NSUInteger)length fieldType:(unsigned int)fieldType fieldDefinitionIndex:(NSUInteger)fieldIndex +{ + + // A NULL pointer for the data indicates a null value; return a NSNull object. + if (bytes == NULL) return NSNullPointer; + + // Determine the field processor to use + SPMySQLResultFieldProcessor dataProcessor = fieldProcessingMap[fieldType]; + + // Switch the method to process the cell data based on the field type mapping. + // Do this in two passes: the first as logic may cause a change in processor required. + switch (dataProcessor) { + + // STRING and VAR_STRING types may be strings or binary types; check the binary flag + case SPMySQLResultFieldAsStringOrBlob: + if (fieldDefinitions[fieldIndex].flags & BINARY_FLAG) { + dataProcessor = SPMySQLResultFieldAsBlob; + } + break; + + // Blob types may be automatically be converted to strings, or may be non-binary + case SPMySQLResultFieldAsBlob: + if (!(fieldDefinitions[fieldIndex].flags & BINARY_FLAG)) { + dataProcessor = SPMySQLResultFieldAsString; + } + break; + + // In most cases, use the original data processor. + default: + break; + } + + // If this instance is set to convert all data as strings, alter the processor. + if (returnDataAsStrings && dataProcessor == SPMySQLResultFieldAsBlob) { + dataProcessor = SPMySQLResultFieldAsString; + } + + // Now switch the processing method again to actually process the data. + switch (dataProcessor) { + + // Convert string types using a method that will preserve any nul characters + // within the string + case SPMySQLResultFieldAsString: + case SPMySQLResultFieldAsStringOrBlob: + return [[[NSString alloc] initWithBytes:bytes length:length encoding:stringEncoding] autorelease]; + + // Convert BLOB types to NSData + case SPMySQLResultFieldAsBlob: + return [NSData dataWithBytes:bytes length:length]; + + // For Geometry types, use a special Geometry object to handle their complexity + case SPMySQLResultFieldAsGeometry: + return [SPMySQLGeometryData dataWithBytes:bytes length:length]; + + // For bit fields, get a zero-padded representation of the data + case SPMySQLResultFieldAsBit: + return [SPMySQLResult bitStringWithBytes:bytes length:length padToLength:fieldDefinitions[fieldIndex].length]; + + // Convert null types to NSNulls + case SPMySQLResultFieldAsNull: + return NSNullPointer; + + case SPMySQLResultFieldAsUnhandled: + NSLog(@"SPMySQLResult processing encountered an unknown field type (%d), falling back to NSData handling", fieldType); + return [NSData dataWithBytes:bytes length:length]; + } + + [NSException raise:NSInternalInconsistencyException format:@"Unhandled field type when processing SPMySQLResults"]; + return nil; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLStreamingResult.h b/Frameworks/SPMySQLFramework/Source/SPMySQLStreamingResult.h new file mode 100644 index 00000000..5abb85db --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLStreamingResult.h @@ -0,0 +1,54 @@ +// +// $Id$ +// +// SPMySQLStreamingResult.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 18, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +@interface SPMySQLStreamingResult : SPMySQLResult { + + // Keep a link to the parent connection for locking purposes + SPMySQLConnection *parentConnection; + + // Streaming result information and tracking + BOOL connectionUnlocked; + BOOL dataDownloaded; + + // Counts and memory length tracking + NSUInteger downloadedRowCount; + + IMP isConnectedPtr; + SEL isConnectedSelector; +} + +- (id)initWithMySQLResult:(void *)theResult stringEncoding:(NSStringEncoding)theStringEncoding connection:(SPMySQLConnection *)theConnection; + +// Allow result fetching to be cancelled +- (void)cancelResultLoad; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLStreamingResult.m b/Frameworks/SPMySQLFramework/Source/SPMySQLStreamingResult.m new file mode 100644 index 00000000..b19e5356 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLStreamingResult.m @@ -0,0 +1,246 @@ +// +// $Id$ +// +// SPMySQLStreamingResult.m +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 18, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQLStreamingResult.h" +#import "SPMySQL Private APIs.h" + + +/** + * This type of streaming result allows each row to be accessed on-demand; this can + * be dangerous as it means a SELECT will tie up the server for longer, as for MyISAM + * tables updates (and subsequent reads) must block while a SELECT is still running. + * However this can be useful for certain processes such as working with very large + * tables to keep memory usage low. + */ + +@implementation SPMySQLStreamingResult + +#pragma mark - + +/** + * Prevent SPMySQLStreamingResults from being init'd as SPMySQLResults. + */ +- (id)initWithMySQLResult:(void *)theResult stringEncoding:(NSStringEncoding)theStringEncoding +{ + [NSException raise:NSInternalInconsistencyException format:@"SPMySQLFullStreamingResults should not be init'd as SPMySQLResults; use initWithMySQLResult:stringEncoding:connection:withFullStreaming: instead."]; + return nil; +} + +/** + * Standard init method, constructing the SPMySQLStreamingResult around a MySQL + * result pointer and the encoding to use when working with the data. + * As opposed to SPMySQLResult, defaults to returning rows as arrays, as the result + * sets are likely to be larger and processed in loops. + */ +- (id)initWithMySQLResult:(void *)theResult stringEncoding:(NSStringEncoding)theStringEncoding connection:(SPMySQLConnection *)theConnection +{ + + // If no result set was passed in, return nil. + if (!theResult) return nil; + + if ((self = [super initWithMySQLResult:theResult stringEncoding:theStringEncoding])) { + parentConnection = theConnection; + numberOfRows = NSNotFound; + + // Start with no rows downloaded + downloadedRowCount = 0; + dataDownloaded = NO; + connectionUnlocked = NO; + + // Cache the isConnected selector and pointer for fast connection checks + isConnectedSelector = @selector(isConnected); + isConnectedPtr = [parentConnection methodForSelector:isConnectedSelector]; + + // Default to returning rows as arrays + defaultRowReturnType = SPMySQLResultRowAsArray; + } + + return self; +} + +/** + * Deallocate the result and ensure the parent connection is unlocked for further use. + */ +- (void)dealloc +{ + + // Ensure all data is processed and the parent connection is unlocked + [self cancelResultLoad]; + + // Throw an exception if in invalid state + if (!connectionUnlocked) { + [parentConnection _unlockConnection]; + [NSException raise:NSInternalInconsistencyException format:@"Parent connection remains locked after SPMySQLStreamingResult use"]; + } + + [super dealloc]; +} + +#pragma mark - +#pragma mark Result set information + +/** + * Override the return of the number of rows in the data set. If this is used before the + * data is fully downloaded, the number of results is still unknown (the server may still + * be seeking/matching), so return NSNotFound; otherwise the number of rows is returned. + */ +- (unsigned long long)numberOfRows +{ + if (!dataDownloaded) return NSNotFound; + + return downloadedRowCount; +} + +#pragma mark - +#pragma mark Data retrieval + +/** + * Override seeking behaviour: seeking cannot be used in streaming result sets. + */ +- (void)seekToRow:(unsigned long long)targetRow +{ + [NSException raise:NSInternalInconsistencyException format:@"Seeking is not supported in streaming SPMySQL result sets."]; +} + +/** + * Override the convenience selectors so that forwarding works correctly. + */ +- (id)getRow +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsDefault); +} +- (NSArray *)getRowAsArray +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsArray); +} +- (NSDictionary *)getRowAsDictionary +{ + return SPMySQLResultGetRow(self, SPMySQLResultRowAsDictionary); +} + +/** + * Retrieve the next row in the result set, using the internal pointer, in the specified + * return format. + * If there are no rows remaining in the current iteration, returns nil. + */ +- (id)getRowAsType:(SPMySQLResultRowType)theType +{ + id theRow = nil; + + // Ensure that the connection is still up before performing a row fetch + if ((*isConnectedPtr)(parentConnection, isConnectedSelector)) { + + // The core of result fetching in streaming mode is still based around mysql_fetch_row, + // so use the super to perform normal processing. + theRow = [super getRowAsType:theType]; + } + + // If no row was returned, the end of the result set has been reached. Clear markers, + // unlock the parent connection, and return nil. + if (!theRow) { + dataDownloaded = YES; + [parentConnection _unlockConnection]; + connectionUnlocked = YES; + return nil; + } + + // Otherwise increment the data downloaded counter and return the row + downloadedRowCount++; + + return theRow; +} + +/* + * Ensure the result set is fully processed and freed without any processing + * This method ensures that the connection is unlocked. + */ +- (void)cancelResultLoad +{ + + // If data has already been downloaded successfully, no further action is required + if (dataDownloaded) return; + + MYSQL_ROW theRow; + + // Loop through all the rows and ensure the rows are fetched. + while (1) { + theRow = mysql_fetch_row(resultSet); + + // If no data was returned, we're at the end of the result set - return. + if (theRow == NULL) { + dataDownloaded = YES; + if (!connectionUnlocked) { + [parentConnection _unlockConnection]; + connectionUnlocked = YES; + } + return; + } + + downloadedRowCount++; + } +} + +#pragma mark - +#pragma mark Data retrieval for fast enumeration + +/** + * Implement the fast enumeration endpoint. Rows for fast enumeration are retrieved in + * the instance default, as specified in setDefaultRowReturnType: or defaulting to + * NSDictionary. Full streaming mode - return one row at a time. + */ +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len +{ + + // If all rows have been retrieved, return 0 to stop iteration. + if (dataDownloaded) return 0; + + // If the MySQL row pointer does not match the requested state, throw an exception + if (state->state != currentRowIndex) { + [NSException raise:NSRangeException format:@"SPMySQLStreamingResult results can only be accessed linearly"]; + } + + // In full streaming mode return one row at a time. Retrieve the row. + id theRow = SPMySQLResultGetRow(self, SPMySQLResultRowAsDefault); + + // If nil was returned the end of the result resource has been reached + if (!theRow) return 0; + + // Add the row to the result stack and update state + stackbuf[0] = theRow; + state->state += 1; + state->itemsPtr = stackbuf; + state->mutationsPtr = (unsigned long *)self; + + return 1; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLStringAdditions.h b/Frameworks/SPMySQLFramework/Source/SPMySQLStringAdditions.h new file mode 100644 index 00000000..b1f9ccd0 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLStringAdditions.h @@ -0,0 +1,39 @@ +// +// $Id$ +// +// SPMySQLStringAdditions.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 8, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + + +@interface NSString (SPMySQLStringAdditions) + +- (NSString *)mySQLBacktickQuotedString; +- (NSString *)mySQLTickQuotedString; + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLStringAdditions.m b/Frameworks/SPMySQLFramework/Source/SPMySQLStringAdditions.m new file mode 100644 index 00000000..1ea966de --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLStringAdditions.m @@ -0,0 +1,57 @@ +// +// $Id$ +// +// SPMySQLStringAdditions.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 8, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#import "SPMySQLStringAdditions.h" + +@implementation NSString (SPMySQLStringAdditions) + +/** + * Returns the string quoted with backticks as required for MySQL identifiers + * eg.: tablename => `tablename` + * my`table => `my``table` + */ +- (NSString *)mySQLBacktickQuotedString +{ + return [NSString stringWithFormat: @"`%@`", [self stringByReplacingOccurrencesOfString:@"`" withString:@"``"]]; +} + +/** + * Returns the string quoted with ticks as required for MySQL identifiers + * eg.: tablename => 'tablename' + * my'table => 'my''table' + */ +- (NSString *)mySQLTickQuotedString +{ + return [NSString stringWithFormat: @"'%@'", [self stringByReplacingOccurrencesOfString:@"'" withString:@"''"]]; +} + +@end diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h b/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h new file mode 100644 index 00000000..0a8c19b0 --- /dev/null +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h @@ -0,0 +1,45 @@ +// +// $Id$ +// +// Locking.h +// SPMySQLFramework +// +// Created by Rowan Beentje (rowan.beent.je) on February 6, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// More info at <http://code.google.com/p/sequel-pro/> + +#include <mach/mach_time.h> + +/** + * Define a project function to make it easier to use mach_absolute_time() + * to track monotonically increasing time. + */ +static double _elapsedSecondsSinceAbsoluteTime(uint64_t comparisonTime) +{ + uint64_t elapsedTime_t = mach_absolute_time() - comparisonTime; + Nanoseconds elapsedTime = AbsoluteToNanoseconds(*(AbsoluteTime *)&(elapsedTime_t)); + + return (((double)UnsignedWideToUInt64(elapsedTime)) * 1e-9); +}
\ No newline at end of file diff --git a/Frameworks/SPMySQLFramework/build-mysql-client.sh b/Frameworks/SPMySQLFramework/build-mysql-client.sh new file mode 100755 index 00000000..45e3c465 --- /dev/null +++ b/Frameworks/SPMySQLFramework/build-mysql-client.sh @@ -0,0 +1,171 @@ +#! /bin/ksh + +# +# $Id$ +# +# build-mysql-client.sh +# sequel-pro +# +# Created by Stuart Connolly (stuconnolly.com) +# Copyright (c) 2009 Stuart Connolly. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# More info at <http://code.google.com/p/sequel-pro/> + +# Builds the MySQL client libraries for distrubution in Sequel Pro's MySQL framework. +# +# Paramters: -s -- The path to the MySQL source directory. +# -q -- Quiet. Don't output any compiler messages. +# -c -- Clean the source after build completes. +# -d -- Debug. Output the build statements. + +QUIET='NO' +DEBUG='NO' +CLEAN='NO' + +# C/C++ compiler flags +export CFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386 -arch x86_64 -O3 -fno-omit-frame-pointer -fno-exceptions -mmacosx-version-min=10.5' +export CXXFLAGS='-isysroot /Developer/SDKs/MacOSX10.5.sdk -arch ppc -arch i386 -arch x86_64 -O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -mmacosx-version-min=10.5' + +CONFIGURE_OPTIONS='--without-server --enable-thread-safe-client --disable-dependency-tracking --enable-local-infile --with-ssl --enable-assembler --with-mysqld-ldflags=-all-static' +BINARY_DISTRIBUTION_SCRIPT='scripts/make_binary_distribution' + +usage() +{ + cat <<!EOF +Usage: $(basename $0): -s <mysql_source_path> [-q -c -d] + +Where: -s -- Path to the MySQL source directory + -q -- Be quiet during the build. Suppress all compiler messages + -c -- Clean the source directory after the build completes + -d -- Debug. Output all the build commands +!EOF +} + +if [ $# -eq 0 ] +then + echo "Invalid number of arguments. I need the path to the MySQL source directory." + echo '' + usage + exit 1 +fi + +echo '' +echo "This script builds the MySQL client libraries for distribution in Sequel Pro's MySQL framework." +echo 'They are all built as 3-way binaries (32 bit PPC, 32/64 bit i386).' +echo '' +echo -n 'This may take a while, are you sure you want to continue [y | n]: ' + +read CONTINUE + +if [ "x${CONTINUE}" == 'xn' ] +then + echo 'Aborting...' + exit 0 +fi + +while getopts ':s:qcd' OPTION +do + case "$OPTION" in + s) MYSQL_SOURCE_DIR="$OPTARG";; + q) QUIET='YES';; + c) CLEAN='YES';; + d) DEBUG='YES';; + *) echo 'Unrecognised option'; usage; exit 1;; + esac +done + +if [ ! -d "$MYSQL_SOURCE_DIR" ] +then + echo "MySQL source directory does not exist at path '${MYSQL_SOURCE_DIR}'." + echo 'Exiting...' + exit 1 +fi + +# Change to source directory +cd "$MYSQL_SOURCE_DIR" + +echo 'Configuring MySQL source...' + +if [ "x${DEBUG}" == 'xYES' ] +then + echo "${MYSQL_SOURCE_DIR}/configure" "$CONFIGURE_OPTIONS" +fi + +if [ "x${QUIET}" == 'xYES' ] +then + ./configure $CONFIGURE_OPTIONS > /dev/null +else + ./configure $CONFIGURE_OPTIONS +fi + +if [ $? -eq 0 ] +then + echo 'Configure successfully completed' +else + echo 'Configure failed. Exiting...' + exit 1 +fi + +echo 'Building client libraries...' + +if [ "x${QUIET}" == 'xYES' ] +then + make > /dev/null +else + make +fi + +if [ $? -eq 0 ] +then + echo 'Building libraries successfully completed' +else + echo 'Building libraries failed. Exiting...' + exit 1 +fi + +echo 'Building binary distribution...' + +if [ "x${QUIET}" == 'xYES' ] +then + $BINARY_DISTRIBUTION_SCRIPT > /dev/null +else + $BINARY_DISTRIBUTION_SCRIPT +fi + +if [ $? -eq 0 ] +then + echo 'Building binary distribution successfully completed' +else + echo 'Building binary distribution failed. Exiting...' + exit 1 +fi + +if [ "x${CLEAN}" == 'xYES' ] +then + echo 'Cleaning build...' + + if [ "x${QUIET}" == 'xYES' ] + then + make clean > /dev/null + else + make clean + fi +fi + +echo 'Building MySQL client libraries successfully completed.' + +exit 0 diff --git a/Interfaces/English.lproj/ConnectionErrorDialog.xib b/Interfaces/English.lproj/ConnectionErrorDialog.xib index 99416d48..e597f4a4 100644 --- a/Interfaces/English.lproj/ConnectionErrorDialog.xib +++ b/Interfaces/English.lproj/ConnectionErrorDialog.xib @@ -1,1224 +1,1225 @@ <?xml version="1.0" encoding="UTF-8"?> <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> - <data> - <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">10K540</string> - <string key="IBDocument.InterfaceBuilderVersion">851</string> - <string key="IBDocument.AppKitVersion">1038.36</string> - <string key="IBDocument.HIToolboxVersion">461.00</string> - <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="NS.object.0">851</string> - </object> - <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="2"/> - </object> - <object class="NSArray" key="IBDocument.PluginDependencies"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </object> - <object class="NSMutableDictionary" key="IBDocument.Metadata"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys" id="0"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomObject" id="1001"> - <string key="NSClassName">NSObject</string> - </object> - <object class="NSCustomObject" id="1003"> - <string key="NSClassName">FirstResponder</string> - </object> - <object class="NSCustomObject" id="1004"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSWindowTemplate" id="1018659152"> - <int key="NSWindowStyleMask">1</int> - <int key="NSWindowBacking">2</int> - <string key="NSWindowRect">{{196, 363}, {533, 147}}</string> - <int key="NSWTFlags">1946157056</int> - <string key="NSWindowTitle">Connection Error</string> - <string key="NSWindowClass">NSWindow</string> - <nil key="NSViewClass"/> - <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string> - <object class="NSView" key="NSWindowView" id="552671949"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTextField" id="625523505"> - <reference key="NSNextResponder" ref="552671949"/> - <int key="NSvFlags">274</int> - <string key="NSFrame">{{112, 64}, {404, 34}}</string> - <reference key="NSSuperview" ref="552671949"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1045633636"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">272629760</int> - <string key="NSContents">Sequel Pro appears to have lost the connection to the server, or the server has stopped responding.</string> - <object class="NSFont" key="NSSupport" id="874654698"> - <string key="NSName">LucidaGrande</string> - <double key="NSSize">13</double> - <int key="NSfFlags">1044</int> - </object> - <reference key="NSControlView" ref="625523505"/> - <object class="NSColor" key="NSBackgroundColor" id="983397243"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">controlColor</string> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> - </object> - </object> - <object class="NSColor" key="NSTextColor" id="253309338"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">controlTextColor</string> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MAA</bytes> - </object> - </object> - </object> - </object> - <object class="NSButton" id="725257225"> - <reference key="NSNextResponder" ref="552671949"/> - <int key="NSvFlags">289</int> - <string key="NSFrame">{{365, 12}, {154, 32}}</string> - <reference key="NSSuperview" ref="552671949"/> - <int key="NSTag">1</int> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="884446740"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents">Reconnect</string> - <reference key="NSSupport" ref="874654698"/> - <reference key="NSControlView" ref="725257225"/> - <int key="NSButtonFlags">-2038284033</int> - <int key="NSButtonFlags2">129</int> - <string key="NSAlternateContents"/> - <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSButton" id="946689239"> - <reference key="NSNextResponder" ref="552671949"/> - <int key="NSvFlags">289</int> - <string key="NSFrame">{{198, 12}, {167, 32}}</string> - <reference key="NSSuperview" ref="552671949"/> - <int key="NSTag">2</int> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="47055839"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents">Close connection</string> - <reference key="NSSupport" ref="874654698"/> - <reference key="NSControlView" ref="946689239"/> - <int key="NSButtonFlags">-2038284033</int> - <int key="NSButtonFlags2">129</int> - <string key="NSAlternateContents"/> - <string type="base64-UTF8" key="NSKeyEquivalent">Gw</string> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSImageView" id="974501507"> - <reference key="NSNextResponder" ref="552671949"/> - <int key="NSvFlags">256</int> - <object class="NSMutableSet" key="NSDragTypes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="set.sortedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>Apple PDF pasteboard type</string> - <string>Apple PICT pasteboard type</string> - <string>Apple PNG pasteboard type</string> - <string>NSFilenamesPboardType</string> - <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> - <string>NeXT TIFF v4.0 pasteboard type</string> - </object> - </object> - <string key="NSFrame">{{20, 53}, {75, 74}}</string> - <reference key="NSSuperview" ref="552671949"/> - <bool key="NSEnabled">YES</bool> - <object class="NSImageCell" key="NSCell" id="24661938"> - <int key="NSCellFlags">130560</int> - <int key="NSCellFlags2">33554432</int> - <object class="NSCustomResource" key="NSContents"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">appicon</string> - </object> - <int key="NSAlign">0</int> - <int key="NSScale">0</int> - <int key="NSStyle">0</int> - <bool key="NSAnimates">YES</bool> - </object> - <bool key="NSEditable">YES</bool> - </object> - <object class="NSImageView" id="987221964"> - <reference key="NSNextResponder" ref="552671949"/> - <int key="NSvFlags">256</int> - <object class="NSMutableSet" key="NSDragTypes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="set.sortedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>Apple PDF pasteboard type</string> - <string>Apple PICT pasteboard type</string> - <string>Apple PNG pasteboard type</string> - <string>NSFilenamesPboardType</string> - <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> - <string>NeXT TIFF v4.0 pasteboard type</string> - </object> - </object> - <string key="NSFrame">{{70, 49}, {32, 32}}</string> - <reference key="NSSuperview" ref="552671949"/> - <bool key="NSEnabled">YES</bool> - <object class="NSImageCell" key="NSCell" id="572830162"> - <int key="NSCellFlags">130560</int> - <int key="NSCellFlags2">33554432</int> - <object class="NSCustomResource" key="NSContents"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSNetwork</string> - </object> - <int key="NSAlign">0</int> - <int key="NSScale">0</int> - <int key="NSStyle">0</int> - <bool key="NSAnimates">YES</bool> - </object> - <bool key="NSEditable">YES</bool> - </object> - <object class="NSTextField" id="728489069"> - <reference key="NSNextResponder" ref="552671949"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{112, 110}, {404, 17}}</string> - <reference key="NSSuperview" ref="552671949"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="298401010"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents">Connection Lost</string> - <object class="NSFont" key="NSSupport"> - <string key="NSName">LucidaGrande-Bold</string> - <double key="NSSize">13</double> - <int key="NSfFlags">16</int> - </object> - <reference key="NSControlView" ref="728489069"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="983397243"/> - <reference key="NSTextColor" ref="253309338"/> - </object> - </object> - </object> - <string key="NSFrameSize">{533, 147}</string> - <reference key="NSSuperview"/> - </object> - <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> - <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string> - </object> - </object> - <object class="IBObjectContainer" key="IBDocument.Objects"> - <object class="NSMutableArray" key="connectionRecords"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectionErrorDialog</string> - <reference key="source" ref="1001"/> - <reference key="destination" ref="1018659152"/> - </object> - <int key="connectionID">21</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">closeErrorConnectionSheet:</string> - <reference key="source" ref="1001"/> - <reference key="destination" ref="946689239"/> - </object> - <int key="connectionID">41</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">closeErrorConnectionSheet:</string> - <reference key="source" ref="1001"/> - <reference key="destination" ref="725257225"/> - </object> - <int key="connectionID">42</int> - </object> - </object> - <object class="IBMutableOrderedSet" key="objectRecords"> - <object class="NSArray" key="orderedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBObjectRecord"> - <int key="objectID">0</int> - <reference key="object" ref="0"/> - <reference key="children" ref="1000"/> - <nil key="parent"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-2</int> - <reference key="object" ref="1001"/> - <reference key="parent" ref="0"/> - <string key="objectName">File's Owner</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-1</int> - <reference key="object" ref="1003"/> - <reference key="parent" ref="0"/> - <string key="objectName">First Responder</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-3</int> - <reference key="object" ref="1004"/> - <reference key="parent" ref="0"/> - <string key="objectName">Application</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">1</int> - <reference key="object" ref="1018659152"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="552671949"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">ConnectionErrorDialog</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">2</int> - <reference key="object" ref="552671949"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="974501507"/> - <reference ref="987221964"/> - <reference ref="625523505"/> - <reference ref="728489069"/> - <reference ref="725257225"/> - <reference ref="946689239"/> - </object> - <reference key="parent" ref="1018659152"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">7</int> - <reference key="object" ref="625523505"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1045633636"/> - </object> - <reference key="parent" ref="552671949"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">8</int> - <reference key="object" ref="1045633636"/> - <reference key="parent" ref="625523505"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">11</int> - <reference key="object" ref="725257225"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="884446740"/> - </object> - <reference key="parent" ref="552671949"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">12</int> - <reference key="object" ref="884446740"/> - <reference key="parent" ref="725257225"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">13</int> - <reference key="object" ref="946689239"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="47055839"/> - </object> - <reference key="parent" ref="552671949"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">14</int> - <reference key="object" ref="47055839"/> - <reference key="parent" ref="946689239"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">26</int> - <reference key="object" ref="974501507"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="24661938"/> - </object> - <reference key="parent" ref="552671949"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">27</int> - <reference key="object" ref="24661938"/> - <reference key="parent" ref="974501507"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">28</int> - <reference key="object" ref="987221964"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="572830162"/> - </object> - <reference key="parent" ref="552671949"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">29</int> - <reference key="object" ref="572830162"/> - <reference key="parent" ref="987221964"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">33</int> - <reference key="object" ref="728489069"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="298401010"/> - </object> - <reference key="parent" ref="552671949"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">34</int> - <reference key="object" ref="298401010"/> - <reference key="parent" ref="728489069"/> - </object> - </object> - </object> - <object class="NSMutableDictionary" key="flattenedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>-3.IBPluginDependency</string> - <string>1.IBEditorWindowLastContentRect</string> - <string>1.IBPluginDependency</string> - <string>1.IBWindowTemplateEditedContentRect</string> - <string>1.NSWindowTemplate.visibleAtLaunch</string> - <string>11.IBPluginDependency</string> - <string>11.IBViewBoundsToFrameTransform</string> - <string>12.IBPluginDependency</string> - <string>13.IBPluginDependency</string> - <string>13.IBViewBoundsToFrameTransform</string> - <string>14.IBPluginDependency</string> - <string>2.IBPluginDependency</string> - <string>26.IBPluginDependency</string> - <string>27.IBPluginDependency</string> - <string>28.IBPluginDependency</string> - <string>29.IBPluginDependency</string> - <string>33.IBPluginDependency</string> - <string>34.IBPluginDependency</string> - <string>7.IBPluginDependency</string> - <string>8.IBPluginDependency</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{444, 866}, {533, 147}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{444, 866}, {533, 147}}</string> - <boolean value="NO"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDwwAAwigAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDTQAAwigAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </object> - </object> - <object class="NSMutableDictionary" key="unlocalizedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <nil key="activeLocalization"/> - <object class="NSMutableDictionary" key="localizations"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <nil key="sourceID"/> - <int key="maxID">43</int> - </object> - <object class="IBClassDescriber" key="IBDocument.Classes"> - <object class="NSMutableArray" key="referencedPartialClassDescriptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabDragAssistant.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenu</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPMenuAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/MCPKit/MCPFoundationKit/MCPNull.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPConnectionController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPContentFilterManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPImageView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPMainThreadTrampoline.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPNotLoaded.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPQueryFavoriteManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">toggleCollapse:</string> - <string key="NS.object.0">id</string> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <string key="NS.key.0">toggleCollapse:</string> - <object class="IBActionInfo" key="NS.object.0"> - <string key="name">toggleCollapse:</string> - <string key="candidateClassName">id</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPTablesList.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">closeErrorConnectionSheet:</string> - <string key="NS.object.0">id</string> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <string key="NS.key.0">closeErrorConnectionSheet:</string> - <object class="IBActionInfo" key="NS.object.0"> - <string key="name">closeErrorConnectionSheet:</string> - <string key="candidateClassName">id</string> - </object> - </object> - <object class="NSMutableDictionary" key="outlets"> - <string key="NS.key.0">connectionErrorDialog</string> - <string key="NS.object.0">NSWindow</string> - </object> - <object class="NSMutableDictionary" key="toOneOutletInfosByName"> - <string key="NS.key.0">connectionErrorDialog</string> - <object class="IBToOneOutletInfo" key="NS.object.0"> - <string key="name">connectionErrorDialog</string> - <string key="candidateClassName">NSWindow</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBUserSource</string> - <string key="minorKey"/> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPWindowAdditions.h</string> - </object> - </object> - </object> - <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBPartialClassDescription"> - <string key="className">NSActionCell</string> - <string key="superclassName">NSCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <string key="superclassName">NSResponder</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="992186721"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="800546732"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="892493037"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSButton</string> - <string key="superclassName">NSControl</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSButton.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSButtonCell</string> - <string key="superclassName">NSActionCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSCell</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSControl</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="280797840"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSFormatter</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSImageCell</string> - <string key="superclassName">NSCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSImageCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSImageView</string> - <string key="superclassName">NSControl</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSImageView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenu</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="778944579"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="992186721"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="800546732"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="892493037"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="280797840"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="778944579"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="421023361"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSError.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">PrintCore.framework/Headers/PDEPluginInterface.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">ShortcutRecorder.framework/Headers/SRValidator.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebDownload.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebEditingDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebFrameLoadDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebJavaPlugIn.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebPlugin.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebPluginContainer.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebPolicyDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebResourceLoadDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebScriptObject.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebUIDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSResponder</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSResponder</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextField</string> - <string key="superclassName">NSControl</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextFieldCell</string> - <string key="superclassName">NSActionCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <string key="superclassName">NSResponder</string> - <reference key="sourceIdentifier" ref="421023361"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/NSView+BWAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <string key="superclassName">NSResponder</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h</string> - </object> - </object> - </object> - </object> - <int key="IBDocument.localizationMode">0</int> - <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <integer value="1050" key="NS.object.0"/> - </object> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <integer value="1050" key="NS.object.0"/> - </object> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> - <integer value="3000" key="NS.object.0"/> - </object> - <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> - <string key="IBDocument.LastKnownRelativeProjectPath">../../sequel-pro.xcodeproj</string> - <int key="IBDocument.defaultPropertyAccessControl">3</int> - <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSNetwork</string> - <string>appicon</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>{32, 32}</string> - <string>{512, 512}</string> - </object> - </object> - </data> + <data> + <int key="IBDocument.SystemTarget">1050</int> + <string key="IBDocument.SystemVersion">11D50b</string> + <string key="IBDocument.InterfaceBuilderVersion">851</string> + <string key="IBDocument.AppKitVersion">1138.32</string> + <string key="IBDocument.HIToolboxVersion">568.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">851</string> + </object> + <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="2"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys" id="0"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="1001"> + <string key="NSClassName">NSObject</string> + </object> + <object class="NSCustomObject" id="1003"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="1004"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="1018659152"> + <int key="NSWindowStyleMask">1</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{196, 363}, {533, 147}}</string> + <int key="NSWTFlags">1946157056</int> + <string key="NSWindowTitle">Connection Error</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> + <object class="NSView" key="NSWindowView" id="552671949"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="625523505"> + <reference key="NSNextResponder" ref="552671949"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{112, 64}, {404, 34}}</string> + <reference key="NSSuperview" ref="552671949"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1045633636"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">272629760</int> + <string key="NSContents">Sequel Pro appears to have lost the connection to the server, or the server has stopped responding.</string> + <object class="NSFont" key="NSSupport" id="874654698"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1040</int> + </object> + <reference key="NSControlView" ref="625523505"/> + <object class="NSColor" key="NSBackgroundColor" id="983397243"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="253309338"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + </object> + <object class="NSButton" id="725257225"> + <reference key="NSNextResponder" ref="552671949"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{365, 12}, {154, 32}}</string> + <reference key="NSSuperview" ref="552671949"/> + <int key="NSTag">1</int> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="884446740"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Reconnect</string> + <reference key="NSSupport" ref="874654698"/> + <reference key="NSControlView" ref="725257225"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSButton" id="946689239"> + <reference key="NSNextResponder" ref="552671949"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{198, 12}, {167, 32}}</string> + <reference key="NSSuperview" ref="552671949"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="47055839"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Close connection</string> + <reference key="NSSupport" ref="874654698"/> + <reference key="NSControlView" ref="946689239"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string type="base64-UTF8" key="NSKeyEquivalent">Gw</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSImageView" id="974501507"> + <reference key="NSNextResponder" ref="552671949"/> + <int key="NSvFlags">256</int> + <object class="NSMutableSet" key="NSDragTypes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="set.sortedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>Apple PDF pasteboard type</string> + <string>Apple PICT pasteboard type</string> + <string>Apple PNG pasteboard type</string> + <string>NSFilenamesPboardType</string> + <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> + <string>NeXT TIFF v4.0 pasteboard type</string> + </object> + </object> + <string key="NSFrame">{{20, 53}, {75, 74}}</string> + <reference key="NSSuperview" ref="552671949"/> + <bool key="NSEnabled">YES</bool> + <object class="NSImageCell" key="NSCell" id="24661938"> + <int key="NSCellFlags">130560</int> + <int key="NSCellFlags2">33554432</int> + <object class="NSCustomResource" key="NSContents"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">appicon</string> + </object> + <int key="NSAlign">0</int> + <int key="NSScale">0</int> + <int key="NSStyle">0</int> + <bool key="NSAnimates">YES</bool> + </object> + <bool key="NSEditable">YES</bool> + </object> + <object class="NSImageView" id="987221964"> + <reference key="NSNextResponder" ref="552671949"/> + <int key="NSvFlags">256</int> + <object class="NSMutableSet" key="NSDragTypes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="set.sortedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>Apple PDF pasteboard type</string> + <string>Apple PICT pasteboard type</string> + <string>Apple PNG pasteboard type</string> + <string>NSFilenamesPboardType</string> + <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string> + <string>NeXT TIFF v4.0 pasteboard type</string> + </object> + </object> + <string key="NSFrame">{{70, 49}, {32, 32}}</string> + <reference key="NSSuperview" ref="552671949"/> + <bool key="NSEnabled">YES</bool> + <object class="NSImageCell" key="NSCell" id="572830162"> + <int key="NSCellFlags">130560</int> + <int key="NSCellFlags2">33554432</int> + <object class="NSCustomResource" key="NSContents"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSNetwork</string> + </object> + <int key="NSAlign">0</int> + <int key="NSScale">0</int> + <int key="NSStyle">0</int> + <bool key="NSAnimates">YES</bool> + </object> + <bool key="NSEditable">YES</bool> + </object> + <object class="NSTextField" id="728489069"> + <reference key="NSNextResponder" ref="552671949"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{112, 110}, {404, 17}}</string> + <reference key="NSSuperview" ref="552671949"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="298401010"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Connection Lost</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande-Bold</string> + <double key="NSSize">13</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="728489069"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="983397243"/> + <reference key="NSTextColor" ref="253309338"/> + </object> + </object> + </object> + <string key="NSFrameSize">{533, 147}</string> + <reference key="NSSuperview"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> + <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectionErrorDialog</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="1018659152"/> + </object> + <int key="connectionID">21</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">closeErrorConnectionSheet:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="946689239"/> + </object> + <int key="connectionID">41</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">closeErrorConnectionSheet:</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="725257225"/> + </object> + <int key="connectionID">42</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <reference key="object" ref="0"/> + <reference key="children" ref="1000"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="1001"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="1003"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="1004"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1</int> + <reference key="object" ref="1018659152"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="552671949"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">ConnectionErrorDialog</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2</int> + <reference key="object" ref="552671949"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="974501507"/> + <reference ref="987221964"/> + <reference ref="625523505"/> + <reference ref="728489069"/> + <reference ref="725257225"/> + <reference ref="946689239"/> + </object> + <reference key="parent" ref="1018659152"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">7</int> + <reference key="object" ref="625523505"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1045633636"/> + </object> + <reference key="parent" ref="552671949"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">8</int> + <reference key="object" ref="1045633636"/> + <reference key="parent" ref="625523505"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">11</int> + <reference key="object" ref="725257225"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="884446740"/> + </object> + <reference key="parent" ref="552671949"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">12</int> + <reference key="object" ref="884446740"/> + <reference key="parent" ref="725257225"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">13</int> + <reference key="object" ref="946689239"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="47055839"/> + </object> + <reference key="parent" ref="552671949"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">14</int> + <reference key="object" ref="47055839"/> + <reference key="parent" ref="946689239"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">26</int> + <reference key="object" ref="974501507"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="24661938"/> + </object> + <reference key="parent" ref="552671949"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">27</int> + <reference key="object" ref="24661938"/> + <reference key="parent" ref="974501507"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">28</int> + <reference key="object" ref="987221964"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="572830162"/> + </object> + <reference key="parent" ref="552671949"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">29</int> + <reference key="object" ref="572830162"/> + <reference key="parent" ref="987221964"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">33</int> + <reference key="object" ref="728489069"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="298401010"/> + </object> + <reference key="parent" ref="552671949"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">34</int> + <reference key="object" ref="298401010"/> + <reference key="parent" ref="728489069"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-3.IBPluginDependency</string> + <string>1.IBEditorWindowLastContentRect</string> + <string>1.IBPluginDependency</string> + <string>1.IBWindowTemplateEditedContentRect</string> + <string>1.NSWindowTemplate.visibleAtLaunch</string> + <string>11.IBPluginDependency</string> + <string>11.IBViewBoundsToFrameTransform</string> + <string>12.IBPluginDependency</string> + <string>13.IBPluginDependency</string> + <string>13.IBViewBoundsToFrameTransform</string> + <string>14.IBPluginDependency</string> + <string>2.IBPluginDependency</string> + <string>26.IBPluginDependency</string> + <string>27.IBPluginDependency</string> + <string>28.IBPluginDependency</string> + <string>29.IBPluginDependency</string> + <string>33.IBPluginDependency</string> + <string>34.IBPluginDependency</string> + <string>7.IBPluginDependency</string> + <string>8.IBPluginDependency</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{444, 709}, {533, 147}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{444, 709}, {533, 147}}</string> + <boolean value="NO"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDwwAAwigAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDTQAAwigAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="sourceID"/> + <int key="maxID">43</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabDragAssistant.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPMenuAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/MCPKit/MCPFoundationKit/MCPNull.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPConnectionController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPContentFilterManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPImageView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPMainThreadTrampoline.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPNotLoaded.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPQueryFavoriteManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <string key="NS.key.0">toggleCollapse:</string> + <string key="NS.object.0">id</string> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <string key="NS.key.0">toggleCollapse:</string> + <object class="IBActionInfo" key="NS.object.0"> + <string key="name">toggleCollapse:</string> + <string key="candidateClassName">id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPTablesList.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <string key="NS.key.0">closeErrorConnectionSheet:</string> + <string key="NS.object.0">id</string> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <string key="NS.key.0">closeErrorConnectionSheet:</string> + <object class="IBActionInfo" key="NS.object.0"> + <string key="name">closeErrorConnectionSheet:</string> + <string key="candidateClassName">id</string> + </object> + </object> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">connectionErrorDialog</string> + <string key="NS.object.0">NSWindow</string> + </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <string key="NS.key.0">connectionErrorDialog</string> + <object class="IBToOneOutletInfo" key="NS.object.0"> + <string key="name">connectionErrorDialog</string> + <string key="candidateClassName">NSWindow</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBUserSource</string> + <string key="minorKey"/> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPWindowAdditions.h</string> + </object> + </object> + </object> + <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">NSActionCell</string> + <string key="superclassName">NSCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="992186721"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="800546732"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="892493037"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSButton</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSButton.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSButtonCell</string> + <string key="superclassName">NSActionCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSCell</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSControl</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="280797840"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFormatter</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSImageCell</string> + <string key="superclassName">NSCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSImageCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSImageView</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSImageView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="778944579"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="992186721"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="800546732"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="892493037"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="280797840"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="778944579"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="421023361"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSError.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">PrintCore.framework/Headers/PDEPluginInterface.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">ShortcutRecorder.framework/Headers/SRValidator.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebEditingDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebFrameLoadDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebJavaPlugIn.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebPlugin.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebPluginContainer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebPolicyDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebResourceLoadDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebScriptObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebUIDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextField</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextFieldCell</string> + <string key="superclassName">NSActionCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <string key="superclassName">NSResponder</string> + <reference key="sourceIdentifier" ref="421023361"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/NSView+BWAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <string key="IBDocument.LastKnownRelativeProjectPath">../../sequel-pro.xcodeproj</string> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSNetwork</string> + <string>appicon</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>{32, 32}</string> + <string>{512, 512}</string> + </object> + </object> + </data> </archive> diff --git a/Interfaces/English.lproj/ConnectionView.xib b/Interfaces/English.lproj/ConnectionView.xib index 02c9330e..fd5f5092 100644 --- a/Interfaces/English.lproj/ConnectionView.xib +++ b/Interfaces/English.lproj/ConnectionView.xib @@ -1,8651 +1,8615 @@ <?xml version="1.0" encoding="UTF-8"?> <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> - <data> - <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">10K549</string> - <string key="IBDocument.InterfaceBuilderVersion">851</string> - <string key="IBDocument.AppKitVersion">1038.36</string> - <string key="IBDocument.HIToolboxVersion">461.00</string> - <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.brandonwalkin.BWToolkit</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>851</string> - <string>1.2.5</string> - </object> - </object> - <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="5433"/> - </object> - <object class="NSArray" key="IBDocument.PluginDependencies"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </object> - <object class="NSMutableDictionary" key="IBDocument.Metadata"> - <string key="NS.key.0">PluginDependencyRecalculationVersion</string> - <integer value="1" key="NS.object.0"/> - </object> - <object class="NSMutableArray" key="IBDocument.RootObjects" id="584594810"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomObject" id="545410097"> - <string key="NSClassName">SPConnectionController</string> - </object> - <object class="NSCustomObject" id="547391009"> - <string key="NSClassName">FirstResponder</string> - </object> - <object class="NSCustomObject" id="292263310"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSCustomView" id="733821228"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="BWSplitView" id="616749187"> - <reference key="NSNextResponder" ref="733821228"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="BWCustomView" id="551584428"> - <reference key="NSNextResponder" ref="616749187"/> - <int key="NSvFlags">256</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSScrollView" id="524598165"> - <reference key="NSNextResponder" ref="551584428"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSClipView" id="233523429"> - <reference key="NSNextResponder" ref="524598165"/> - <int key="NSvFlags">2304</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTableView" id="1012579052"> - <reference key="NSNextResponder" ref="233523429"/> - <int key="NSvFlags">4352</int> - <string key="NSFrameSize">{202, 450}</string> - <reference key="NSSuperview" ref="233523429"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="_NSCornerView" key="NSCornerView"> - <nil key="NSNextResponder"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{-26, 0}, {16, 17}}</string> - </object> - <object class="NSMutableArray" key="NSTableColumns"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTableColumn" id="131458815"> - <double key="NSWidth">199</double> - <double key="NSMinWidth">40</double> - <double key="NSMaxWidth">1000</double> - <object class="NSTableHeaderCell" key="NSHeaderCell"> - <int key="NSCellFlags">75628096</int> - <int key="NSCellFlags2">2048</int> - <string key="NSContents">Favorites</string> - <object class="NSFont" key="NSSupport" id="26"> - <string key="NSName">LucidaGrande</string> - <double key="NSSize">11</double> - <int key="NSfFlags">3100</int> - </object> - <object class="NSColor" key="NSBackgroundColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes> - </object> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">headerTextColor</string> - <object class="NSColor" key="NSColor" id="643097066"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MAA</bytes> - </object> - </object> - </object> - <object class="NSTextFieldCell" key="NSDataCell" id="93569184"> - <int key="NSCellFlags">69336641</int> - <int key="NSCellFlags2">137216</int> - <string key="NSContents">Text Cell</string> - <reference key="NSSupport" ref="26"/> - <reference key="NSControlView" ref="1012579052"/> - <object class="NSColor" key="NSBackgroundColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MQA</bytes> - <object class="NSColorSpace" key="NSCustomColorSpace" id="886601921"> - <int key="NSID">2</int> - </object> - </object> - <object class="NSColor" key="NSTextColor" id="434026568"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">controlTextColor</string> - <reference key="NSColor" ref="643097066"/> - </object> - </object> - <int key="NSResizingMask">1</int> - <bool key="NSIsResizeable">YES</bool> - <bool key="NSIsEditable">YES</bool> - <reference key="NSTableView" ref="1012579052"/> - </object> - </object> - <double key="NSIntercellSpacingWidth">3</double> - <double key="NSIntercellSpacingHeight">2</double> - <object class="NSColor" key="NSBackgroundColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">_sourceListBackgroundColor</string> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">1</int> - <bytes key="NSRGB">MC44MzkyMTU2OTU5IDAuODY2NjY2Njc0NiAwLjg5ODAzOTIyMTgAA</bytes> - </object> - </object> - <object class="NSColor" key="NSGridColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">gridColor</string> - <object class="NSColor" key="NSColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41AA</bytes> - </object> - </object> - <double key="NSRowHeight">17</double> - <int key="NSTvFlags">373293056</int> - <reference key="NSDelegate"/> - <reference key="NSDataSource"/> - <int key="NSColumnAutoresizingStyle">5</int> - <int key="NSDraggingSourceMaskForLocal">15</int> - <int key="NSDraggingSourceMaskForNonLocal">0</int> - <bool key="NSAllowsTypeSelect">YES</bool> - <int key="NSTableViewSelectionHighlightStyle">1</int> - <int key="NSTableViewDraggingDestinationStyle">1</int> - </object> - </object> - <string key="NSFrameSize">{202, 450}</string> - <reference key="NSSuperview" ref="524598165"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="1012579052"/> - <reference key="NSDocView" ref="1012579052"/> - <object class="NSColor" key="NSBGColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC44ODMwNjQ1MDg0AA</bytes> - </object> - <int key="NScvFlags">4</int> - </object> - <object class="NSScroller" id="533108700"> - <reference key="NSNextResponder" ref="524598165"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{229, 1}, {15, 524}}</string> - <reference key="NSSuperview" ref="524598165"/> - <reference key="NSWindow"/> - <reference key="NSTarget" ref="524598165"/> - <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.99812382459640503</double> - </object> - <object class="NSScroller" id="802793151"> - <reference key="NSNextResponder" ref="524598165"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{1, 525}, {228, 15}}</string> - <reference key="NSSuperview" ref="524598165"/> - <reference key="NSWindow"/> - <int key="NSsFlags">1</int> - <reference key="NSTarget" ref="524598165"/> - <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.99590158462524414</double> - </object> - </object> - <string key="NSFrame">{{0, 24}, {202, 450}}</string> - <reference key="NSSuperview" ref="551584428"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="233523429"/> - <int key="NSsFlags">560</int> - <reference key="NSVScroller" ref="533108700"/> - <reference key="NSHScroller" ref="802793151"/> - <reference key="NSContentView" ref="233523429"/> - <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes> - </object> - <object class="BWAnchoredButtonBar" id="805249222"> - <reference key="NSNextResponder" ref="551584428"/> - <int key="NSvFlags">290</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="BWAnchoredButton" id="642219827"> - <reference key="NSNextResponder" ref="805249222"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{30, -1}, {32, 24}}</string> - <reference key="NSSuperview" ref="805249222"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="BWAnchoredButtonCell" key="NSCell" id="179580583"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134348800</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="26"/> - <reference key="NSControlView" ref="642219827"/> - <int key="NSButtonFlags">147079423</int> - <int key="NSButtonFlags2">402653219</int> - <object class="NSCustomResource" key="NSNormalImage"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">button_edit</string> - </object> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent">e</string> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="BWAnchoredPopUpButton" id="221133754"> - <reference key="NSNextResponder" ref="805249222"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-1, -1}, {32, 24}}</string> - <reference key="NSSuperview" ref="805249222"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="BWAnchoredPopUpButtonCell" key="NSCell" id="270183415"> - <int key="NSCellFlags">-2076049856</int> - <int key="NSCellFlags2">134350848</int> - <object class="NSFont" key="NSSupport" id="951888633"> - <string key="NSName">LucidaGrande</string> - <double key="NSSize">13</double> - <int key="NSfFlags">16</int> - </object> - <reference key="NSControlView" ref="221133754"/> - <int key="NSButtonFlags">-2038284033</int> - <int key="NSButtonFlags2">163</int> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - <object class="NSMenuItem" key="NSMenuItem" id="751753648"> - <reference key="NSMenu" ref="949612237"/> - <bool key="NSIsHidden">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <int key="NSState">1</int> - <object class="NSCustomResource" key="NSImage"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSActionTemplate</string> - </object> - <object class="NSCustomResource" key="NSOnImage" id="1022504326"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuCheckmark</string> - </object> - <object class="NSCustomResource" key="NSMixedImage" id="329345764"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuMixedState</string> - </object> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - </object> - <bool key="NSMenuItemRespectAlignment">YES</bool> - <object class="NSMenu" key="NSMenu" id="949612237"> - <string key="NSTitle">OtherViews</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="751753648"/> - <object class="NSMenuItem" id="623685715"> - <reference key="NSMenu" ref="949612237"/> - <string key="NSTitle">Sort By</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - <object class="NSMenu" key="NSSubmenu" id="455108754"> - <string key="NSTitle">Sort By</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="536740264"> - <reference key="NSMenu" ref="455108754"/> - <string key="NSTitle">Name</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - </object> - <object class="NSMenuItem" id="965148975"> - <reference key="NSMenu" ref="455108754"/> - <string key="NSTitle">Host</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - </object> - <object class="NSMenuItem" id="997359603"> - <reference key="NSMenu" ref="455108754"/> - <string key="NSTitle">Type</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - </object> - <object class="NSMenuItem" id="43427774"> - <reference key="NSMenu" ref="455108754"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - </object> - <object class="NSMenuItem" id="513442721"> - <reference key="NSMenu" ref="455108754"/> - <string key="NSTitle">Reverse Sort Order</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="270183415"/> - </object> - </object> - </object> - </object> - </object> - </object> - <bool key="NSPullDown">YES</bool> - <int key="NSPreferredEdge">1</int> - <bool key="NSUsesItemFromMenu">YES</bool> - <bool key="NSAltersState">YES</bool> - <int key="NSArrowPosition">2</int> - </object> - </object> - </object> - <string key="NSFrame">{{0, 1}, {202, 23}}</string> - <reference key="NSSuperview" ref="551584428"/> - <reference key="NSWindow"/> - <bool key="BWABBIsResizable">YES</bool> - <bool key="BWABBIsAtBottom">YES</bool> - <bool key="BWABBHandleIsRightAligned">NO</bool> - <int key="BWABBSelectedIndex">0</int> - </object> - </object> - <string key="NSFrameSize">{202, 475}</string> - <reference key="NSSuperview" ref="616749187"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSView</string> - </object> - <object class="BWCustomView" id="563806501"> - <reference key="NSNextResponder" ref="616749187"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSScrollView" id="1058735001"> - <reference key="NSNextResponder" ref="563806501"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSClipView" id="954788335"> - <reference key="NSNextResponder" ref="1058735001"/> - <int key="NSvFlags">2304</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomView" id="315390047"> - <reference key="NSNextResponder" ref="954788335"/> - <int key="NSvFlags">258</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomView" id="735564334"> - <reference key="NSNextResponder" ref="315390047"/> - <int key="NSvFlags">301</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTabView" id="134031646"> - <reference key="NSNextResponder" ref="735564334"/> - <int key="NSvFlags">274</int> - <string key="NSFrame">{{13, 25}, {420, 417}}</string> - <reference key="NSSuperview" ref="735564334"/> - <reference key="NSWindow"/> - <object class="NSMutableArray" key="NSTabViewItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTabViewItem" id="253369045"> - <string key="NSIdentifier">1</string> - <object class="NSView" key="NSView" id="32802602"> - <reference key="NSNextResponder" ref="134031646"/> - <int key="NSvFlags">256</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomView" id="233374444"> - <reference key="NSNextResponder" ref="32802602"/> - <int key="NSvFlags">269</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="508687946"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{108, 10}, {251, 18}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="184523755"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents">Connect using SSL</string> - <object class="NSFont" key="NSSupport" id="807120225"> - <string key="NSName">LucidaGrande</string> - <double key="NSSize">13</double> - <int key="NSfFlags">1044</int> - </object> - <reference key="NSControlView" ref="508687946"/> - <int key="NSButtonFlags">1211912703</int> - <int key="NSButtonFlags2">2</int> - <object class="NSCustomResource" key="NSNormalImage" id="804903244"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSSwitch</string> - </object> - <object class="NSButtonImageSource" key="NSAlternateImage" id="791350007"> - <string key="NSImageName">NSSwitch</string> - </object> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSTextField" id="644973446"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 174}, {247, 22}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="859982751"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="644973446"/> - <bool key="NSDrawsBackground">YES</bool> - <object class="NSColor" key="NSBackgroundColor" id="211632616"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">textBackgroundColor</string> - <object class="NSColor" key="NSColor" id="402194341"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MQA</bytes> - </object> - </object> - <object class="NSColor" key="NSTextColor" id="395378299"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">textColor</string> - <reference key="NSColor" ref="643097066"/> - </object> - </object> - </object> - <object class="NSTextField" id="786098118"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 176}, {98, 17}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="393023945"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Host:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="786098118"/> - <object class="NSColor" key="NSBackgroundColor" id="644242225"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">controlColor</string> - <object class="NSColor" key="NSColor" id="355746054"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes> - </object> - </object> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="810791200"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 208}, {247, 22}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1040289660"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="810791200"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="445567924"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 210}, {98, 17}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="485990188"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Name:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="445567924"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="978463433"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 140}, {247, 22}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="925313159"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="978463433"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="987440606"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 142}, {98, 17}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="377431100"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Username:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="987440606"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="211629203"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 106}, {247, 22}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="646391991"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="211629203"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="105635377"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 108}, {98, 17}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="785119002"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Password:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="105635377"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="950381827"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 72}, {247, 22}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="925102591"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="950381827"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="788113046"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 74}, {98, 17}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="441978581"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Database:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="788113046"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="1013612483"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 38}, {247, 22}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1003825843"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">3306</string> - <reference key="NSControlView" ref="1013612483"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="910543023"> - <reference key="NSNextResponder" ref="233374444"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 40}, {98, 17}}</string> - <reference key="NSSuperview" ref="233374444"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="588889019"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Port:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="910543023"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrame">{{6, 131}, {377, 257}}</string> - <reference key="NSSuperview" ref="32802602"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSView</string> - </object> - <object class="NSCustomView" id="31135925"> - <reference key="NSNextResponder" ref="32802602"/> - <int key="NSvFlags">268</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTextField" id="104955330"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-3, 15}, {107, 17}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="69612386"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">CA Cert:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="104955330"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="638710413"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{109, 13}, {220, 22}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="791857368"> - <int key="NSCellFlags">-2073952703</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">none set</string> - <reference key="NSControlView" ref="638710413"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41AA</bytes> - <reference key="NSCustomColorSpace" ref="886601921"/> - </object> - </object> - </object> - <object class="NSButton" id="839299955"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 12}, {29, 24}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="1013426677"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="839299955"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <object class="NSCustomResource" key="NSNormalImage" id="22774617"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">KeyTemplate</string> - </object> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - <object class="NSTextField" id="684819179"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-3, 49}, {107, 17}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="371333119"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Certificate:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="684819179"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="950540175"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{109, 47}, {220, 22}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="196185392"> - <int key="NSCellFlags">-2073952703</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">none set</string> - <reference key="NSControlView" ref="950540175"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41AA</bytes> - <reference key="NSCustomColorSpace" ref="886601921"/> - </object> - </object> - </object> - <object class="NSButton" id="945929172"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 46}, {29, 24}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="1000000271"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="945929172"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <reference key="NSNormalImage" ref="22774617"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - <object class="NSTextField" id="1034069158"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-3, 83}, {107, 17}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="943522732"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Key File:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="1034069158"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="679511995"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{109, 81}, {220, 22}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="650760201"> - <int key="NSCellFlags">-2073952703</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">none set</string> - <reference key="NSControlView" ref="679511995"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41MDQwMzIyNTQyAA</bytes> - </object> - </object> - </object> - <object class="NSButton" id="586011242"> - <reference key="NSNextResponder" ref="31135925"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 80}, {29, 24}}</string> - <reference key="NSSuperview" ref="31135925"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="85329089"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="586011242"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <reference key="NSNormalImage" ref="22774617"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - </object> - <string key="NSFrame">{{6, 28}, {377, 104}}</string> - <reference key="NSSuperview" ref="32802602"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSView</string> - </object> - </object> - <string key="NSFrame">{{10, 33}, {400, 371}}</string> - <reference key="NSSuperview" ref="134031646"/> - <reference key="NSWindow"/> - </object> - <string key="NSLabel">Standard</string> - <reference key="NSColor" ref="644242225"/> - <reference key="NSTabView" ref="134031646"/> - </object> - <object class="NSTabViewItem" id="517771995"> - <string key="NSIdentifier">2</string> - <object class="NSView" key="NSView" id="962671066"> - <nil key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomView" id="394302879"> - <reference key="NSNextResponder" ref="962671066"/> - <int key="NSvFlags">269</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="16421625"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{108, 11}, {251, 18}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="972347112"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents">Connect using SSL</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="16421625"/> - <int key="NSButtonFlags">1211912703</int> - <int key="NSButtonFlags2">2</int> - <reference key="NSNormalImage" ref="804903244"/> - <reference key="NSAlternateImage" ref="791350007"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSTextField" id="68541783"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 141}, {247, 22}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="279442436"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="68541783"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="607362814"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 143}, {98, 17}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="798396187"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Username:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="607362814"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="512253301"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 107}, {247, 22}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="251554254"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="512253301"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="789391730"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 109}, {98, 17}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="797213431"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Password:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="789391730"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="58217156"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 73}, {247, 22}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="185246669"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="58217156"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="745773732"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 75}, {98, 17}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="728524936"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Database:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="745773732"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="728228957"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 39}, {247, 22}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="299457759"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="728228957"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="591324856"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 41}, {98, 17}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="317867885"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Socket:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="591324856"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="474825058"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 175}, {247, 22}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="684614893"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="474825058"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="459734357"> - <reference key="NSNextResponder" ref="394302879"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 177}, {98, 17}}</string> - <reference key="NSSuperview" ref="394302879"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="352725628"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Name:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="459734357"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrame">{{6, 164}, {377, 224}}</string> - <reference key="NSSuperview" ref="962671066"/> - <string key="NSClassName">NSView</string> - </object> - <object class="NSCustomView" id="866600720"> - <reference key="NSNextResponder" ref="962671066"/> - <int key="NSvFlags">268</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTextField" id="98826968"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-3, 15}, {107, 17}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="730590428"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">CA Cert:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="98826968"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="484504415"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{109, 13}, {220, 22}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="169093017"> - <int key="NSCellFlags">-2073952703</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">none set</string> - <reference key="NSControlView" ref="484504415"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41AA</bytes> - <reference key="NSCustomColorSpace" ref="886601921"/> - </object> - </object> - </object> - <object class="NSButton" id="680939705"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 12}, {29, 24}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="308087760"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="680939705"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <reference key="NSNormalImage" ref="22774617"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - <object class="NSTextField" id="521125104"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-3, 49}, {107, 17}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1025158673"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Certificate:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="521125104"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="216069484"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{109, 47}, {220, 22}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="276609847"> - <int key="NSCellFlags">-2073952703</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">none set</string> - <reference key="NSControlView" ref="216069484"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41AA</bytes> - <reference key="NSCustomColorSpace" ref="886601921"/> - </object> - </object> - </object> - <object class="NSButton" id="988136593"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 46}, {29, 24}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="559442548"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="988136593"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <reference key="NSNormalImage" ref="22774617"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - <object class="NSTextField" id="57862599"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{-3, 83}, {107, 17}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="357553281"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Key File:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="57862599"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="51601157"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{109, 81}, {220, 22}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="575863174"> - <int key="NSCellFlags">-2073952703</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">none set</string> - <reference key="NSControlView" ref="51601157"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC41MDQwMzIyNTQyAA</bytes> - </object> - </object> - </object> - <object class="NSButton" id="237955939"> - <reference key="NSNextResponder" ref="866600720"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 80}, {29, 24}}</string> - <reference key="NSSuperview" ref="866600720"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="167444868"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="237955939"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <reference key="NSNormalImage" ref="22774617"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - </object> - <string key="NSFrame">{{6, 61}, {377, 104}}</string> - <reference key="NSSuperview" ref="962671066"/> - <string key="NSClassName">NSView</string> - </object> - </object> - <string key="NSFrame">{{10, 33}, {400, 371}}</string> - </object> - <string key="NSLabel">Socket</string> - <reference key="NSColor" ref="644242225"/> - <reference key="NSTabView" ref="134031646"/> - </object> - <object class="NSTabViewItem" id="591192172"> - <string key="NSIdentifier">Item 2</string> - <object class="NSView" key="NSView" id="159800861"> - <nil key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomView" id="326102394"> - <reference key="NSNextResponder" ref="159800861"/> - <int key="NSvFlags">269</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTextField" id="1030226140"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 299}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="933547668"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="1030226140"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="615962367"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 301}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="547674489"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">MySQL Host:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="615962367"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="358903996"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 265}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="869330413"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="358903996"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="189856761"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 267}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="218707841"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Username:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="189856761"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="187191991"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 231}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="737530250"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="187191991"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="71258292"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 233}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1056521404"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Password:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="71258292"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="1000646962"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 197}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="289965133"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="1000646962"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="632758915"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 199}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="664433389"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Database:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="632758915"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="1049720725"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 163}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="615536496"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">3306</string> - <reference key="NSControlView" ref="1049720725"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="914345743"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{10, 165}, {95, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="265944034"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Port:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="914345743"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="844385120"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 115}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="505035309"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="844385120"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="81612279"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{10, 117}, {95, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="386177793"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">SSH Host:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="81612279"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="790983747"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 81}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="347555313"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="790983747"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="558754343"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 83}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="222275233"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">SSH User:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="558754343"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="21480939"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 47}, {219, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="944931136"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="21480939"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="627782947"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 49}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="369035253"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">SSH Password:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="627782947"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="692784990"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 13}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="850057181"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="692784990"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="984151006"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 15}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="563972303"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">SSH Port:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="984151006"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="1022082829"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 333}, {247, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="833542503"> - <int key="NSCellFlags">-1804468671</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <string key="NSPlaceholderString">optional</string> - <reference key="NSControlView" ref="1022082829"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <reference key="NSTextColor" ref="395378299"/> - </object> - </object> - <object class="NSTextField" id="761323775"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 335}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="906889126"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">Name:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="761323775"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSButton" id="183948302"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{328, 46}, {29, 24}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="510891456"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="183948302"/> - <int key="NSButtonFlags">-922992385</int> - <int key="NSButtonFlags2">34</int> - <reference key="NSNormalImage" ref="22774617"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">400</int> - <int key="NSPeriodicInterval">75</int> - </object> - </object> - <object class="NSTextField" id="906103858"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{7, 49}, {98, 17}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="882604644"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">71304192</int> - <string key="NSContents">SSH Key:</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="906103858"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSTextField" id="180145997"> - <reference key="NSNextResponder" ref="326102394"/> - <int key="NSvFlags">268</int> - <string key="NSFrame">{{110, 47}, {198, 22}}</string> - <reference key="NSSuperview" ref="326102394"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="13940444"> - <int key="NSCellFlags">-2076049856</int> - <int key="NSCellFlags2">272631296</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="180145997"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="211632616"/> - <object class="NSColor" key="NSTextColor"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC40OTU5Njc3NDU4AA</bytes> - </object> - </object> - </object> - </object> - <string key="NSFrame">{{6, 6}, {377, 382}}</string> - <reference key="NSSuperview" ref="159800861"/> - <string key="NSClassName">NSView</string> - </object> - </object> - <string key="NSFrame">{{10, 33}, {400, 371}}</string> - </object> - <string key="NSLabel">SSH</string> - <reference key="NSColor" ref="644242225"/> - <reference key="NSTabView" ref="134031646"/> - </object> - </object> - <reference key="NSSelectedTabViewItem" ref="253369045"/> - <reference key="NSFont" ref="807120225"/> - <int key="NSTvFlags">0</int> - <bool key="NSAllowTruncatedLabels">YES</bool> - <bool key="NSDrawsBackground">YES</bool> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="32802602"/> - </object> - </object> - <object class="NSButton" id="460592307"> - <reference key="NSNextResponder" ref="735564334"/> - <int key="NSvFlags">289</int> - <string key="NSFrame">{{285, -3}, {147, 32}}</string> - <reference key="NSSuperview" ref="735564334"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="424756162"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents">Connect</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="460592307"/> - <int key="NSButtonFlags">-2038284033</int> - <int key="NSButtonFlags2">129</int> - <string key="NSAlternateContents"/> - <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSButton" id="476973680"> - <reference key="NSNextResponder" ref="735564334"/> - <int key="NSvFlags">289</int> - <string key="NSFrame">{{93, -3}, {192, 32}}</string> - <reference key="NSSuperview" ref="735564334"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="220047154"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents">Add to Favorites</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="476973680"/> - <int key="NSButtonFlags">-2038284033</int> - <int key="NSButtonFlags2">402653313</int> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent">a</string> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSProgressIndicator" id="575228526"> - <reference key="NSNextResponder" ref="735564334"/> - <int key="NSvFlags">1316</int> - <object class="NSPSMatrix" key="NSDrawMatrix"/> - <string key="NSFrame">{{20, 7}, {16, 16}}</string> - <reference key="NSSuperview" ref="735564334"/> - <reference key="NSWindow"/> - <int key="NSpiFlags">28938</int> - <double key="NSMinValue">16</double> - <double key="NSMaxValue">100</double> - </object> - <object class="NSTextField" id="549907703"> - <reference key="NSNextResponder" ref="735564334"/> - <int key="NSvFlags">-2147483356</int> - <string key="NSFrame">{{41, 7}, {252, 17}}</string> - <reference key="NSSuperview" ref="735564334"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="321846713"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">272630784</int> - <string key="NSContents">Connecting...</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="549907703"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - <object class="NSButton" id="990947983"> - <reference key="NSNextResponder" ref="735564334"/> - <int key="NSvFlags">292</int> - <string key="NSFrame">{{17, 1}, {25, 25}}</string> - <reference key="NSSuperview" ref="735564334"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="757039715"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">134217728</int> - <string key="NSContents"/> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="990947983"/> - <int key="NSButtonFlags">-2038415105</int> - <int key="NSButtonFlags2">33</int> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - </object> - <string key="NSFrame">{{116, 2}, {446, 436}}</string> - <reference key="NSSuperview" ref="315390047"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSCustomView</string> - </object> - </object> - <string key="NSFrameSize">{679, 442}</string> - <reference key="NSSuperview" ref="954788335"/> - <reference key="NSWindow"/> - <string key="NSClassName">SPFlippedView</string> - </object> - </object> - <string key="NSFrameSize">{679, 443}</string> - <reference key="NSSuperview" ref="1058735001"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="315390047"/> - <reference key="NSDocView" ref="315390047"/> - <reference key="NSBGColor" ref="644242225"/> - <int key="NScvFlags">4</int> - </object> - <object class="NSScroller" id="508899576"> - <reference key="NSNextResponder" ref="1058735001"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{664, 0}, {15, 453}}</string> - <reference key="NSSuperview" ref="1058735001"/> - <reference key="NSWindow"/> - <reference key="NSTarget" ref="1058735001"/> - <string key="NSAction">_doScroller:</string> - <double key="NSCurValue">1</double> - <double key="NSPercent">0.99775278568267822</double> - </object> - <object class="NSScroller" id="108277656"> - <reference key="NSNextResponder" ref="1058735001"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{0, 453}, {664, 15}}</string> - <reference key="NSSuperview" ref="1058735001"/> - <reference key="NSWindow"/> - <int key="NSsFlags">1</int> - <reference key="NSTarget" ref="1058735001"/> - <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.97838616371154785</double> - </object> - </object> - <string key="NSFrameSize">{679, 443}</string> - <reference key="NSSuperview" ref="563806501"/> - <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="954788335"/> - <int key="NSsFlags">560</int> - <reference key="NSVScroller" ref="508899576"/> - <reference key="NSHScroller" ref="108277656"/> - <reference key="NSContentView" ref="954788335"/> - </object> - <object class="NSTextField" id="570492783"> - <reference key="NSNextResponder" ref="563806501"/> - <int key="NSvFlags">266</int> - <string key="NSFrame">{{17, 451}, {645, 17}}</string> - <reference key="NSSuperview" ref="563806501"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="607446274"> - <int key="NSCellFlags">68288064</int> - <int key="NSCellFlags2">138413056</int> - <string key="NSContents">Enter connection details below, or choose a favorite</string> - <object class="NSFont" key="NSSupport"> - <string key="NSName">LucidaGrande-Bold</string> - <double key="NSSize">13</double> - <int key="NSfFlags">16</int> - </object> - <reference key="NSControlView" ref="570492783"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrame">{{203, 0}, {679, 475}}</string> - <reference key="NSSuperview" ref="616749187"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSView</string> - </object> - </object> - <string key="NSFrameSize">{882, 475}</string> - <reference key="NSSuperview" ref="733821228"/> - <reference key="NSWindow"/> - <bool key="NSIsVertical">YES</bool> - <int key="NSDividerStyle">2</int> - <reference key="BWSVColor" ref="643097066"/> - <bool key="BWSVColorIsEnabled">NO</bool> - <object class="NSMutableDictionary" key="BWSVMinValues"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="1"/> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="80"/> - <integer value="445"/> - </object> - </object> - <object class="NSMutableDictionary" key="BWSVMaxValues"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys" id="0"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <object class="NSMutableDictionary" key="BWSVMinUnits"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="1"/> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <object class="NSMutableDictionary" key="BWSVMaxUnits"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="1"/> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="BWSVCollapsiblePopupSelection">0</int> - <bool key="BWSVDividerCanCollapse">NO</bool> - </object> - </object> - <string key="NSFrameSize">{882, 475}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> - <string key="NSClassName">SPFlippedView</string> - </object> - <object class="NSWindowTemplate" id="958272936"> - <int key="NSWindowStyleMask">8223</int> - <int key="NSWindowBacking">2</int> - <string key="NSWindowRect">{{439, 291}, {580, 320}}</string> - <int key="NSWTFlags">-469762048</int> - <string key="NSWindowTitle">Error Detail</string> - <string key="NSWindowClass">NSPanel</string> - <nil key="NSViewClass"/> - <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string> - <string key="NSWindowContentMinSize">{100, 100}</string> - <object class="NSView" key="NSWindowView" id="536120400"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">256</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="BWTransparentScrollView" id="699163511"> - <reference key="NSNextResponder" ref="536120400"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSClipView" id="547900823"> - <reference key="NSNextResponder" ref="699163511"/> - <int key="NSvFlags">2304</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTextView" id="59706192"> - <reference key="NSNextResponder" ref="547900823"/> - <int key="NSvFlags">2322</int> - <string key="NSFrameSize">{578, 72}</string> - <reference key="NSSuperview" ref="547900823"/> - <object class="NSTextContainer" key="NSTextContainer" id="646915301"> - <object class="NSLayoutManager" key="NSLayoutManager"> - <object class="NSTextStorage" key="NSTextStorage"> - <object class="NSMutableString" key="NSString"> - <characters key="NS.bytes">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum Et harumd und lookum like Greek to me, dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda</characters> - </object> - <object class="NSMutableArray" key="NSAttributes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSDictionary"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSColor</string> - <string>NSFont</string> - <string>NSParagraphStyle</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSColor" id="247436922"> - <int key="NSColorSpace">1</int> - <bytes key="NSRGB">MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA</bytes> - </object> - <object class="NSFont"> - <string key="NSName">LucidaGrande</string> - <double key="NSSize">10</double> - <int key="NSfFlags">2843</int> - </object> - <object class="NSParagraphStyle"> - <int key="NSAlignment">3</int> - <object class="NSArray" key="NSTabStops"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSTextTab" id="823634743"> - <double key="NSLocation">0.0</double> - </object> - <object class="NSTextTab" id="713375536"> - <double key="NSLocation">56</double> - </object> - <object class="NSTextTab" id="999774917"> - <double key="NSLocation">112</double> - </object> - <object class="NSTextTab" id="634012080"> - <double key="NSLocation">168</double> - </object> - <object class="NSTextTab" id="782574576"> - <double key="NSLocation">224</double> - </object> - <object class="NSTextTab" id="19717301"> - <double key="NSLocation">280</double> - </object> - <object class="NSTextTab" id="937773658"> - <double key="NSLocation">336</double> - </object> - <object class="NSTextTab" id="219483472"> - <double key="NSLocation">392</double> - </object> - <object class="NSTextTab" id="878853441"> - <double key="NSLocation">448</double> - </object> - <object class="NSTextTab" id="618333087"> - <double key="NSLocation">504</double> - </object> - <object class="NSTextTab" id="820362010"> - <double key="NSLocation">560</double> - </object> - <object class="NSTextTab" id="470724251"> - <double key="NSLocation">616</double> - </object> - <object class="NSTextTab" id="56552689"> - <double key="NSLocation">672</double> - </object> - <object class="NSTextTab" id="65501475"> - <double key="NSLocation">728</double> - </object> - <object class="NSTextTab" id="469693015"> - <double key="NSLocation">784</double> - </object> - <object class="NSTextTab" id="334479669"> - <double key="NSLocation">840</double> - </object> - <object class="NSTextTab" id="367366098"> - <double key="NSLocation">896</double> - </object> - <object class="NSTextTab" id="11887200"> - <double key="NSLocation">952</double> - </object> - <object class="NSTextTab" id="613253918"> - <double key="NSLocation">1008</double> - </object> - <object class="NSTextTab" id="683900068"> - <double key="NSLocation">1064</double> - </object> - <object class="NSTextTab" id="640062352"> - <double key="NSLocation">1120</double> - </object> - <object class="NSTextTab" id="953428032"> - <double key="NSLocation">1176</double> - </object> - <object class="NSTextTab" id="916708773"> - <double key="NSLocation">1232</double> - </object> - <object class="NSTextTab" id="777694472"> - <double key="NSLocation">1288</double> - </object> - <object class="NSTextTab" id="193444438"> - <double key="NSLocation">1344</double> - </object> - <object class="NSTextTab" id="392872653"> - <double key="NSLocation">1400</double> - </object> - <object class="NSTextTab" id="459383765"> - <double key="NSLocation">1456</double> - </object> - <object class="NSTextTab" id="729563838"> - <double key="NSLocation">1512</double> - </object> - <object class="NSTextTab" id="18292341"> - <double key="NSLocation">1568</double> - </object> - <object class="NSTextTab" id="1007283588"> - <double key="NSLocation">1624</double> - </object> - <object class="NSTextTab" id="133675098"> - <double key="NSLocation">1680</double> - </object> - <object class="NSTextTab" id="841926084"> - <double key="NSLocation">1736</double> - </object> - </object> - </object> - </object> - </object> - <object class="NSDictionary"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSColor</string> - <string>NSFont</string> - <string>NSParagraphStyle</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="247436922"/> - <object class="NSFont"> - <string key="NSName">LucidaGrande-Bold</string> - <double key="NSSize">10</double> - <int key="NSfFlags">16</int> - </object> - <object class="NSParagraphStyle"> - <int key="NSAlignment">3</int> - <object class="NSArray" key="NSTabStops"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="823634743"/> - <reference ref="713375536"/> - <reference ref="999774917"/> - <reference ref="634012080"/> - <reference ref="782574576"/> - <reference ref="19717301"/> - <reference ref="937773658"/> - <reference ref="219483472"/> - <reference ref="878853441"/> - <reference ref="618333087"/> - <reference ref="820362010"/> - <reference ref="470724251"/> - <reference ref="56552689"/> - <reference ref="65501475"/> - <reference ref="469693015"/> - <reference ref="334479669"/> - <reference ref="367366098"/> - <reference ref="11887200"/> - <reference ref="613253918"/> - <reference ref="683900068"/> - <reference ref="640062352"/> - <reference ref="953428032"/> - <reference ref="916708773"/> - <reference ref="777694472"/> - <reference ref="193444438"/> - <reference ref="392872653"/> - <reference ref="459383765"/> - <reference ref="729563838"/> - <reference ref="18292341"/> - <reference ref="1007283588"/> - <reference ref="133675098"/> - <reference ref="841926084"/> - </object> - </object> - </object> - </object> - </object> - <object class="NSMutableData" key="NSAttributeInfo"> - <bytes key="NS.bytes">GQAEAQgADAEiAAcBhAQAA</bytes> - </object> - <nil key="NSDelegate"/> - </object> - <object class="NSMutableArray" key="NSTextContainers"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="646915301"/> - </object> - <int key="NSLMFlags">6</int> - <nil key="NSDelegate"/> - </object> - <reference key="NSTextView" ref="59706192"/> - <double key="NSWidth">578</double> - <int key="NSTCFlags">1</int> - </object> - <object class="NSTextViewSharedData" key="NSSharedData"> - <int key="NSFlags">10245</int> - <int key="NSTextCheckingTypes">0</int> - <nil key="NSMarkedAttributes"/> - <reference key="NSBackgroundColor" ref="402194341"/> - <object class="NSDictionary" key="NSSelectedAttributes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSBackgroundColor</string> - <string>NSColor</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">selectedTextBackgroundColor</string> - <reference key="NSColor" ref="355746054"/> - </object> - <object class="NSColor"> - <int key="NSColorSpace">6</int> - <string key="NSCatalogName">System</string> - <string key="NSColorName">selectedTextColor</string> - <reference key="NSColor" ref="643097066"/> - </object> - </object> - </object> - <reference key="NSInsertionColor" ref="643097066"/> - <object class="NSDictionary" key="NSLinkAttributes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSColor</string> - <string>NSUnderline</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSColor"> - <int key="NSColorSpace">1</int> - <bytes key="NSRGB">MCAwIDEAA</bytes> - </object> - <integer value="1"/> - </object> - </object> - <nil key="NSDefaultParagraphStyle"/> - </object> - <int key="NSTVFlags">6</int> - <string key="NSMaxSize">{1156, 1e+07}</string> - <string key="NSMinize">{228, 0}</string> - <nil key="NSDelegate"/> - </object> - </object> - <string key="NSFrameSize">{578, 293}</string> - <reference key="NSSuperview" ref="699163511"/> - <reference key="NSNextKeyView" ref="59706192"/> - <reference key="NSDocView" ref="59706192"/> - <reference key="NSBGColor" ref="402194341"/> - <object class="NSCursor" key="NSCursor"> - <string key="NSHotSpot">{4, -5}</string> - <int key="NSCursorType">1</int> - </object> - <int key="NScvFlags">2</int> - </object> - <object class="BWTransparentScroller" id="79422493"> - <reference key="NSNextResponder" ref="699163511"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{566, 0}, {12, 293}}</string> - <reference key="NSSuperview" ref="699163511"/> - <bool key="NSEnabled">YES</bool> - <int key="NSArrowsLoc">2</int> - <reference key="NSTarget" ref="699163511"/> - <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.95705521106719971</double> - </object> - <object class="NSScroller" id="266224177"> - <reference key="NSNextResponder" ref="699163511"/> - <int key="NSvFlags">-2147483392</int> - <string key="NSFrame">{{-100, -100}, {87, 18}}</string> - <reference key="NSSuperview" ref="699163511"/> - <int key="NSsFlags">1</int> - <reference key="NSTarget" ref="699163511"/> - <string key="NSAction">_doScroller:</string> - <double key="NSCurValue">1</double> - <double key="NSPercent">0.94565218687057495</double> - </object> - </object> - <string key="NSFrame">{{1, 20}, {578, 293}}</string> - <reference key="NSSuperview" ref="536120400"/> - <reference key="NSNextKeyView" ref="547900823"/> - <int key="NSsFlags">528</int> - <reference key="NSVScroller" ref="79422493"/> - <reference key="NSHScroller" ref="266224177"/> - <reference key="NSContentView" ref="547900823"/> - </object> - </object> - <string key="NSFrameSize">{580, 320}</string> - <reference key="NSSuperview"/> - </object> - <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> - <string key="NSMinSize">{100, 119}</string> - <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string> - <string key="NSFrameAutosaveName"/> - </object> - <object class="NSUserDefaultsController" id="642702582"> - <bool key="NSSharedInstance">YES</bool> - </object> - <object class="NSMenu" id="9858888"> - <string key="NSTitle"/> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="471954922"> - <reference key="NSMenu" ref="9858888"/> - <string key="NSTitle">Edit Favorite...</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="1022504326"/> - <reference key="NSMixedImage" ref="329345764"/> - </object> - </object> - </object> - <object class="NSCustomView" id="567906875"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="912885202"> - <reference key="NSNextResponder" ref="567906875"/> - <int key="NSvFlags">292</int> - <string key="NSFrame">{{14, 14}, {273, 18}}</string> - <reference key="NSSuperview" ref="567906875"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="388136120"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents">Show hidden files</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="912885202"/> - <int key="NSButtonFlags">1211912703</int> - <int key="NSButtonFlags2">2</int> - <reference key="NSNormalImage" ref="804903244"/> - <reference key="NSAlternateImage" ref="791350007"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSTextField" id="44241774"> - <reference key="NSNextResponder" ref="567906875"/> - <int key="NSvFlags">274</int> - <string key="NSFrame">{{2, 42}, {575, 34}}</string> - <reference key="NSSuperview" ref="567906875"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1045018411"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">138674176</int> - <string key="NSContents">Choose a custom SSH key file to use with this connection. Note that standard locations like ~/.ssh are checked automatically, as are any files in your SSH configuration.</string> - <reference key="NSSupport" ref="951888633"/> - <reference key="NSControlView" ref="44241774"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrameSize">{579, 83}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSView</string> - </object> - <object class="NSCustomView" id="12066713"> - <nil key="NSNextResponder"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="388256324"> - <reference key="NSNextResponder" ref="12066713"/> - <int key="NSvFlags">292</int> - <string key="NSFrame">{{14, 14}, {273, 18}}</string> - <reference key="NSSuperview" ref="12066713"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="844788897"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents">Show hidden files</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="388256324"/> - <int key="NSButtonFlags">1211912703</int> - <int key="NSButtonFlags2">2</int> - <reference key="NSNormalImage" ref="804903244"/> - <reference key="NSAlternateImage" ref="791350007"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSTextField" id="538839943"> - <reference key="NSNextResponder" ref="12066713"/> - <int key="NSvFlags">274</int> - <string key="NSFrame">{{2, 42}, {575, 17}}</string> - <reference key="NSSuperview" ref="12066713"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="124352014"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">138674176</int> - <string key="NSContents">Please select the SSL key file to use when establishing a secure connection.</string> - <reference key="NSSupport" ref="951888633"/> - <reference key="NSControlView" ref="538839943"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrameSize">{579, 66}</string> - <string key="NSClassName">NSView</string> - </object> - <object class="NSCustomView" id="136328549"> - <nil key="NSNextResponder"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="103272364"> - <reference key="NSNextResponder" ref="136328549"/> - <int key="NSvFlags">292</int> - <string key="NSFrame">{{14, 14}, {273, 18}}</string> - <reference key="NSSuperview" ref="136328549"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="20247014"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents">Show hidden files</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="103272364"/> - <int key="NSButtonFlags">1211912703</int> - <int key="NSButtonFlags2">2</int> - <reference key="NSNormalImage" ref="804903244"/> - <reference key="NSAlternateImage" ref="791350007"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSTextField" id="802544195"> - <reference key="NSNextResponder" ref="136328549"/> - <int key="NSvFlags">274</int> - <string key="NSFrame">{{6, 42}, {576, 17}}</string> - <reference key="NSSuperview" ref="136328549"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="196059550"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">138674176</int> - <string key="NSContents">Please select the client SSL certificate file to use when establishing a secure connection.</string> - <reference key="NSSupport" ref="951888633"/> - <reference key="NSControlView" ref="802544195"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrameSize">{599, 66}</string> - <string key="NSClassName">NSView</string> - </object> - <object class="NSCustomView" id="3577372"> - <reference key="NSNextResponder"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="455655503"> - <reference key="NSNextResponder" ref="3577372"/> - <int key="NSvFlags">292</int> - <string key="NSFrame">{{14, 14}, {273, 18}}</string> - <reference key="NSSuperview" ref="3577372"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="609741956"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">0</int> - <string key="NSContents">Show hidden files</string> - <reference key="NSSupport" ref="807120225"/> - <reference key="NSControlView" ref="455655503"/> - <int key="NSButtonFlags">1211912703</int> - <int key="NSButtonFlags2">2</int> - <reference key="NSNormalImage" ref="804903244"/> - <reference key="NSAlternateImage" ref="791350007"/> - <string key="NSAlternateContents"/> - <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> - </object> - </object> - <object class="NSTextField" id="761812578"> - <reference key="NSNextResponder" ref="3577372"/> - <int key="NSvFlags">274</int> - <string key="NSFrame">{{2, 42}, {575, 34}}</string> - <reference key="NSSuperview" ref="3577372"/> - <reference key="NSWindow"/> - <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="444474564"> - <int key="NSCellFlags">67239424</int> - <int key="NSCellFlags2">138674176</int> - <string key="NSContents">Please select the client SSL Certificate Authority certificate to use when establishing a secure connection. This must be the same as the server CA certificate.</string> - <reference key="NSSupport" ref="951888633"/> - <reference key="NSControlView" ref="761812578"/> - <reference key="NSBackgroundColor" ref="644242225"/> - <reference key="NSTextColor" ref="434026568"/> - </object> - </object> - </object> - <string key="NSFrameSize">{579, 83}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> - <string key="NSClassName">NSView</string> - </object> - </object> - <object class="IBObjectContainer" key="IBDocument.Objects"> - <object class="NSMutableArray" key="connectionRecords"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1012579052"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">4930</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">selectedIndex: type</string> - <reference key="source" ref="134031646"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="134031646"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">selectedIndex: type</string> - <string key="NSBinding">selectedIndex</string> - <string key="NSKeyPath">type</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">4992</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardConnectionFormContainer</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="233374444"/> - </object> - <int key="connectionID">5161</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">socketConnectionFormContainer</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="394302879"/> - </object> - <int key="connectionID">5163</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectionResizeContainer</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="735564334"/> - </object> - <int key="connectionID">5164</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="134031646"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5165</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sshConnectionFormContainer</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="326102394"/> - </object> - <int key="connectionID">5167</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: host</string> - <reference key="source" ref="644973446"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="644973446"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: host</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">host</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSValidatesImmediately</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <boolean value="YES"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5195</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: user</string> - <reference key="source" ref="978463433"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="978463433"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: user</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">user</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5199</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: password</string> - <reference key="source" ref="211629203"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="211629203"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: password</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">password</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5203</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: user</string> - <reference key="source" ref="68541783"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="68541783"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: user</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">user</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5231</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: password</string> - <reference key="source" ref="512253301"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="512253301"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: password</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">password</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5234</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: host</string> - <reference key="source" ref="1030226140"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="1030226140"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: host</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">host</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5303</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: user</string> - <reference key="source" ref="358903996"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="358903996"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: user</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">user</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5307</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: password</string> - <reference key="source" ref="187191991"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="187191991"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: password</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">password</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5311</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sshHost</string> - <reference key="source" ref="844385120"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="844385120"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sshHost</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sshHost</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5323</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sshUser</string> - <reference key="source" ref="790983747"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="790983747"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sshUser</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sshUser</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5327</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">dataSource</string> - <reference key="source" ref="1012579052"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5341</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">editFavorites:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="642219827"/> - </object> - <int key="connectionID">5350</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">showHelp:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="990947983"/> - </object> - <int key="connectionID">5351</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">addToFavoritesButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="476973680"/> - </object> - <int key="connectionID">5357</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="644973446"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5358</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="978463433"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5359</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="211629203"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5360</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="950381827"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5361</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1013612483"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5362</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="68541783"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5363</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="512253301"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5364</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="58217156"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5365</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="728228957"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5366</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1030226140"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5367</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="358903996"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5368</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="187191991"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5369</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1000646962"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5370</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1049720725"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5371</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="844385120"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5372</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="790983747"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5373</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="21480939"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5374</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="692784990"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5375</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: name</string> - <reference key="source" ref="474825058"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="474825058"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: name</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">name</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5400</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="474825058"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5401</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="810791200"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5402</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: name</string> - <reference key="source" ref="1022082829"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="1022082829"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: name</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">name</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5411</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: database</string> - <reference key="source" ref="1000646962"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="1000646962"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: database</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">database</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5412</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: database</string> - <reference key="source" ref="58217156"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="58217156"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: database</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">database</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5413</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="1022082829"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5414</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: socket</string> - <reference key="source" ref="728228957"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="728228957"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: socket</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">socket</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5415</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: name</string> - <reference key="source" ref="810791200"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="810791200"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: name</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">name</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5416</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: database</string> - <reference key="source" ref="950381827"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="950381827"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: database</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">database</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5417</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: port</string> - <reference key="source" ref="1013612483"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="1013612483"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: port</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">port</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>3306</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5418</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: port</string> - <reference key="source" ref="1049720725"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="1049720725"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: port</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">port</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>3306</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5419</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">progressIndicatorText</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="549907703"/> - </object> - <int key="connectionID">5425</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">progressIndicator</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="575228526"/> - </object> - <int key="connectionID">5426</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardPasswordField</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="211629203"/> - </object> - <int key="connectionID">5427</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">socketPasswordField</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="512253301"/> - </object> - <int key="connectionID">5428</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sshPasswordField</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="187191991"/> - </object> - <int key="connectionID">5429</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sshSSHPasswordField</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="21480939"/> - </object> - <int key="connectionID">5430</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">errorDetailText</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="59706192"/> - </object> - <int key="connectionID">5437</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">errorDetailWindow</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="958272936"/> - </object> - <int key="connectionID">5438</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">initiateConnection:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="460592307"/> - </object> - <int key="connectionID">5439</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">addFavorite:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="476973680"/> - </object> - <int key="connectionID">5443</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="460592307"/> - </object> - <int key="connectionID">5444</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sshSQLHostField</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="1030226140"/> - </object> - <int key="connectionID">5445</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardSQLHostField</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="644973446"/> - </object> - <int key="connectionID">5446</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectionSplitViewButtonBar</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="805249222"/> - </object> - <int key="connectionID">5448</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">helpButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="990947983"/> - </object> - <int key="connectionID">5458</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="958272936"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5461</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="59706192"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5462</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">nextKeyView</string> - <reference key="source" ref="68541783"/> - <reference key="destination" ref="512253301"/> - </object> - <int key="connectionID">5463</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">nextKeyView</string> - <reference key="source" ref="978463433"/> - <reference key="destination" ref="211629203"/> - </object> - <int key="connectionID">5464</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">nextKeyView</string> - <reference key="source" ref="358903996"/> - <reference key="destination" ref="187191991"/> - </object> - <int key="connectionID">5465</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">nextKeyView</string> - <reference key="source" ref="1012579052"/> - <reference key="destination" ref="134031646"/> - </object> - <int key="connectionID">5466</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">nextKeyView</string> - <reference key="source" ref="642219827"/> - <reference key="destination" ref="1012579052"/> - </object> - <int key="connectionID">5467</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="9858888"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5472</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">editFavorites:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="471954922"/> - </object> - <int key="connectionID">5473</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">menu</string> - <reference key="source" ref="1012579052"/> - <reference key="destination" ref="9858888"/> - </object> - <int key="connectionID">5474</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">sortFavorites:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="536740264"/> - </object> - <int key="connectionID">5487</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">sortFavorites:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="965148975"/> - </object> - <int key="connectionID">5488</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">sortFavorites:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="997359603"/> - </object> - <int key="connectionID">5489</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">reverseSortFavorites:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="513442721"/> - </object> - <int key="connectionID">5490</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">favoritesSortByMenuItem</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="623685715"/> - </object> - <int key="connectionID">5491</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sshSSHKeyButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="183948302"/> - </object> - <int key="connectionID">5494</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sshPassword</string> - <reference key="source" ref="21480939"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="21480939"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sshPassword</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sshPassword</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5504</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">hidden: sshKeyLocationEnabled</string> - <reference key="source" ref="627782947"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="627782947"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">hidden: sshKeyLocationEnabled</string> - <string key="NSBinding">hidden</string> - <string key="NSKeyPath">sshKeyLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5549</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sshKeyLocationEnabled</string> - <reference key="source" ref="183948302"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="183948302"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sshKeyLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sshKeyLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5551</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">hidden: sshKeyLocationEnabled</string> - <reference key="source" ref="21480939"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="21480939"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">hidden: sshKeyLocationEnabled</string> - <string key="NSBinding">hidden</string> - <string key="NSKeyPath">sshKeyLocationEnabled</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5559</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">hidden: sshKeyLocationEnabled</string> - <reference key="source" ref="906103858"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="906103858"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">hidden: sshKeyLocationEnabled</string> - <string key="NSBinding">hidden</string> - <string key="NSKeyPath">sshKeyLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - <string>NSValueTransformerName</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <string>NSNegateBoolean</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5561</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">hidden: sshKeyLocationEnabled</string> - <reference key="source" ref="180145997"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="180145997"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">hidden: sshKeyLocationEnabled</string> - <string key="NSBinding">hidden</string> - <string key="NSKeyPath">sshKeyLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - <string>NSValueTransformerName</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <string>NSNegateBoolean</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5562</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sshKeyLocation</string> - <reference key="source" ref="180145997"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="180145997"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sshKeyLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sshKeyLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSContinuouslyUpdatesValue</string> - <boolean value="YES" key="NS.object.0"/> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5563</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sshKeyLocation</string> - <reference key="source" ref="180145997"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="180145997"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sshKeyLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sshKeyLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5570</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sshKeyLocationHelp</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="567906875"/> - </object> - <int key="connectionID">5579</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectionDetailsScrollView</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="1058735001"/> - </object> - <int key="connectionID">5592</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardConnectionSSLDetailsContainer</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="31135925"/> - </object> - <int key="connectionID">5620</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: useSSL</string> - <reference key="source" ref="508687946"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="508687946"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: useSSL</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">useSSL</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5627</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sslCACertFileLocation</string> - <reference key="source" ref="638710413"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="638710413"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sslCACertFileLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sslCACertFileLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5637</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sslCertificateFileLocation</string> - <reference key="source" ref="950540175"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="950540175"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sslCertificateFileLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sslCertificateFileLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5639</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sslKeyFileLocation</string> - <reference key="source" ref="679511995"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="679511995"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sslKeyFileLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sslKeyFileLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5641</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">hidden: useSSL</string> - <reference key="source" ref="31135925"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="31135925"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">hidden: useSSL</string> - <string key="NSBinding">hidden</string> - <string key="NSKeyPath">useSSL</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - <string>NSValueTransformerName</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <string>NSNegateBoolean</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5649</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">updateSSLInterface:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="508687946"/> - </object> - <int key="connectionID">5651</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="183948302"/> - </object> - <int key="connectionID">5661</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="586011242"/> - </object> - <int key="connectionID">5662</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="945929172"/> - </object> - <int key="connectionID">5663</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="839299955"/> - </object> - <int key="connectionID">5664</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardSSLKeyFileButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="586011242"/> - </object> - <int key="connectionID">5665</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardSSLCertificateButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="945929172"/> - </object> - <int key="connectionID">5666</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">standardSSLCACertButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="839299955"/> - </object> - <int key="connectionID">5667</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sslKeyFileLocationHelp</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="12066713"/> - </object> - <int key="connectionID">5671</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslKeyFileLocationEnabled</string> - <reference key="source" ref="586011242"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="586011242"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslKeyFileLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslKeyFileLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5673</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCertificateFileLocationEnabled</string> - <reference key="source" ref="945929172"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="945929172"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCertificateFileLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCertificateFileLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5677</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCACertFileLocationEnabled</string> - <reference key="source" ref="839299955"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="839299955"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCACertFileLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCACertFileLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5679</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sslCACertLocationHelp</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="3577372"/> - </object> - <int key="connectionID">5686</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">sslCertificateLocationHelp</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="136328549"/> - </object> - <int key="connectionID">5687</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCertificateFileLocationEnabled</string> - <reference key="source" ref="988136593"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="988136593"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCertificateFileLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCertificateFileLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5707</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sslCertificateFileLocation</string> - <reference key="source" ref="216069484"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="216069484"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sslCertificateFileLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sslCertificateFileLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5708</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">hidden: useSSL</string> - <reference key="source" ref="866600720"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="866600720"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">hidden: useSSL</string> - <string key="NSBinding">hidden</string> - <string key="NSKeyPath">useSSL</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - <string>NSValueTransformerName</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <integer value="1"/> - <string>NSNegateBoolean</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5710</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslKeyFileLocationEnabled</string> - <reference key="source" ref="237955939"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="237955939"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslKeyFileLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslKeyFileLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5711</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sslCACertFileLocation</string> - <reference key="source" ref="484504415"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="484504415"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sslCACertFileLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sslCACertFileLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5712</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">toolTip: sslKeyFileLocation</string> - <reference key="source" ref="51601157"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="51601157"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">toolTip: sslKeyFileLocation</string> - <string key="NSBinding">toolTip</string> - <string key="NSKeyPath">sslKeyFileLocation</string> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5714</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCACertFileLocationEnabled</string> - <reference key="source" ref="680939705"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="680939705"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCACertFileLocationEnabled</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCACertFileLocationEnabled</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5715</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="237955939"/> - </object> - <int key="connectionID">5717</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="680939705"/> - </object> - <int key="connectionID">5718</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">chooseKeyLocation:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="988136593"/> - </object> - <int key="connectionID">5719</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: useSSL</string> - <reference key="source" ref="16421625"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="16421625"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: useSSL</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">useSSL</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMultipleValuesPlaceholder</string> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5722</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">updateSSLInterface:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="16421625"/> - </object> - <int key="connectionID">5723</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">socketConnectionSSLDetailsContainer</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="866600720"/> - </object> - <int key="connectionID">5724</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">socketSSLCACertButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="680939705"/> - </object> - <int key="connectionID">5725</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">socketSSLCertificateButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="988136593"/> - </object> - <int key="connectionID">5726</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">socketSSLKeyFileButton</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="237955939"/> - </object> - <int key="connectionID">5727</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCACertFileLocation</string> - <reference key="source" ref="638710413"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="638710413"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCACertFileLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCACertFileLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSNullPlaceholder</string> - <string key="NS.object.0">none set</string> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5730</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCertificateFileLocation</string> - <reference key="source" ref="950540175"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="950540175"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCertificateFileLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCertificateFileLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSNullPlaceholder</string> - <string key="NS.object.0">none set</string> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5731</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslKeyFileLocation</string> - <reference key="source" ref="679511995"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="679511995"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslKeyFileLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslKeyFileLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSNullPlaceholder</string> - <string key="NS.object.0">none set</string> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5732</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslKeyFileLocation</string> - <reference key="source" ref="51601157"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="51601157"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslKeyFileLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslKeyFileLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSNullPlaceholder</string> - <string key="NS.object.0">none set</string> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5733</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCACertFileLocation</string> - <reference key="source" ref="484504415"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="484504415"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCACertFileLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCACertFileLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSNullPlaceholder</string> - <string key="NS.object.0">none set</string> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5734</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sslCertificateFileLocation</string> - <reference key="source" ref="216069484"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="216069484"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sslCertificateFileLocation</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sslCertificateFileLocation</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSNullPlaceholder</string> - <string key="NS.object.0">none set</string> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5735</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: sshPort</string> - <reference key="source" ref="692784990"/> - <reference key="destination" ref="545410097"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="692784990"/> - <reference key="NSDestination" ref="545410097"/> - <string key="NSLabel">value: sshPort</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">sshPort</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSContinuouslyUpdatesValue</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <boolean value="YES"/> - <string>optional</string> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5737</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">favoritesTable</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="1012579052"/> - </object> - <int key="connectionID">5738</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectionView</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="733821228"/> - </object> - <int key="connectionID">5740</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">delegate</string> - <reference key="source" ref="616749187"/> - <reference key="destination" ref="545410097"/> - </object> - <int key="connectionID">5744</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">connectionSplitView</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="616749187"/> - </object> - <int key="connectionID">5745</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> - <reference key="source" ref="912885202"/> - <reference key="destination" ref="642702582"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="912885202"/> - <reference key="NSDestination" ref="642702582"/> - <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5754</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">updateKeyLocationFileVisibility:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="912885202"/> - </object> - <int key="connectionID">5755</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> - <reference key="source" ref="388256324"/> - <reference key="destination" ref="642702582"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="388256324"/> - <reference key="NSDestination" ref="642702582"/> - <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5758</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">updateKeyLocationFileVisibility:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="388256324"/> - </object> - <int key="connectionID">5759</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> - <reference key="source" ref="103272364"/> - <reference key="destination" ref="642702582"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="103272364"/> - <reference key="NSDestination" ref="642702582"/> - <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5762</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">updateKeyLocationFileVisibility:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="103272364"/> - </object> - <int key="connectionID">5763</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBBindingConnection" key="connection"> - <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> - <reference key="source" ref="455655503"/> - <reference key="destination" ref="642702582"/> - <object class="NSNibBindingConnector" key="connector"> - <reference key="NSSource" ref="455655503"/> - <reference key="NSDestination" ref="642702582"/> - <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> - <string key="NSBinding">value</string> - <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> - <object class="NSDictionary" key="NSOptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSNoSelectionPlaceholder</string> - <string>NSNotApplicablePlaceholder</string> - <string>NSNullPlaceholder</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="0"/> - <integer value="0"/> - <integer value="0"/> - </object> - </object> - <int key="NSNibBindingConnectorVersion">2</int> - </object> - </object> - <int key="connectionID">5766</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">updateKeyLocationFileVisibility:</string> - <reference key="source" ref="545410097"/> - <reference key="destination" ref="455655503"/> - </object> - <int key="connectionID">5767</int> - </object> - </object> - <object class="IBMutableOrderedSet" key="objectRecords"> - <object class="NSArray" key="orderedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBObjectRecord"> - <int key="objectID">0</int> - <reference key="object" ref="0"/> - <reference key="children" ref="584594810"/> - <nil key="parent"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-1</int> - <reference key="object" ref="547391009"/> - <reference key="parent" ref="0"/> - <string key="objectName">First Responder</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-2</int> - <reference key="object" ref="545410097"/> - <reference key="parent" ref="0"/> - <string key="objectName">File's Owner</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-3</int> - <reference key="object" ref="292263310"/> - <reference key="parent" ref="0"/> - <string key="objectName">Application</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5431</int> - <reference key="object" ref="958272936"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="536120400"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">Error Detail HUD</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5432</int> - <reference key="object" ref="536120400"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="699163511"/> - </object> - <reference key="parent" ref="958272936"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5433</int> - <reference key="object" ref="699163511"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="59706192"/> - <reference ref="266224177"/> - <reference ref="79422493"/> - </object> - <reference key="parent" ref="536120400"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5434</int> - <reference key="object" ref="59706192"/> - <reference key="parent" ref="699163511"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5435</int> - <reference key="object" ref="266224177"/> - <reference key="parent" ref="699163511"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5436</int> - <reference key="object" ref="79422493"/> - <reference key="parent" ref="699163511"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5455</int> - <reference key="object" ref="642702582"/> - <reference key="parent" ref="0"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5468</int> - <reference key="object" ref="9858888"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="471954922"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">Context Menu</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5469</int> - <reference key="object" ref="471954922"/> - <reference key="parent" ref="9858888"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5576</int> - <reference key="object" ref="567906875"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="44241774"/> - <reference ref="912885202"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">SSH Key Selection Help</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5577</int> - <reference key="object" ref="44241774"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1045018411"/> - </object> - <reference key="parent" ref="567906875"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5578</int> - <reference key="object" ref="1045018411"/> - <reference key="parent" ref="44241774"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5668</int> - <reference key="object" ref="12066713"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="538839943"/> - <reference ref="388256324"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">SSL Key File Selection Help</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5669</int> - <reference key="object" ref="538839943"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="124352014"/> - </object> - <reference key="parent" ref="12066713"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5670</int> - <reference key="object" ref="124352014"/> - <reference key="parent" ref="538839943"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5680</int> - <reference key="object" ref="3577372"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="761812578"/> - <reference ref="455655503"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">SSL CA Cert File Selection Help</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5681</int> - <reference key="object" ref="761812578"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="444474564"/> - </object> - <reference key="parent" ref="3577372"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5682</int> - <reference key="object" ref="444474564"/> - <reference key="parent" ref="761812578"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5683</int> - <reference key="object" ref="136328549"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="802544195"/> - <reference ref="103272364"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">SSL Certificate File Selection Help</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5684</int> - <reference key="object" ref="802544195"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="196059550"/> - </object> - <reference key="parent" ref="136328549"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5685</int> - <reference key="object" ref="196059550"/> - <reference key="parent" ref="802544195"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5739</int> - <reference key="object" ref="733821228"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="616749187"/> - </object> - <reference key="parent" ref="0"/> - <string key="objectName">ConnectionView</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5741</int> - <reference key="object" ref="616749187"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="551584428"/> - <reference ref="563806501"/> - </object> - <reference key="parent" ref="733821228"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5742</int> - <reference key="object" ref="551584428"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="805249222"/> - <reference ref="524598165"/> - </object> - <reference key="parent" ref="616749187"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5743</int> - <reference key="object" ref="563806501"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="570492783"/> - <reference ref="1058735001"/> - </object> - <reference key="parent" ref="616749187"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5345</int> - <reference key="object" ref="805249222"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="642219827"/> - <reference ref="221133754"/> - </object> - <reference key="parent" ref="551584428"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5346</int> - <reference key="object" ref="642219827"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="179580583"/> - </object> - <reference key="parent" ref="805249222"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5475</int> - <reference key="object" ref="221133754"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="270183415"/> - </object> - <reference key="parent" ref="805249222"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5476</int> - <reference key="object" ref="270183415"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="949612237"/> - </object> - <reference key="parent" ref="221133754"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5477</int> - <reference key="object" ref="949612237"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="751753648"/> - <reference ref="623685715"/> - </object> - <reference key="parent" ref="270183415"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5478</int> - <reference key="object" ref="751753648"/> - <reference key="parent" ref="949612237"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5479</int> - <reference key="object" ref="623685715"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="455108754"/> - </object> - <reference key="parent" ref="949612237"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5481</int> - <reference key="object" ref="455108754"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="536740264"/> - <reference ref="965148975"/> - <reference ref="997359603"/> - <reference ref="43427774"/> - <reference ref="513442721"/> - </object> - <reference key="parent" ref="623685715"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5482</int> - <reference key="object" ref="536740264"/> - <reference key="parent" ref="455108754"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5483</int> - <reference key="object" ref="965148975"/> - <reference key="parent" ref="455108754"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5484</int> - <reference key="object" ref="997359603"/> - <reference key="parent" ref="455108754"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5485</int> - <reference key="object" ref="43427774"/> - <reference key="parent" ref="455108754"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5486</int> - <reference key="object" ref="513442721"/> - <reference key="parent" ref="455108754"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5347</int> - <reference key="object" ref="179580583"/> - <reference key="parent" ref="642219827"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4910</int> - <reference key="object" ref="524598165"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1012579052"/> - <reference ref="802793151"/> - <reference ref="533108700"/> - </object> - <reference key="parent" ref="551584428"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4913</int> - <reference key="object" ref="1012579052"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="131458815"/> - </object> - <reference key="parent" ref="524598165"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4912</int> - <reference key="object" ref="802793151"/> - <reference key="parent" ref="524598165"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4911</int> - <reference key="object" ref="533108700"/> - <reference key="parent" ref="524598165"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4915</int> - <reference key="object" ref="131458815"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="93569184"/> - </object> - <reference key="parent" ref="1012579052"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4918</int> - <reference key="object" ref="93569184"/> - <reference key="parent" ref="131458815"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5154</int> - <reference key="object" ref="570492783"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="607446274"/> - </object> - <reference key="parent" ref="563806501"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5155</int> - <reference key="object" ref="607446274"/> - <reference key="parent" ref="570492783"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5588</int> - <reference key="object" ref="1058735001"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="508899576"/> - <reference ref="108277656"/> - <reference ref="315390047"/> - </object> - <reference key="parent" ref="563806501"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5589</int> - <reference key="object" ref="508899576"/> - <reference key="parent" ref="1058735001"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5590</int> - <reference key="object" ref="108277656"/> - <reference key="parent" ref="1058735001"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5447</int> - <reference key="object" ref="315390047"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="735564334"/> - </object> - <reference key="parent" ref="1058735001"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4888</int> - <reference key="object" ref="735564334"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="134031646"/> - <reference ref="575228526"/> - <reference ref="549907703"/> - <reference ref="990947983"/> - <reference ref="460592307"/> - <reference ref="476973680"/> - </object> - <reference key="parent" ref="315390047"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4980</int> - <reference key="object" ref="134031646"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="591192172"/> - <reference ref="517771995"/> - <reference ref="253369045"/> - </object> - <reference key="parent" ref="735564334"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5157</int> - <reference key="object" ref="460592307"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="424756162"/> - </object> - <reference key="parent" ref="735564334"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5159</int> - <reference key="object" ref="476973680"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="220047154"/> - </object> - <reference key="parent" ref="735564334"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5422</int> - <reference key="object" ref="575228526"/> - <reference key="parent" ref="735564334"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5423</int> - <reference key="object" ref="549907703"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="321846713"/> - </object> - <reference key="parent" ref="735564334"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4829</int> - <reference key="object" ref="990947983"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="757039715"/> - </object> - <reference key="parent" ref="735564334"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4839</int> - <reference key="object" ref="757039715"/> - <reference key="parent" ref="990947983"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5424</int> - <reference key="object" ref="321846713"/> - <reference key="parent" ref="549907703"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5160</int> - <reference key="object" ref="220047154"/> - <reference key="parent" ref="476973680"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5158</int> - <reference key="object" ref="424756162"/> - <reference key="parent" ref="460592307"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4985</int> - <reference key="object" ref="591192172"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="159800861"/> - </object> - <reference key="parent" ref="134031646"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4982</int> - <reference key="object" ref="517771995"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="962671066"/> - </object> - <reference key="parent" ref="134031646"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4981</int> - <reference key="object" ref="253369045"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="32802602"/> - </object> - <reference key="parent" ref="134031646"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4984</int> - <reference key="object" ref="32802602"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="31135925"/> - <reference ref="233374444"/> - </object> - <reference key="parent" ref="253369045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5595</int> - <reference key="object" ref="31135925"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="104955330"/> - <reference ref="638710413"/> - <reference ref="684819179"/> - <reference ref="950540175"/> - <reference ref="1034069158"/> - <reference ref="586011242"/> - <reference ref="945929172"/> - <reference ref="839299955"/> - <reference ref="679511995"/> - </object> - <reference key="parent" ref="32802602"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5156</int> - <reference key="object" ref="233374444"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="508687946"/> - <reference ref="644973446"/> - <reference ref="786098118"/> - <reference ref="978463433"/> - <reference ref="987440606"/> - <reference ref="211629203"/> - <reference ref="105635377"/> - <reference ref="950381827"/> - <reference ref="788113046"/> - <reference ref="1013612483"/> - <reference ref="910543023"/> - <reference ref="810791200"/> - <reference ref="445567924"/> - </object> - <reference key="parent" ref="32802602"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5593</int> - <reference key="object" ref="508687946"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="184523755"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5171</int> - <reference key="object" ref="644973446"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="859982751"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5173</int> - <reference key="object" ref="786098118"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="393023945"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5175</int> - <reference key="object" ref="978463433"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="925313159"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5176</int> - <reference key="object" ref="987440606"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="377431100"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5179</int> - <reference key="object" ref="211629203"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="646391991"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5180</int> - <reference key="object" ref="105635377"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="785119002"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5183</int> - <reference key="object" ref="950381827"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="925102591"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5184</int> - <reference key="object" ref="788113046"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="441978581"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5187</int> - <reference key="object" ref="1013612483"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1003825843"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5188</int> - <reference key="object" ref="910543023"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="588889019"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5376</int> - <reference key="object" ref="810791200"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1040289660"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5377</int> - <reference key="object" ref="445567924"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="485990188"/> - </object> - <reference key="parent" ref="233374444"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5378</int> - <reference key="object" ref="485990188"/> - <reference key="parent" ref="445567924"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5379</int> - <reference key="object" ref="1040289660"/> - <reference key="parent" ref="810791200"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5189</int> - <reference key="object" ref="588889019"/> - <reference key="parent" ref="910543023"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5190</int> - <reference key="object" ref="1003825843"/> - <reference key="parent" ref="1013612483"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5185</int> - <reference key="object" ref="441978581"/> - <reference key="parent" ref="788113046"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5186</int> - <reference key="object" ref="925102591"/> - <reference key="parent" ref="950381827"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5181</int> - <reference key="object" ref="785119002"/> - <reference key="parent" ref="105635377"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5182</int> - <reference key="object" ref="646391991"/> - <reference key="parent" ref="211629203"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5177</int> - <reference key="object" ref="377431100"/> - <reference key="parent" ref="987440606"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5178</int> - <reference key="object" ref="925313159"/> - <reference key="parent" ref="978463433"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5174</int> - <reference key="object" ref="393023945"/> - <reference key="parent" ref="786098118"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5172</int> - <reference key="object" ref="859982751"/> - <reference key="parent" ref="644973446"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5594</int> - <reference key="object" ref="184523755"/> - <reference key="parent" ref="508687946"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5614</int> - <reference key="object" ref="104955330"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="69612386"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5613</int> - <reference key="object" ref="638710413"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="791857368"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5612</int> - <reference key="object" ref="839299955"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1013426677"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5606</int> - <reference key="object" ref="684819179"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="371333119"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5605</int> - <reference key="object" ref="950540175"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="196185392"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5604</int> - <reference key="object" ref="945929172"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1000000271"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5600</int> - <reference key="object" ref="586011242"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="85329089"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5598</int> - <reference key="object" ref="1034069158"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="943522732"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5596</int> - <reference key="object" ref="679511995"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="650760201"/> - </object> - <reference key="parent" ref="31135925"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5597</int> - <reference key="object" ref="650760201"/> - <reference key="parent" ref="679511995"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5599</int> - <reference key="object" ref="943522732"/> - <reference key="parent" ref="1034069158"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5601</int> - <reference key="object" ref="85329089"/> - <reference key="parent" ref="586011242"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5609</int> - <reference key="object" ref="1000000271"/> - <reference key="parent" ref="945929172"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5608</int> - <reference key="object" ref="196185392"/> - <reference key="parent" ref="950540175"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5607</int> - <reference key="object" ref="371333119"/> - <reference key="parent" ref="684819179"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5617</int> - <reference key="object" ref="1013426677"/> - <reference key="parent" ref="839299955"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5616</int> - <reference key="object" ref="791857368"/> - <reference key="parent" ref="638710413"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5615</int> - <reference key="object" ref="69612386"/> - <reference key="parent" ref="104955330"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4983</int> - <reference key="object" ref="962671066"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="866600720"/> - <reference ref="394302879"/> - </object> - <reference key="parent" ref="517771995"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5688</int> - <reference key="object" ref="866600720"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="51601157"/> - <reference ref="57862599"/> - <reference ref="216069484"/> - <reference ref="521125104"/> - <reference ref="484504415"/> - <reference ref="98826968"/> - <reference ref="237955939"/> - <reference ref="988136593"/> - <reference ref="680939705"/> - </object> - <reference key="parent" ref="962671066"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5162</int> - <reference key="object" ref="394302879"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="16421625"/> - <reference ref="68541783"/> - <reference ref="607362814"/> - <reference ref="512253301"/> - <reference ref="789391730"/> - <reference ref="58217156"/> - <reference ref="745773732"/> - <reference ref="591324856"/> - <reference ref="474825058"/> - <reference ref="459734357"/> - <reference ref="728228957"/> - </object> - <reference key="parent" ref="962671066"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5720</int> - <reference key="object" ref="16421625"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="972347112"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5212</int> - <reference key="object" ref="68541783"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="279442436"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5213</int> - <reference key="object" ref="607362814"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="798396187"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5214</int> - <reference key="object" ref="512253301"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="251554254"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5215</int> - <reference key="object" ref="789391730"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="797213431"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5216</int> - <reference key="object" ref="58217156"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="185246669"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5217</int> - <reference key="object" ref="745773732"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="728524936"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5219</int> - <reference key="object" ref="591324856"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="317867885"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5385</int> - <reference key="object" ref="474825058"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="684614893"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5386</int> - <reference key="object" ref="459734357"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="352725628"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5218</int> - <reference key="object" ref="728228957"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="299457759"/> - </object> - <reference key="parent" ref="394302879"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5221</int> - <reference key="object" ref="299457759"/> - <reference key="parent" ref="728228957"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5387</int> - <reference key="object" ref="352725628"/> - <reference key="parent" ref="459734357"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5388</int> - <reference key="object" ref="684614893"/> - <reference key="parent" ref="474825058"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5220</int> - <reference key="object" ref="317867885"/> - <reference key="parent" ref="591324856"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5222</int> - <reference key="object" ref="728524936"/> - <reference key="parent" ref="745773732"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5223</int> - <reference key="object" ref="185246669"/> - <reference key="parent" ref="58217156"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5224</int> - <reference key="object" ref="797213431"/> - <reference key="parent" ref="789391730"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5225</int> - <reference key="object" ref="251554254"/> - <reference key="parent" ref="512253301"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5226</int> - <reference key="object" ref="798396187"/> - <reference key="parent" ref="607362814"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5227</int> - <reference key="object" ref="279442436"/> - <reference key="parent" ref="68541783"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5721</int> - <reference key="object" ref="972347112"/> - <reference key="parent" ref="16421625"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5697</int> - <reference key="object" ref="51601157"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="575863174"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5696</int> - <reference key="object" ref="57862599"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="357553281"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5695</int> - <reference key="object" ref="237955939"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="167444868"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5694</int> - <reference key="object" ref="988136593"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="559442548"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5693</int> - <reference key="object" ref="216069484"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="276609847"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5692</int> - <reference key="object" ref="521125104"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1025158673"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5691</int> - <reference key="object" ref="680939705"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="308087760"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5690</int> - <reference key="object" ref="484504415"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="169093017"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5689</int> - <reference key="object" ref="98826968"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="730590428"/> - </object> - <reference key="parent" ref="866600720"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5706</int> - <reference key="object" ref="730590428"/> - <reference key="parent" ref="98826968"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5705</int> - <reference key="object" ref="169093017"/> - <reference key="parent" ref="484504415"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5704</int> - <reference key="object" ref="308087760"/> - <reference key="parent" ref="680939705"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5703</int> - <reference key="object" ref="1025158673"/> - <reference key="parent" ref="521125104"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5702</int> - <reference key="object" ref="276609847"/> - <reference key="parent" ref="216069484"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5701</int> - <reference key="object" ref="559442548"/> - <reference key="parent" ref="988136593"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5700</int> - <reference key="object" ref="167444868"/> - <reference key="parent" ref="237955939"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5699</int> - <reference key="object" ref="357553281"/> - <reference key="parent" ref="57862599"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5698</int> - <reference key="object" ref="575863174"/> - <reference key="parent" ref="51601157"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">4986</int> - <reference key="object" ref="159800861"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="326102394"/> - </object> - <reference key="parent" ref="591192172"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5166</int> - <reference key="object" ref="326102394"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="906103858"/> - <reference ref="180145997"/> - <reference ref="1030226140"/> - <reference ref="615962367"/> - <reference ref="358903996"/> - <reference ref="189856761"/> - <reference ref="187191991"/> - <reference ref="71258292"/> - <reference ref="1000646962"/> - <reference ref="632758915"/> - <reference ref="1049720725"/> - <reference ref="914345743"/> - <reference ref="844385120"/> - <reference ref="81612279"/> - <reference ref="790983747"/> - <reference ref="558754343"/> - <reference ref="21480939"/> - <reference ref="627782947"/> - <reference ref="692784990"/> - <reference ref="984151006"/> - <reference ref="1022082829"/> - <reference ref="761323775"/> - <reference ref="183948302"/> - </object> - <reference key="parent" ref="159800861"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5525</int> - <reference key="object" ref="906103858"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="882604644"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5523</int> - <reference key="object" ref="180145997"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="13940444"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5492</int> - <reference key="object" ref="183948302"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="510891456"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5264</int> - <reference key="object" ref="1030226140"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="933547668"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5265</int> - <reference key="object" ref="615962367"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="547674489"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5266</int> - <reference key="object" ref="358903996"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="869330413"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5267</int> - <reference key="object" ref="189856761"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="218707841"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5268</int> - <reference key="object" ref="187191991"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="737530250"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5269</int> - <reference key="object" ref="71258292"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1056521404"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5270</int> - <reference key="object" ref="1000646962"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="289965133"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5271</int> - <reference key="object" ref="632758915"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="664433389"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5272</int> - <reference key="object" ref="1049720725"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="615536496"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5273</int> - <reference key="object" ref="914345743"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="265944034"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5284</int> - <reference key="object" ref="844385120"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="505035309"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5285</int> - <reference key="object" ref="81612279"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="386177793"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5286</int> - <reference key="object" ref="790983747"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="347555313"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5287</int> - <reference key="object" ref="558754343"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="222275233"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5288</int> - <reference key="object" ref="21480939"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="944931136"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5289</int> - <reference key="object" ref="627782947"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="369035253"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5290</int> - <reference key="object" ref="692784990"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="850057181"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5291</int> - <reference key="object" ref="984151006"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="563972303"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5403</int> - <reference key="object" ref="1022082829"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="833542503"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5404</int> - <reference key="object" ref="761323775"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="906889126"/> - </object> - <reference key="parent" ref="326102394"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5405</int> - <reference key="object" ref="906889126"/> - <reference key="parent" ref="761323775"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5406</int> - <reference key="object" ref="833542503"/> - <reference key="parent" ref="1022082829"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5292</int> - <reference key="object" ref="563972303"/> - <reference key="parent" ref="984151006"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5293</int> - <reference key="object" ref="850057181"/> - <reference key="parent" ref="692784990"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5294</int> - <reference key="object" ref="369035253"/> - <reference key="parent" ref="627782947"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5295</int> - <reference key="object" ref="944931136"/> - <reference key="parent" ref="21480939"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5296</int> - <reference key="object" ref="222275233"/> - <reference key="parent" ref="558754343"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5297</int> - <reference key="object" ref="347555313"/> - <reference key="parent" ref="790983747"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5298</int> - <reference key="object" ref="386177793"/> - <reference key="parent" ref="81612279"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5299</int> - <reference key="object" ref="505035309"/> - <reference key="parent" ref="844385120"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5274</int> - <reference key="object" ref="265944034"/> - <reference key="parent" ref="914345743"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5275</int> - <reference key="object" ref="615536496"/> - <reference key="parent" ref="1049720725"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5276</int> - <reference key="object" ref="664433389"/> - <reference key="parent" ref="632758915"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5277</int> - <reference key="object" ref="289965133"/> - <reference key="parent" ref="1000646962"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5278</int> - <reference key="object" ref="1056521404"/> - <reference key="parent" ref="71258292"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5279</int> - <reference key="object" ref="737530250"/> - <reference key="parent" ref="187191991"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5280</int> - <reference key="object" ref="218707841"/> - <reference key="parent" ref="189856761"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5281</int> - <reference key="object" ref="869330413"/> - <reference key="parent" ref="358903996"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5282</int> - <reference key="object" ref="547674489"/> - <reference key="parent" ref="615962367"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5283</int> - <reference key="object" ref="933547668"/> - <reference key="parent" ref="1030226140"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5493</int> - <reference key="object" ref="510891456"/> - <reference key="parent" ref="183948302"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5524</int> - <reference key="object" ref="13940444"/> - <reference key="parent" ref="180145997"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5526</int> - <reference key="object" ref="882604644"/> - <reference key="parent" ref="906103858"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5748</int> - <reference key="object" ref="912885202"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="388136120"/> - </object> - <reference key="parent" ref="567906875"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5749</int> - <reference key="object" ref="388136120"/> - <reference key="parent" ref="912885202"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5756</int> - <reference key="object" ref="388256324"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="844788897"/> - </object> - <reference key="parent" ref="12066713"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5757</int> - <reference key="object" ref="844788897"/> - <reference key="parent" ref="388256324"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5760</int> - <reference key="object" ref="103272364"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="20247014"/> - </object> - <reference key="parent" ref="136328549"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5761</int> - <reference key="object" ref="20247014"/> - <reference key="parent" ref="103272364"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5764</int> - <reference key="object" ref="455655503"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="609741956"/> - </object> - <reference key="parent" ref="3577372"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">5765</int> - <reference key="object" ref="609741956"/> - <reference key="parent" ref="455655503"/> - </object> - </object> - </object> - <object class="NSMutableDictionary" key="flattenedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>-3.IBPluginDependency</string> - <string>-3.ImportedFromIB2</string> - <string>4829.IBPluginDependency</string> - <string>4829.ImportedFromIB2</string> - <string>4839.IBPluginDependency</string> - <string>4888.IBPluginDependency</string> - <string>4888.IBViewBoundsToFrameTransform</string> - <string>4910.IBPluginDependency</string> - <string>4911.IBPluginDependency</string> - <string>4912.IBPluginDependency</string> - <string>4913.CustomClassName</string> - <string>4913.IBPluginDependency</string> - <string>4915.IBPluginDependency</string> - <string>4918.CustomClassName</string> - <string>4918.IBPluginDependency</string> - <string>4980.IBAttributePlaceholdersKey</string> - <string>4980.IBPluginDependency</string> - <string>4981.IBPluginDependency</string> - <string>4982.IBPluginDependency</string> - <string>4983.IBPluginDependency</string> - <string>4984.IBPluginDependency</string> - <string>4985.IBPluginDependency</string> - <string>4986.IBPluginDependency</string> - <string>5154.IBPluginDependency</string> - <string>5155.IBPluginDependency</string> - <string>5156.IBPluginDependency</string> - <string>5157.IBPluginDependency</string> - <string>5157.IBViewBoundsToFrameTransform</string> - <string>5158.IBPluginDependency</string> - <string>5159.IBAttributePlaceholdersKey</string> - <string>5159.IBPluginDependency</string> - <string>5159.IBViewBoundsToFrameTransform</string> - <string>5160.IBPluginDependency</string> - <string>5162.IBPluginDependency</string> - <string>5166.IBPluginDependency</string> - <string>5171.IBAttributePlaceholdersKey</string> - <string>5171.IBPluginDependency</string> - <string>5172.IBPluginDependency</string> - <string>5173.IBPluginDependency</string> - <string>5174.IBPluginDependency</string> - <string>5175.IBAttributePlaceholdersKey</string> - <string>5175.IBPluginDependency</string> - <string>5176.IBPluginDependency</string> - <string>5177.IBPluginDependency</string> - <string>5178.IBPluginDependency</string> - <string>5179.CustomClassName</string> - <string>5179.IBAttributePlaceholdersKey</string> - <string>5179.IBPluginDependency</string> - <string>5180.IBPluginDependency</string> - <string>5181.IBPluginDependency</string> - <string>5182.IBPluginDependency</string> - <string>5183.IBAttributePlaceholdersKey</string> - <string>5183.IBPluginDependency</string> - <string>5184.IBPluginDependency</string> - <string>5185.IBPluginDependency</string> - <string>5186.IBPluginDependency</string> - <string>5187.IBAttributePlaceholdersKey</string> - <string>5187.IBPluginDependency</string> - <string>5188.IBPluginDependency</string> - <string>5189.IBPluginDependency</string> - <string>5190.IBPluginDependency</string> - <string>5212.IBAttributePlaceholdersKey</string> - <string>5212.IBPluginDependency</string> - <string>5213.IBPluginDependency</string> - <string>5214.CustomClassName</string> - <string>5214.IBAttributePlaceholdersKey</string> - <string>5214.IBPluginDependency</string> - <string>5215.IBPluginDependency</string> - <string>5216.IBAttributePlaceholdersKey</string> - <string>5216.IBPluginDependency</string> - <string>5217.IBPluginDependency</string> - <string>5218.IBAttributePlaceholdersKey</string> - <string>5218.IBPluginDependency</string> - <string>5219.IBPluginDependency</string> - <string>5220.IBPluginDependency</string> - <string>5221.IBPluginDependency</string> - <string>5222.IBPluginDependency</string> - <string>5223.IBPluginDependency</string> - <string>5224.IBPluginDependency</string> - <string>5225.IBPluginDependency</string> - <string>5226.IBPluginDependency</string> - <string>5227.IBPluginDependency</string> - <string>5264.IBAttributePlaceholdersKey</string> - <string>5264.IBPluginDependency</string> - <string>5265.IBPluginDependency</string> - <string>5266.IBAttributePlaceholdersKey</string> - <string>5266.IBPluginDependency</string> - <string>5267.IBPluginDependency</string> - <string>5268.CustomClassName</string> - <string>5268.IBAttributePlaceholdersKey</string> - <string>5268.IBPluginDependency</string> - <string>5269.IBPluginDependency</string> - <string>5270.IBAttributePlaceholdersKey</string> - <string>5270.IBPluginDependency</string> - <string>5271.IBPluginDependency</string> - <string>5272.IBAttributePlaceholdersKey</string> - <string>5272.IBPluginDependency</string> - <string>5273.IBPluginDependency</string> - <string>5274.IBPluginDependency</string> - <string>5275.IBPluginDependency</string> - <string>5276.IBPluginDependency</string> - <string>5277.IBPluginDependency</string> - <string>5278.IBPluginDependency</string> - <string>5279.IBPluginDependency</string> - <string>5280.IBPluginDependency</string> - <string>5281.IBPluginDependency</string> - <string>5282.IBPluginDependency</string> - <string>5283.IBPluginDependency</string> - <string>5284.IBAttributePlaceholdersKey</string> - <string>5284.IBPluginDependency</string> - <string>5285.IBPluginDependency</string> - <string>5286.IBAttributePlaceholdersKey</string> - <string>5286.IBPluginDependency</string> - <string>5287.IBPluginDependency</string> - <string>5288.CustomClassName</string> - <string>5288.IBAttributePlaceholdersKey</string> - <string>5288.IBPluginDependency</string> - <string>5289.IBPluginDependency</string> - <string>5290.IBAttributePlaceholdersKey</string> - <string>5290.IBPluginDependency</string> - <string>5291.IBPluginDependency</string> - <string>5292.IBPluginDependency</string> - <string>5293.IBPluginDependency</string> - <string>5294.IBPluginDependency</string> - <string>5295.IBPluginDependency</string> - <string>5296.IBPluginDependency</string> - <string>5297.IBPluginDependency</string> - <string>5298.IBPluginDependency</string> - <string>5299.IBPluginDependency</string> - <string>5345.IBPluginDependency</string> - <string>5346.IBAttributePlaceholdersKey</string> - <string>5346.IBPluginDependency</string> - <string>5347.IBPluginDependency</string> - <string>5376.IBAttributePlaceholdersKey</string> - <string>5376.IBPluginDependency</string> - <string>5377.IBPluginDependency</string> - <string>5378.IBPluginDependency</string> - <string>5379.IBPluginDependency</string> - <string>5385.IBAttributePlaceholdersKey</string> - <string>5385.IBPluginDependency</string> - <string>5386.IBPluginDependency</string> - <string>5387.IBPluginDependency</string> - <string>5388.IBAttributePlaceholdersKey</string> - <string>5388.IBPluginDependency</string> - <string>5403.IBAttributePlaceholdersKey</string> - <string>5403.IBPluginDependency</string> - <string>5404.IBPluginDependency</string> - <string>5405.IBPluginDependency</string> - <string>5406.IBPluginDependency</string> - <string>5422.IBPluginDependency</string> - <string>5423.IBPluginDependency</string> - <string>5424.IBPluginDependency</string> - <string>5431.IBEditorWindowLastContentRect</string> - <string>5431.IBPluginDependency</string> - <string>5431.IBWindowTemplateEditedContentRect</string> - <string>5431.NSWindowTemplate.visibleAtLaunch</string> - <string>5431.editorWindowContentRectSynchronizationRect</string> - <string>5431.windowTemplate.hasMaxSize</string> - <string>5431.windowTemplate.hasMinSize</string> - <string>5431.windowTemplate.maxSize</string> - <string>5431.windowTemplate.minSize</string> - <string>5432.IBPluginDependency</string> - <string>5433.IBPluginDependency</string> - <string>5434.IBPluginDependency</string> - <string>5435.IBPluginDependency</string> - <string>5436.IBPluginDependency</string> - <string>5447.IBPluginDependency</string> - <string>5455.IBPluginDependency</string> - <string>5468.IBEditorWindowLastContentRect</string> - <string>5468.IBPluginDependency</string> - <string>5469.IBPluginDependency</string> - <string>5475.IBPluginDependency</string> - <string>5476.IBPluginDependency</string> - <string>5477.IBEditorWindowLastContentRect</string> - <string>5477.IBPluginDependency</string> - <string>5478.IBPluginDependency</string> - <string>5479.IBPluginDependency</string> - <string>5481.IBEditorWindowLastContentRect</string> - <string>5481.IBPluginDependency</string> - <string>5482.IBPluginDependency</string> - <string>5483.IBPluginDependency</string> - <string>5484.IBPluginDependency</string> - <string>5485.IBPluginDependency</string> - <string>5486.IBPluginDependency</string> - <string>5492.IBAttributePlaceholdersKey</string> - <string>5492.IBPluginDependency</string> - <string>5492.IBViewBoundsToFrameTransform</string> - <string>5493.IBPluginDependency</string> - <string>5523.IBPluginDependency</string> - <string>5524.IBPluginDependency</string> - <string>5525.IBPluginDependency</string> - <string>5526.IBPluginDependency</string> - <string>5576.IBEditorWindowLastContentRect</string> - <string>5576.IBPluginDependency</string> - <string>5577.IBPluginDependency</string> - <string>5578.IBPluginDependency</string> - <string>5588.IBPluginDependency</string> - <string>5589.IBPluginDependency</string> - <string>5590.IBPluginDependency</string> - <string>5593.IBPluginDependency</string> - <string>5594.IBPluginDependency</string> - <string>5595.IBPluginDependency</string> - <string>5596.IBPluginDependency</string> - <string>5597.IBPluginDependency</string> - <string>5598.IBPluginDependency</string> - <string>5599.IBPluginDependency</string> - <string>5600.IBAttributePlaceholdersKey</string> - <string>5600.IBPluginDependency</string> - <string>5600.IBViewBoundsToFrameTransform</string> - <string>5601.IBPluginDependency</string> - <string>5604.IBAttributePlaceholdersKey</string> - <string>5604.IBPluginDependency</string> - <string>5604.IBViewBoundsToFrameTransform</string> - <string>5605.IBPluginDependency</string> - <string>5606.IBPluginDependency</string> - <string>5607.IBPluginDependency</string> - <string>5608.IBPluginDependency</string> - <string>5609.IBPluginDependency</string> - <string>5612.IBAttributePlaceholdersKey</string> - <string>5612.IBPluginDependency</string> - <string>5612.IBViewBoundsToFrameTransform</string> - <string>5613.IBPluginDependency</string> - <string>5614.IBPluginDependency</string> - <string>5615.IBPluginDependency</string> - <string>5616.IBPluginDependency</string> - <string>5617.IBPluginDependency</string> - <string>5668.IBEditorWindowLastContentRect</string> - <string>5668.IBPluginDependency</string> - <string>5669.IBPluginDependency</string> - <string>5670.IBPluginDependency</string> - <string>5680.IBEditorWindowLastContentRect</string> - <string>5680.IBPluginDependency</string> - <string>5681.IBPluginDependency</string> - <string>5682.IBPluginDependency</string> - <string>5683.IBEditorWindowLastContentRect</string> - <string>5683.IBPluginDependency</string> - <string>5684.IBPluginDependency</string> - <string>5685.IBPluginDependency</string> - <string>5688.IBPluginDependency</string> - <string>5689.IBPluginDependency</string> - <string>5690.IBPluginDependency</string> - <string>5691.IBAttributePlaceholdersKey</string> - <string>5691.IBPluginDependency</string> - <string>5691.IBViewBoundsToFrameTransform</string> - <string>5692.IBPluginDependency</string> - <string>5693.IBPluginDependency</string> - <string>5694.IBAttributePlaceholdersKey</string> - <string>5694.IBPluginDependency</string> - <string>5694.IBViewBoundsToFrameTransform</string> - <string>5695.IBAttributePlaceholdersKey</string> - <string>5695.IBPluginDependency</string> - <string>5695.IBViewBoundsToFrameTransform</string> - <string>5696.IBPluginDependency</string> - <string>5697.IBPluginDependency</string> - <string>5698.IBPluginDependency</string> - <string>5699.IBPluginDependency</string> - <string>5700.IBPluginDependency</string> - <string>5701.IBPluginDependency</string> - <string>5702.IBPluginDependency</string> - <string>5703.IBPluginDependency</string> - <string>5704.IBPluginDependency</string> - <string>5705.IBPluginDependency</string> - <string>5706.IBPluginDependency</string> - <string>5720.IBPluginDependency</string> - <string>5721.IBPluginDependency</string> - <string>5739.IBEditorWindowLastContentRect</string> - <string>5739.IBPluginDependency</string> - <string>5741.IBPluginDependency</string> - <string>5742.IBPluginDependency</string> - <string>5743.IBPluginDependency</string> - <string>5748.IBPluginDependency</string> - <string>5748.IBViewBoundsToFrameTransform</string> - <string>5749.IBPluginDependency</string> - <string>5756.IBPluginDependency</string> - <string>5756.IBViewBoundsToFrameTransform</string> - <string>5757.IBPluginDependency</string> - <string>5760.IBPluginDependency</string> - <string>5760.IBViewBoundsToFrameTransform</string> - <string>5761.IBPluginDependency</string> - <string>5764.IBPluginDependency</string> - <string>5764.IBViewBoundsToFrameTransform</string> - <string>5765.IBPluginDependency</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="1"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="1"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">AUMFAABAAAAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>SPFavoritesOutlineView</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>SPTableTextFieldCell</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">InitialTabViewItem</string> - <object class="IBInitialTabViewItemAttribute" key="NS.object.0"> - <string key="name">InitialTabViewItem</string> - <reference key="object" ref="134031646"/> - <reference key="initialTabViewItem" ref="253369045"/> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDjIAAwdgAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="476973680"/> - <string key="toolTip">Add to Favorites (⌥⌘A)</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABCsgAAwdgAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="644973446"/> - <string key="toolTip">Enter the hostname of the MySQL server you want to connect to. Enter 127.0.0.1 to connect to a server on this computer</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="978463433"/> - <string key="toolTip">Enter the MySQL username to connect with</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>NSSecureTextField</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="211629203"/> - <string key="toolTip">Enter the password to use when connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="950381827"/> - <string key="toolTip">Optionally enter a database to select after successfully connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="1013612483"/> - <string key="toolTip">Enter the port to use when connecting to the MySQL server. The default MySQL port is 3306</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="68541783"/> - <string key="toolTip">Enter the MySQL username to connect with</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>NSSecureTextField</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="512253301"/> - <string key="toolTip">Enter the password to use when connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="58217156"/> - <string key="toolTip">Optionally enter a database to select after successfully connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="728228957"/> - <string key="toolTip">Enter the path to the socket file to use when connecting to MySQL. Leave this field blank to use the default socket location</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="1030226140"/> - <string key="toolTip">Enter the hostname of the MySQL server you want to connect to. Enter 127.0.0.1 to connect to a server running on the machine you are tunnelling to</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="358903996"/> - <string key="toolTip">Enter the MySQL username to connect with</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>NSSecureTextField</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="187191991"/> - <string key="toolTip">Enter the password to use when connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="1000646962"/> - <string key="toolTip">Optionally enter a database to select after successfully connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="1049720725"/> - <string key="toolTip">Enter the port to use when connecting to the MySQL server. The default MySQL port is 3306</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="844385120"/> - <string key="toolTip">Enter the hostname of the SSH server to tunnel via when connecting to the MySQL server</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="790983747"/> - <string key="toolTip">Enter the SSH username to connect with</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>NSSecureTextField</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="21480939"/> - <string key="toolTip">Enter the password to use when connecting to the SSH server. NB: your SSH configuration is used, and public/private key pairs and other authentication methods will be used if available</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="692784990"/> - <string key="toolTip">Enter the port to use when connecting to the SSH server. The default SSH port is 22</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.brandonwalkin.BWToolkit</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="642219827"/> - <string key="toolTip">Edit Favorites in Preferences (⌥⌘E)</string> - </object> - </object> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="810791200"/> - <string key="toolTip">Enter a nickname to use if adding to favorites. Optional.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="474825058"/> - <string key="toolTip">Enter a nickname to use if adding to favorites. Optional.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="1022082829"/> - <string key="toolTip">Enter a nickname to use if adding to favorites. Optional.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{178, 539}, {580, 320}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{178, 539}, {580, 320}}</string> - <integer value="0"/> - <string>{{115, 214}, {588, 350}}</string> - <integer value="0"/> - <boolean value="YES"/> - <string>{3.40282e+38, 3.40282e+38}</string> - <string>{100, 100}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{639, 342}, {150, 23}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>{{552, 171}, {97, 37}}</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>{{649, 98}, {180, 93}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="183948302"/> - <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwogAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{71, 624}, {579, 83}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="586011242"/> - <string key="toolTip">Click to choose the SSL key file to use when establishing a secure connection</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwswAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="945929172"/> - <string key="toolTip">Click to choose the client SSL certificate file to use when establishing a secure connection</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwogAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="839299955"/> - <string key="toolTip">Click to choose the client SSL Certificate Authority certificate to use when establishing a secure connection</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwggAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{322, 595}, {579, 66}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{167, 425}, {579, 83}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{339, 568}, {599, 66}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="680939705"/> - <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwggAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="988136593"/> - <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwogAAA</bytes> - </object> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="237955939"/> - <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> - </object> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwswAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{280, 381}, {882, 475}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.brandonwalkin.BWToolkit</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwfAAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABBAAAAwo4AAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDqQAAwiAAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSAffineTransform"> - <bytes key="NSTransformStruct">P4AAAL+AAABDGQAAwgAAAA</bytes> - </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </object> - </object> - <object class="NSMutableDictionary" key="unlocalizedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <nil key="activeLocalization"/> - <object class="NSMutableDictionary" key="localizations"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <nil key="sourceID"/> - <int key="maxID">5767</int> - </object> - <object class="IBClassDescriber" key="IBDocument.Classes"> - <object class="NSMutableArray" key="referencedPartialClassDescriptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBPartialClassDescription"> - <string key="className">ImageAndTextCell</string> - <string key="superclassName">NSTextFieldCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/ImageAndTextCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabDragAssistant.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenu</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPMenuAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/MCPKit/MCPFoundationKit/MCPNull.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="968459546"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPConnectionController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPContentFilterManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPImageView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPMainThreadTrampoline.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPNotLoaded.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPQueryFavoriteManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">toggleCollapse:</string> - <string key="NS.object.0">id</string> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <string key="NS.key.0">toggleCollapse:</string> - <object class="IBActionInfo" key="NS.object.0"> - <string key="name">toggleCollapse:</string> - <string key="candidateClassName">id</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPTablesList.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextView</string> - <object class="NSMutableDictionary" key="actions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>doDecomposedStringWithCanonicalMapping:</string> - <string>doDecomposedStringWithCompatibilityMapping:</string> - <string>doPrecomposedStringWithCanonicalMapping:</string> - <string>doPrecomposedStringWithCompatibilityMapping:</string> - <string>doRemoveDiacritics:</string> - <string>doSelectionLowerCase:</string> - <string>doSelectionTitleCase:</string> - <string>doSelectionUpperCase:</string> - <string>doTranspose:</string> - <string>executeBundleItemForInputField:</string> - <string>insertNULLvalue:</string> - <string>moveSelectionLineDown:</string> - <string>moveSelectionLineUp:</string> - <string>selectCurrentLine:</string> - <string>selectCurrentWord:</string> - <string>selectEnclosingBrackets:</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - </object> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>doDecomposedStringWithCanonicalMapping:</string> - <string>doDecomposedStringWithCompatibilityMapping:</string> - <string>doPrecomposedStringWithCanonicalMapping:</string> - <string>doPrecomposedStringWithCompatibilityMapping:</string> - <string>doRemoveDiacritics:</string> - <string>doSelectionLowerCase:</string> - <string>doSelectionTitleCase:</string> - <string>doSelectionUpperCase:</string> - <string>doTranspose:</string> - <string>executeBundleItemForInputField:</string> - <string>insertNULLvalue:</string> - <string>moveSelectionLineDown:</string> - <string>moveSelectionLineUp:</string> - <string>selectCurrentLine:</string> - <string>selectCurrentWord:</string> - <string>selectEnclosingBrackets:</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBActionInfo"> - <string key="name">doDecomposedStringWithCanonicalMapping:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doDecomposedStringWithCompatibilityMapping:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doPrecomposedStringWithCanonicalMapping:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doPrecomposedStringWithCompatibilityMapping:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doRemoveDiacritics:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doSelectionLowerCase:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doSelectionTitleCase:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doSelectionUpperCase:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">doTranspose:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">executeBundleItemForInputField:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">insertNULLvalue:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">moveSelectionLineDown:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">moveSelectionLineUp:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">selectCurrentLine:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">selectCurrentWord:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">selectEnclosingBrackets:</string> - <string key="candidateClassName">id</string> - </object> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPTextViewAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPWindowAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">SPConnectionController</string> - <string key="superclassName">NSObject</string> - <object class="NSMutableDictionary" key="actions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>addFavorite:</string> - <string>cancelMySQLConnection:</string> - <string>chooseKeyLocation:</string> - <string>editFavorites:</string> - <string>initiateConnection:</string> - <string>reverseSortFavorites:</string> - <string>showHelp:</string> - <string>sortFavorites:</string> - <string>updateFavoriteSelection:</string> - <string>updateKeyLocationFileVisibility:</string> - <string>updateSSLInterface:</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - </object> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>addFavorite:</string> - <string>cancelMySQLConnection:</string> - <string>chooseKeyLocation:</string> - <string>editFavorites:</string> - <string>initiateConnection:</string> - <string>reverseSortFavorites:</string> - <string>showHelp:</string> - <string>sortFavorites:</string> - <string>updateFavoriteSelection:</string> - <string>updateKeyLocationFileVisibility:</string> - <string>updateSSLInterface:</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBActionInfo"> - <string key="name">addFavorite:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">cancelMySQLConnection:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">chooseKeyLocation:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">editFavorites:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">initiateConnection:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">reverseSortFavorites:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">showHelp:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">sortFavorites:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">updateFavoriteSelection:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">updateKeyLocationFileVisibility:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">updateSSLInterface:</string> - <string key="candidateClassName">id</string> - </object> - </object> - </object> - <object class="NSMutableDictionary" key="outlets"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>addToFavoritesButton</string> - <string>connectButton</string> - <string>connectionDetailsScrollView</string> - <string>connectionResizeContainer</string> - <string>connectionSplitView</string> - <string>connectionSplitViewButtonBar</string> - <string>connectionView</string> - <string>delegate</string> - <string>errorDetailText</string> - <string>errorDetailWindow</string> - <string>favoritesSortByMenuItem</string> - <string>favoritesTable</string> - <string>helpButton</string> - <string>progressIndicator</string> - <string>progressIndicatorText</string> - <string>socketConnectionFormContainer</string> - <string>socketConnectionSSLDetailsContainer</string> - <string>socketPasswordField</string> - <string>socketSSLCACertButton</string> - <string>socketSSLCertificateButton</string> - <string>socketSSLKeyFileButton</string> - <string>sshConnectionFormContainer</string> - <string>sshKeyLocationHelp</string> - <string>sshPasswordField</string> - <string>sshSQLHostField</string> - <string>sshSSHKeyButton</string> - <string>sshSSHPasswordField</string> - <string>sslCACertLocationHelp</string> - <string>sslCertificateLocationHelp</string> - <string>sslKeyFileLocationHelp</string> - <string>standardConnectionFormContainer</string> - <string>standardConnectionSSLDetailsContainer</string> - <string>standardPasswordField</string> - <string>standardSQLHostField</string> - <string>standardSSLCACertButton</string> - <string>standardSSLCertificateButton</string> - <string>standardSSLKeyFileButton</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSButton</string> - <string>NSButton</string> - <string>NSScrollView</string> - <string>NSView</string> - <string>NSSplitView</string> - <string>BWAnchoredButtonBar</string> - <string>NSView</string> - <string>id</string> - <string>NSTextView</string> - <string>NSWindow</string> - <string>NSMenuItem</string> - <string>SPFavoritesOutlineView</string> - <string>NSButton</string> - <string>NSProgressIndicator</string> - <string>NSTextField</string> - <string>NSView</string> - <string>NSView</string> - <string>NSSecureTextField</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSView</string> - <string>NSView</string> - <string>NSSecureTextField</string> - <string>NSTextField</string> - <string>NSButton</string> - <string>NSSecureTextField</string> - <string>NSView</string> - <string>NSView</string> - <string>NSView</string> - <string>NSView</string> - <string>NSView</string> - <string>NSSecureTextField</string> - <string>NSTextField</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSButton</string> - </object> - </object> - <object class="NSMutableDictionary" key="toOneOutletInfosByName"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>addToFavoritesButton</string> - <string>connectButton</string> - <string>connectionDetailsScrollView</string> - <string>connectionResizeContainer</string> - <string>connectionSplitView</string> - <string>connectionSplitViewButtonBar</string> - <string>connectionView</string> - <string>delegate</string> - <string>errorDetailText</string> - <string>errorDetailWindow</string> - <string>favoritesSortByMenuItem</string> - <string>favoritesTable</string> - <string>helpButton</string> - <string>progressIndicator</string> - <string>progressIndicatorText</string> - <string>socketConnectionFormContainer</string> - <string>socketConnectionSSLDetailsContainer</string> - <string>socketPasswordField</string> - <string>socketSSLCACertButton</string> - <string>socketSSLCertificateButton</string> - <string>socketSSLKeyFileButton</string> - <string>sshConnectionFormContainer</string> - <string>sshKeyLocationHelp</string> - <string>sshPasswordField</string> - <string>sshSQLHostField</string> - <string>sshSSHKeyButton</string> - <string>sshSSHPasswordField</string> - <string>sslCACertLocationHelp</string> - <string>sslCertificateLocationHelp</string> - <string>sslKeyFileLocationHelp</string> - <string>standardConnectionFormContainer</string> - <string>standardConnectionSSLDetailsContainer</string> - <string>standardPasswordField</string> - <string>standardSQLHostField</string> - <string>standardSSLCACertButton</string> - <string>standardSSLCertificateButton</string> - <string>standardSSLKeyFileButton</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBToOneOutletInfo"> - <string key="name">addToFavoritesButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">connectButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">connectionDetailsScrollView</string> - <string key="candidateClassName">NSScrollView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">connectionResizeContainer</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">connectionSplitView</string> - <string key="candidateClassName">NSSplitView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">connectionSplitViewButtonBar</string> - <string key="candidateClassName">BWAnchoredButtonBar</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">connectionView</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">delegate</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">errorDetailText</string> - <string key="candidateClassName">NSTextView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">errorDetailWindow</string> - <string key="candidateClassName">NSWindow</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">favoritesSortByMenuItem</string> - <string key="candidateClassName">NSMenuItem</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">favoritesTable</string> - <string key="candidateClassName">SPFavoritesOutlineView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">helpButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">progressIndicator</string> - <string key="candidateClassName">NSProgressIndicator</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">progressIndicatorText</string> - <string key="candidateClassName">NSTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">socketConnectionFormContainer</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">socketConnectionSSLDetailsContainer</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">socketPasswordField</string> - <string key="candidateClassName">NSSecureTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">socketSSLCACertButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">socketSSLCertificateButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">socketSSLKeyFileButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sshConnectionFormContainer</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sshKeyLocationHelp</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sshPasswordField</string> - <string key="candidateClassName">NSSecureTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sshSQLHostField</string> - <string key="candidateClassName">NSTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sshSSHKeyButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sshSSHPasswordField</string> - <string key="candidateClassName">NSSecureTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sslCACertLocationHelp</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sslCertificateLocationHelp</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">sslKeyFileLocationHelp</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardConnectionFormContainer</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardConnectionSSLDetailsContainer</string> - <string key="candidateClassName">NSView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardPasswordField</string> - <string key="candidateClassName">NSSecureTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardSQLHostField</string> - <string key="candidateClassName">NSTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardSSLCACertButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardSSLCertificateButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">standardSSLKeyFileButton</string> - <string key="candidateClassName">NSButton</string> - </object> - </object> - </object> - <reference key="sourceIdentifier" ref="968459546"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">SPConnectionController</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPConnectionControllerDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">SPFavoritesOutlineView</string> - <string key="superclassName">NSOutlineView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPFavoritesOutlineView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">SPFlippedView</string> - <string key="superclassName">NSView</string> - <reference key="sourceIdentifier" ref="968459546"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">SPTableTextFieldCell</string> - <string key="superclassName">ImageAndTextCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Source/SPTableTextFieldCell.h</string> - </object> - </object> - </object> - <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBPartialClassDescription"> - <string key="className">BWAnchoredButton</string> - <string key="superclassName">NSButton</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredButton.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWAnchoredButtonBar</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredButtonBar.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWAnchoredButtonCell</string> - <string key="superclassName">NSButtonCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredButtonCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWAnchoredPopUpButton</string> - <string key="superclassName">NSPopUpButton</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredPopUpButton.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWAnchoredPopUpButtonCell</string> - <string key="superclassName">NSPopUpButtonCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredPopUpButtonCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWSplitView</string> - <string key="superclassName">NSSplitView</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">toggleCollapse:</string> - <string key="NS.object.0">id</string> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <string key="NS.key.0">toggleCollapse:</string> - <object class="IBActionInfo" key="NS.object.0"> - <string key="name">toggleCollapse:</string> - <string key="candidateClassName">id</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWSplitView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWTransparentScrollView</string> - <string key="superclassName">NSScrollView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWTransparentScrollView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">BWTransparentScroller</string> - <string key="superclassName">NSScroller</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/BWTransparentScroller.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSActionCell</string> - <string key="superclassName">NSCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <string key="superclassName">NSResponder</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="749297199"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="915418474"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="818190051"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSButton</string> - <string key="superclassName">NSControl</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSButton.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSButtonCell</string> - <string key="superclassName">NSActionCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSCell</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSControl</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="68211622"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSController</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSFormatter</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenu</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="315030118"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenuItem</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="203440835"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenuItemCell</string> - <string key="superclassName">NSButtonCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSMenuItemCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="749297199"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="915418474"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="818190051"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="68211622"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <reference key="sourceIdentifier" ref="315030118"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="124846695"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="498538215"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="79203157"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSError.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">PSMTabBar.framework/Headers/PSMTabBarCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">PSMTabBar.framework/Headers/PSMTabBarControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">PrintCore.framework/Headers/PDEPluginInterface.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderControl.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">ShortcutRecorder.framework/Headers/SRValidator.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebDownload.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebEditingDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebFrameLoadDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebJavaPlugIn.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebPlugin.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebPluginContainer.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebPolicyDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebResourceLoadDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebScriptObject.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">WebKit.framework/Headers/WebUIDelegate.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSOutlineView</string> - <string key="superclassName">NSTableView</string> - <reference key="sourceIdentifier" ref="124846695"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSPanel</string> - <string key="superclassName">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPanel.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSPopUpButton</string> - <string key="superclassName">NSButton</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPopUpButton.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSPopUpButtonCell</string> - <string key="superclassName">NSMenuItemCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSPopUpButtonCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSProgressIndicator</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSProgressIndicator.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSResponder</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSResponder</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSScrollView</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSScrollView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSScroller</string> - <string key="superclassName">NSControl</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSScroller.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSSecureTextField</string> - <string key="superclassName">NSTextField</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSSecureTextField.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSSplitView</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSSplitView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTabView</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTabView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTabViewItem</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTabViewItem.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTableColumn</string> - <string key="superclassName">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTableColumn.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTableView</string> - <string key="superclassName">NSControl</string> - <reference key="sourceIdentifier" ref="498538215"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSText</string> - <string key="superclassName">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSText.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextField</string> - <string key="superclassName">NSControl</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextFieldCell</string> - <string key="superclassName">NSActionCell</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSTextView</string> - <string key="superclassName">NSText</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSUserDefaultsController</string> - <string key="superclassName">NSController</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSUserDefaultsController.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <reference key="sourceIdentifier" ref="203440835"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <string key="superclassName">NSResponder</string> - <reference key="sourceIdentifier" ref="79203157"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/NSView+BWAdditions.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <string key="superclassName">NSResponder</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBFrameworkSource</string> - <string key="minorKey">BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h</string> - </object> - </object> - </object> - </object> - <int key="IBDocument.localizationMode">0</int> - <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <integer value="1050" key="NS.object.0"/> - </object> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <integer value="1050" key="NS.object.0"/> - </object> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> - <integer value="3000" key="NS.object.0"/> - </object> - <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> - <string key="IBDocument.LastKnownRelativeProjectPath">../../sequel-pro.xcodeproj</string> - <int key="IBDocument.defaultPropertyAccessControl">3</int> - <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>KeyTemplate</string> - <string>NSActionTemplate</string> - <string>NSMenuCheckmark</string> - <string>NSMenuMixedState</string> - <string>NSSwitch</string> - <string>button_edit</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>{16, 8}</string> - <string>{10, 10}</string> - <string>{9, 8}</string> - <string>{7, 2}</string> - <string>{15, 15}</string> - <string>{32, 23}</string> - </object> - </object> - </data> + <data> + <int key="IBDocument.SystemTarget">1050</int> + <string key="IBDocument.SystemVersion">11D50b</string> + <string key="IBDocument.InterfaceBuilderVersion">851</string> + <string key="IBDocument.AppKitVersion">1138.32</string> + <string key="IBDocument.HIToolboxVersion">568.00</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.brandonwalkin.BWToolkit</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>851</string> + <string>1.2.5</string> + </object> + </object> + <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="5433"/> + </object> + <object class="NSArray" key="IBDocument.PluginDependencies"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.brandonwalkin.BWToolkit</string> + </object> + <object class="NSMutableDictionary" key="IBDocument.Metadata"> + <string key="NS.key.0">PluginDependencyRecalculationVersion</string> + <integer value="1" key="NS.object.0"/> + </object> + <object class="NSMutableArray" key="IBDocument.RootObjects" id="584594810"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomObject" id="545410097"> + <string key="NSClassName">SPConnectionController</string> + </object> + <object class="NSCustomObject" id="547391009"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="292263310"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSCustomView" id="733821228"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="BWSplitView" id="616749187"> + <reference key="NSNextResponder" ref="733821228"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="BWCustomView" id="551584428"> + <reference key="NSNextResponder" ref="616749187"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSScrollView" id="524598165"> + <reference key="NSNextResponder" ref="551584428"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSClipView" id="233523429"> + <reference key="NSNextResponder" ref="524598165"/> + <int key="NSvFlags">2304</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTableView" id="1012579052"> + <reference key="NSNextResponder" ref="233523429"/> + <int key="NSvFlags">4352</int> + <string key="NSFrameSize">{202, 450}</string> + <reference key="NSSuperview" ref="233523429"/> + <bool key="NSEnabled">YES</bool> + <object class="_NSCornerView" key="NSCornerView"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{-26, 0}, {16, 17}}</string> + </object> + <object class="NSMutableArray" key="NSTableColumns"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTableColumn" id="131458815"> + <double key="NSWidth">199</double> + <double key="NSMinWidth">40</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75628096</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">Favorites</string> + <object class="NSFont" key="NSSupport" id="26"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">11</double> + <int key="NSfFlags">3088</int> + </object> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">headerTextColor</string> + <object class="NSColor" key="NSColor" id="643097066"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="93569184"> + <int key="NSCellFlags">69336641</int> + <int key="NSCellFlags2">137216</int> + <string key="NSContents">Text Cell</string> + <reference key="NSSupport" ref="26"/> + <reference key="NSControlView" ref="1012579052"/> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + <object class="NSColorSpace" key="NSCustomColorSpace" id="886601921"> + <int key="NSID">2</int> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="434026568"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <reference key="NSColor" ref="643097066"/> + </object> + </object> + <int key="NSResizingMask">1</int> + <bool key="NSIsResizeable">YES</bool> + <bool key="NSIsEditable">YES</bool> + <reference key="NSTableView" ref="1012579052"/> + </object> + </object> + <double key="NSIntercellSpacingWidth">3</double> + <double key="NSIntercellSpacingHeight">2</double> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">_sourceListBackgroundColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">alternateSelectedControlColor</string> + <object class="NSColor" key="NSColor" id="205208843"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MCAwIDEAA</bytes> + </object> + </object> + </object> + <object class="NSColor" key="NSGridColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">gridColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + </object> + </object> + <double key="NSRowHeight">17</double> + <int key="NSTvFlags">373293056</int> + <reference key="NSDelegate"/> + <reference key="NSDataSource"/> + <int key="NSColumnAutoresizingStyle">5</int> + <int key="NSDraggingSourceMaskForLocal">15</int> + <int key="NSDraggingSourceMaskForNonLocal">0</int> + <bool key="NSAllowsTypeSelect">YES</bool> + <int key="NSTableViewSelectionHighlightStyle">1</int> + <int key="NSTableViewDraggingDestinationStyle">1</int> + <int key="NSTableViewGroupRowStyle">1</int> + </object> + </object> + <string key="NSFrameSize">{202, 450}</string> + <reference key="NSSuperview" ref="524598165"/> + <reference key="NSDocView" ref="1012579052"/> + <object class="NSColor" key="NSBGColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC44ODMwNjQ1MDg0AA</bytes> + </object> + <int key="NScvFlags">4</int> + </object> + <object class="NSScroller" id="533108700"> + <reference key="NSNextResponder" ref="524598165"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{229, 1}, {15, 524}}</string> + <reference key="NSSuperview" ref="524598165"/> + <reference key="NSTarget" ref="524598165"/> + <string key="NSAction">_doScroller:</string> + <double key="NSPercent">0.99812382459640503</double> + </object> + <object class="NSScroller" id="802793151"> + <reference key="NSNextResponder" ref="524598165"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{1, 525}, {228, 15}}</string> + <reference key="NSSuperview" ref="524598165"/> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="524598165"/> + <string key="NSAction">_doScroller:</string> + <double key="NSPercent">0.99590158462524414</double> + </object> + </object> + <string key="NSFrame">{{0, 24}, {202, 450}}</string> + <reference key="NSSuperview" ref="551584428"/> + <int key="NSsFlags">133680</int> + <reference key="NSVScroller" ref="533108700"/> + <reference key="NSHScroller" ref="802793151"/> + <reference key="NSContentView" ref="233523429"/> + <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes> + </object> + <object class="BWAnchoredButtonBar" id="805249222"> + <reference key="NSNextResponder" ref="551584428"/> + <int key="NSvFlags">290</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="BWAnchoredButton" id="642219827"> + <reference key="NSNextResponder" ref="805249222"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{30, -1}, {32, 24}}</string> + <reference key="NSSuperview" ref="805249222"/> + <bool key="NSEnabled">YES</bool> + <object class="BWAnchoredButtonCell" key="NSCell" id="179580583"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134348800</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="26"/> + <reference key="NSControlView" ref="642219827"/> + <int key="NSButtonFlags">147079423</int> + <int key="NSButtonFlags2">402653219</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">button_edit</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent">e</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="BWAnchoredPopUpButton" id="221133754"> + <reference key="NSNextResponder" ref="805249222"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-1, -1}, {32, 24}}</string> + <reference key="NSSuperview" ref="805249222"/> + <bool key="NSEnabled">YES</bool> + <object class="BWAnchoredPopUpButtonCell" key="NSCell" id="270183415"> + <int key="NSCellFlags">-2076049856</int> + <int key="NSCellFlags2">134350848</int> + <object class="NSFont" key="NSSupport" id="951888633"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="221133754"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">163</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + <object class="NSMenuItem" key="NSMenuItem" id="751753648"> + <reference key="NSMenu" ref="949612237"/> + <bool key="NSIsHidden">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <int key="NSState">1</int> + <object class="NSCustomResource" key="NSImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSActionTemplate</string> + </object> + <object class="NSCustomResource" key="NSOnImage" id="1022504326"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="329345764"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + </object> + <bool key="NSMenuItemRespectAlignment">YES</bool> + <object class="NSMenu" key="NSMenu" id="949612237"> + <string key="NSTitle">OtherViews</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="751753648"/> + <object class="NSMenuItem" id="623685715"> + <reference key="NSMenu" ref="949612237"/> + <string key="NSTitle">Sort By</string> + <string key="NSKeyEquiv"/> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + <object class="NSMenu" key="NSSubmenu" id="455108754"> + <string key="NSTitle">Sort By</string> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="536740264"> + <reference key="NSMenu" ref="455108754"/> + <string key="NSTitle">Name</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + </object> + <object class="NSMenuItem" id="965148975"> + <reference key="NSMenu" ref="455108754"/> + <string key="NSTitle">Host</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + </object> + <object class="NSMenuItem" id="997359603"> + <reference key="NSMenu" ref="455108754"/> + <string key="NSTitle">Type</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + </object> + <object class="NSMenuItem" id="43427774"> + <reference key="NSMenu" ref="455108754"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + </object> + <object class="NSMenuItem" id="513442721"> + <reference key="NSMenu" ref="455108754"/> + <string key="NSTitle">Reverse Sort Order</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + <string key="NSAction">_popUpItemAction:</string> + <reference key="NSTarget" ref="270183415"/> + </object> + </object> + </object> + </object> + </object> + </object> + <int key="NSSelectedIndex">1</int> + <bool key="NSPullDown">YES</bool> + <int key="NSPreferredEdge">1</int> + <bool key="NSUsesItemFromMenu">YES</bool> + <bool key="NSAltersState">YES</bool> + <int key="NSArrowPosition">2</int> + </object> + </object> + </object> + <string key="NSFrame">{{0, 1}, {202, 23}}</string> + <reference key="NSSuperview" ref="551584428"/> + <bool key="BWABBIsResizable">YES</bool> + <bool key="BWABBIsAtBottom">YES</bool> + <bool key="BWABBHandleIsRightAligned">NO</bool> + <int key="BWABBSelectedIndex">0</int> + </object> + </object> + <string key="NSFrameSize">{202, 475}</string> + <reference key="NSSuperview" ref="616749187"/> + <string key="NSClassName">NSView</string> + </object> + <object class="BWCustomView" id="563806501"> + <reference key="NSNextResponder" ref="616749187"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSScrollView" id="1058735001"> + <reference key="NSNextResponder" ref="563806501"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSClipView" id="954788335"> + <reference key="NSNextResponder" ref="1058735001"/> + <int key="NSvFlags">2304</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomView" id="315390047"> + <reference key="NSNextResponder" ref="954788335"/> + <int key="NSvFlags">258</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomView" id="735564334"> + <reference key="NSNextResponder" ref="315390047"/> + <int key="NSvFlags">301</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTabView" id="134031646"> + <reference key="NSNextResponder" ref="735564334"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{13, 25}, {420, 417}}</string> + <reference key="NSSuperview" ref="735564334"/> + <object class="NSMutableArray" key="NSTabViewItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTabViewItem" id="253369045"> + <string key="NSIdentifier">1</string> + <object class="NSView" key="NSView" id="32802602"> + <reference key="NSNextResponder" ref="134031646"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomView" id="233374444"> + <reference key="NSNextResponder" ref="32802602"/> + <int key="NSvFlags">269</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSButton" id="508687946"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{108, 10}, {251, 18}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="184523755"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Connect using SSL</string> + <object class="NSFont" key="NSSupport" id="807120225"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">13</double> + <int key="NSfFlags">1040</int> + </object> + <reference key="NSControlView" ref="508687946"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <object class="NSCustomResource" key="NSNormalImage" id="804903244"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSSwitch</string> + </object> + <object class="NSButtonImageSource" key="NSAlternateImage" id="791350007"> + <string key="NSImageName">NSSwitch</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="644973446"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 174}, {247, 22}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="859982751"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="644973446"/> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSColor" key="NSBackgroundColor" id="211632616"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <object class="NSColor" key="NSColor" id="402194341"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="395378299"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textColor</string> + <reference key="NSColor" ref="643097066"/> + </object> + </object> + </object> + <object class="NSTextField" id="786098118"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 176}, {98, 17}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="393023945"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Host:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="786098118"/> + <object class="NSColor" key="NSBackgroundColor" id="644242225"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <object class="NSColor" key="NSColor" id="355746054"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="810791200"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 208}, {247, 22}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1040289660"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="810791200"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="445567924"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 210}, {98, 17}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="485990188"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Name:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="445567924"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="978463433"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 140}, {247, 22}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="925313159"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="978463433"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="987440606"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 142}, {98, 17}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="377431100"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Username:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="987440606"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="211629203"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 106}, {247, 22}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="646391991"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="211629203"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="105635377"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 108}, {98, 17}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="785119002"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Password:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="105635377"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="950381827"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 72}, {247, 22}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="925102591"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="950381827"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="788113046"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 74}, {98, 17}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="441978581"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Database:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="788113046"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="1013612483"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 38}, {247, 22}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1003825843"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">3306</string> + <reference key="NSControlView" ref="1013612483"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="910543023"> + <reference key="NSNextResponder" ref="233374444"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 40}, {98, 17}}</string> + <reference key="NSSuperview" ref="233374444"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="588889019"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Port:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="910543023"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrame">{{6, 131}, {377, 257}}</string> + <reference key="NSSuperview" ref="32802602"/> + <string key="NSClassName">NSView</string> + </object> + <object class="NSCustomView" id="31135925"> + <reference key="NSNextResponder" ref="32802602"/> + <int key="NSvFlags">268</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="104955330"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-3, 15}, {107, 17}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="69612386"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">CA Cert:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="104955330"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="638710413"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{109, 13}, {220, 22}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="791857368"> + <int key="NSCellFlags">-2073952703</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">none set</string> + <reference key="NSControlView" ref="638710413"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + <reference key="NSCustomColorSpace" ref="886601921"/> + </object> + </object> + </object> + <object class="NSButton" id="839299955"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 12}, {29, 24}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="1013426677"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="839299955"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <object class="NSCustomResource" key="NSNormalImage" id="22774617"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">KeyTemplate</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSTextField" id="684819179"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-3, 49}, {107, 17}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="371333119"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Certificate:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="684819179"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="950540175"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{109, 47}, {220, 22}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="196185392"> + <int key="NSCellFlags">-2073952703</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">none set</string> + <reference key="NSControlView" ref="950540175"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + <reference key="NSCustomColorSpace" ref="886601921"/> + </object> + </object> + </object> + <object class="NSButton" id="945929172"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 46}, {29, 24}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="1000000271"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="945929172"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <reference key="NSNormalImage" ref="22774617"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSTextField" id="1034069158"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-3, 83}, {107, 17}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="943522732"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Key File:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="1034069158"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="679511995"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{109, 81}, {220, 22}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="650760201"> + <int key="NSCellFlags">-2073952703</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">none set</string> + <reference key="NSControlView" ref="679511995"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41MDQwMzIyNTQyAA</bytes> + </object> + </object> + </object> + <object class="NSButton" id="586011242"> + <reference key="NSNextResponder" ref="31135925"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 80}, {29, 24}}</string> + <reference key="NSSuperview" ref="31135925"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="85329089"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="586011242"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <reference key="NSNormalImage" ref="22774617"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + </object> + <string key="NSFrame">{{6, 28}, {377, 104}}</string> + <reference key="NSSuperview" ref="32802602"/> + <string key="NSClassName">NSView</string> + </object> + </object> + <string key="NSFrame">{{10, 33}, {400, 371}}</string> + <reference key="NSSuperview" ref="134031646"/> + </object> + <string key="NSLabel">Standard</string> + <reference key="NSColor" ref="644242225"/> + <reference key="NSTabView" ref="134031646"/> + </object> + <object class="NSTabViewItem" id="517771995"> + <string key="NSIdentifier">2</string> + <object class="NSView" key="NSView" id="962671066"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomView" id="394302879"> + <reference key="NSNextResponder" ref="962671066"/> + <int key="NSvFlags">269</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSButton" id="16421625"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{108, 11}, {251, 18}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="972347112"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Connect using SSL</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="16421625"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <reference key="NSNormalImage" ref="804903244"/> + <reference key="NSAlternateImage" ref="791350007"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="68541783"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 141}, {247, 22}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="279442436"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="68541783"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="607362814"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 143}, {98, 17}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="798396187"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Username:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="607362814"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="512253301"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 107}, {247, 22}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="251554254"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="512253301"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="789391730"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 109}, {98, 17}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="797213431"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Password:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="789391730"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="58217156"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 73}, {247, 22}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="185246669"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="58217156"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="745773732"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 75}, {98, 17}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="728524936"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Database:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="745773732"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="728228957"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 39}, {247, 22}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="299457759"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="728228957"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="591324856"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 41}, {98, 17}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="317867885"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Socket:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="591324856"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="474825058"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 175}, {247, 22}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="684614893"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="474825058"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="459734357"> + <reference key="NSNextResponder" ref="394302879"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 177}, {98, 17}}</string> + <reference key="NSSuperview" ref="394302879"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="352725628"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Name:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="459734357"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrame">{{6, 164}, {377, 224}}</string> + <reference key="NSSuperview" ref="962671066"/> + <string key="NSClassName">NSView</string> + </object> + <object class="NSCustomView" id="866600720"> + <reference key="NSNextResponder" ref="962671066"/> + <int key="NSvFlags">268</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="98826968"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-3, 15}, {107, 17}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="730590428"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">CA Cert:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="98826968"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="484504415"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{109, 13}, {220, 22}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="169093017"> + <int key="NSCellFlags">-2073952703</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">none set</string> + <reference key="NSControlView" ref="484504415"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + <reference key="NSCustomColorSpace" ref="886601921"/> + </object> + </object> + </object> + <object class="NSButton" id="680939705"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 12}, {29, 24}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="308087760"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="680939705"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <reference key="NSNormalImage" ref="22774617"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSTextField" id="521125104"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-3, 49}, {107, 17}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1025158673"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Certificate:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="521125104"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="216069484"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{109, 47}, {220, 22}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="276609847"> + <int key="NSCellFlags">-2073952703</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">none set</string> + <reference key="NSControlView" ref="216069484"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + <reference key="NSCustomColorSpace" ref="886601921"/> + </object> + </object> + </object> + <object class="NSButton" id="988136593"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 46}, {29, 24}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="559442548"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="988136593"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <reference key="NSNormalImage" ref="22774617"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSTextField" id="57862599"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{-3, 83}, {107, 17}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="357553281"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Key File:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="57862599"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="51601157"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{109, 81}, {220, 22}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="575863174"> + <int key="NSCellFlags">-2073952703</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">none set</string> + <reference key="NSControlView" ref="51601157"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41MDQwMzIyNTQyAA</bytes> + </object> + </object> + </object> + <object class="NSButton" id="237955939"> + <reference key="NSNextResponder" ref="866600720"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 80}, {29, 24}}</string> + <reference key="NSSuperview" ref="866600720"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="167444868"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="237955939"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <reference key="NSNormalImage" ref="22774617"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + </object> + <string key="NSFrame">{{6, 61}, {377, 104}}</string> + <reference key="NSSuperview" ref="962671066"/> + <string key="NSClassName">NSView</string> + </object> + </object> + <string key="NSFrame">{{10, 33}, {400, 371}}</string> + </object> + <string key="NSLabel">Socket</string> + <reference key="NSColor" ref="644242225"/> + <reference key="NSTabView" ref="134031646"/> + </object> + <object class="NSTabViewItem" id="591192172"> + <string key="NSIdentifier">Item 2</string> + <object class="NSView" key="NSView" id="159800861"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSCustomView" id="326102394"> + <reference key="NSNextResponder" ref="159800861"/> + <int key="NSvFlags">269</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextField" id="1030226140"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 299}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="933547668"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="1030226140"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="615962367"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 301}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="547674489"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">MySQL Host:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="615962367"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="358903996"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 265}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="869330413"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="358903996"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="189856761"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 267}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="218707841"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Username:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="189856761"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="187191991"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 231}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="737530250"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="187191991"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="71258292"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 233}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1056521404"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Password:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="71258292"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="1000646962"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 197}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="289965133"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="1000646962"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="632758915"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 199}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="664433389"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Database:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="632758915"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="1049720725"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 163}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="615536496"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">3306</string> + <reference key="NSControlView" ref="1049720725"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="914345743"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{10, 165}, {95, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="265944034"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Port:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="914345743"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="844385120"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 115}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="505035309"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="844385120"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="81612279"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{10, 117}, {95, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="386177793"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">SSH Host:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="81612279"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="790983747"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 81}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="347555313"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="790983747"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="558754343"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 83}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="222275233"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">SSH User:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="558754343"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="21480939"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 47}, {219, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="944931136"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="21480939"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="627782947"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 49}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="369035253"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">SSH Password:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="627782947"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="692784990"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 13}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="850057181"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="692784990"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="984151006"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 15}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="563972303"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">SSH Port:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="984151006"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="1022082829"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 333}, {247, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="833542503"> + <int key="NSCellFlags">-1804468671</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <string key="NSPlaceholderString">optional</string> + <reference key="NSControlView" ref="1022082829"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <reference key="NSTextColor" ref="395378299"/> + </object> + </object> + <object class="NSTextField" id="761323775"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 335}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="906889126"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">Name:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="761323775"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSButton" id="183948302"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{328, 46}, {29, 24}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="510891456"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="183948302"/> + <int key="NSButtonFlags">-922992385</int> + <int key="NSButtonFlags2">34</int> + <reference key="NSNormalImage" ref="22774617"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + </object> + <object class="NSTextField" id="906103858"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{7, 49}, {98, 17}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="882604644"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">71304192</int> + <string key="NSContents">SSH Key:</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="906103858"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSTextField" id="180145997"> + <reference key="NSNextResponder" ref="326102394"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{110, 47}, {198, 22}}</string> + <reference key="NSSuperview" ref="326102394"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="13940444"> + <int key="NSCellFlags">-2076049856</int> + <int key="NSCellFlags2">272631296</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="180145997"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="211632616"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC40OTU5Njc3NDU4AA</bytes> + </object> + </object> + </object> + </object> + <string key="NSFrame">{{6, 6}, {377, 382}}</string> + <reference key="NSSuperview" ref="159800861"/> + <string key="NSClassName">NSView</string> + </object> + </object> + <string key="NSFrame">{{10, 33}, {400, 371}}</string> + </object> + <string key="NSLabel">SSH</string> + <reference key="NSColor" ref="644242225"/> + <reference key="NSTabView" ref="134031646"/> + </object> + </object> + <reference key="NSSelectedTabViewItem" ref="253369045"/> + <reference key="NSFont" ref="807120225"/> + <int key="NSTvFlags">0</int> + <bool key="NSAllowTruncatedLabels">YES</bool> + <bool key="NSDrawsBackground">YES</bool> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="32802602"/> + </object> + </object> + <object class="NSButton" id="460592307"> + <reference key="NSNextResponder" ref="735564334"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{285, -3}, {147, 32}}</string> + <reference key="NSSuperview" ref="735564334"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="424756162"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Connect</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="460592307"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSButton" id="476973680"> + <reference key="NSNextResponder" ref="735564334"/> + <int key="NSvFlags">289</int> + <string key="NSFrame">{{93, -3}, {192, 32}}</string> + <reference key="NSSuperview" ref="735564334"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="220047154"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Add to Favorites</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="476973680"/> + <int key="NSButtonFlags">-2038284033</int> + <int key="NSButtonFlags2">402653313</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent">a</string> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSProgressIndicator" id="575228526"> + <reference key="NSNextResponder" ref="735564334"/> + <int key="NSvFlags">1316</int> + <object class="NSPSMatrix" key="NSDrawMatrix"/> + <string key="NSFrame">{{20, 7}, {16, 16}}</string> + <reference key="NSSuperview" ref="735564334"/> + <int key="NSpiFlags">28938</int> + <double key="NSMinValue">16</double> + <double key="NSMaxValue">100</double> + </object> + <object class="NSTextField" id="549907703"> + <reference key="NSNextResponder" ref="735564334"/> + <int key="NSvFlags">-2147483356</int> + <string key="NSFrame">{{41, 7}, {252, 17}}</string> + <reference key="NSSuperview" ref="735564334"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="321846713"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Connecting...</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="549907703"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + <object class="NSButton" id="990947983"> + <reference key="NSNextResponder" ref="735564334"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{17, 1}, {25, 25}}</string> + <reference key="NSSuperview" ref="735564334"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="757039715"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="990947983"/> + <int key="NSButtonFlags">-2038415105</int> + <int key="NSButtonFlags2">33</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + </object> + <string key="NSFrame">{{116, 2}, {446, 436}}</string> + <reference key="NSSuperview" ref="315390047"/> + <string key="NSClassName">NSCustomView</string> + </object> + </object> + <string key="NSFrameSize">{679, 442}</string> + <reference key="NSSuperview" ref="954788335"/> + <string key="NSClassName">SPFlippedView</string> + </object> + </object> + <string key="NSFrameSize">{679, 443}</string> + <reference key="NSSuperview" ref="1058735001"/> + <reference key="NSDocView" ref="315390047"/> + <reference key="NSBGColor" ref="644242225"/> + <int key="NScvFlags">4</int> + </object> + <object class="NSScroller" id="508899576"> + <reference key="NSNextResponder" ref="1058735001"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{664, 0}, {15, 453}}</string> + <reference key="NSSuperview" ref="1058735001"/> + <reference key="NSTarget" ref="1058735001"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">1</double> + <double key="NSPercent">0.99775278568267822</double> + </object> + <object class="NSScroller" id="108277656"> + <reference key="NSNextResponder" ref="1058735001"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{0, 453}, {664, 15}}</string> + <reference key="NSSuperview" ref="1058735001"/> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="1058735001"/> + <string key="NSAction">_doScroller:</string> + <double key="NSPercent">0.97838616371154785</double> + </object> + </object> + <string key="NSFrameSize">{679, 443}</string> + <reference key="NSSuperview" ref="563806501"/> + <int key="NSsFlags">133680</int> + <reference key="NSVScroller" ref="508899576"/> + <reference key="NSHScroller" ref="108277656"/> + <reference key="NSContentView" ref="954788335"/> + </object> + <object class="NSTextField" id="570492783"> + <reference key="NSNextResponder" ref="563806501"/> + <int key="NSvFlags">266</int> + <string key="NSFrame">{{17, 451}, {645, 17}}</string> + <reference key="NSSuperview" ref="563806501"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="607446274"> + <int key="NSCellFlags">68288064</int> + <int key="NSCellFlags2">138413056</int> + <string key="NSContents">Enter connection details below, or choose a favorite</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">LucidaGrande-Bold</string> + <double key="NSSize">13</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="570492783"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrame">{{203, 0}, {679, 475}}</string> + <reference key="NSSuperview" ref="616749187"/> + <string key="NSClassName">NSView</string> + </object> + </object> + <string key="NSFrameSize">{882, 475}</string> + <reference key="NSSuperview" ref="733821228"/> + <bool key="NSIsVertical">YES</bool> + <int key="NSDividerStyle">2</int> + <reference key="BWSVColor" ref="643097066"/> + <bool key="BWSVColorIsEnabled">NO</bool> + <object class="NSMutableDictionary" key="BWSVMinValues"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="1"/> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="80"/> + <integer value="445"/> + </object> + </object> + <object class="NSMutableDictionary" key="BWSVMaxValues"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys" id="0"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <object class="NSMutableDictionary" key="BWSVMinUnits"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="1"/> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <object class="NSMutableDictionary" key="BWSVMaxUnits"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="1"/> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="BWSVCollapsiblePopupSelection">0</int> + <bool key="BWSVDividerCanCollapse">NO</bool> + </object> + </object> + <string key="NSFrameSize">{882, 475}</string> + <string key="NSClassName">SPFlippedView</string> + </object> + <object class="NSWindowTemplate" id="958272936"> + <int key="NSWindowStyleMask">8223</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{439, 291}, {580, 320}}</string> + <int key="NSWTFlags">-469762048</int> + <string key="NSWindowTitle">Error Detail</string> + <string key="NSWindowClass">NSPanel</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> + <string key="NSWindowContentMinSize">{100, 100}</string> + <object class="NSView" key="NSWindowView" id="536120400"> + <reference key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="BWTransparentScrollView" id="699163511"> + <reference key="NSNextResponder" ref="536120400"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSClipView" id="547900823"> + <reference key="NSNextResponder" ref="699163511"/> + <int key="NSvFlags">2304</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextView" id="59706192"> + <reference key="NSNextResponder" ref="547900823"/> + <int key="NSvFlags">2322</int> + <string key="NSFrameSize">{578, 72}</string> + <reference key="NSSuperview" ref="547900823"/> + <object class="NSTextContainer" key="NSTextContainer" id="646915301"> + <object class="NSLayoutManager" key="NSLayoutManager"> + <object class="NSTextStorage" key="NSTextStorage"> + <object class="NSMutableString" key="NSString"> + <characters key="NS.bytes">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum Et harumd und lookum like Greek to me, dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda</characters> + </object> + <object class="NSMutableArray" key="NSAttributes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSDictionary"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSColor</string> + <string>NSFont</string> + <string>NSParagraphStyle</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSColor" id="491463784"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA</bytes> + </object> + <object class="NSFont"> + <string key="NSName">LucidaGrande</string> + <double key="NSSize">10</double> + <int key="NSfFlags">2832</int> + </object> + <object class="NSParagraphStyle"> + <int key="NSAlignment">3</int> + <object class="NSArray" key="NSTabStops"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSTextTab" id="823634743"> + <double key="NSLocation">0.0</double> + </object> + <object class="NSTextTab" id="713375536"> + <double key="NSLocation">56</double> + </object> + <object class="NSTextTab" id="999774917"> + <double key="NSLocation">112</double> + </object> + <object class="NSTextTab" id="634012080"> + <double key="NSLocation">168</double> + </object> + <object class="NSTextTab" id="782574576"> + <double key="NSLocation">224</double> + </object> + <object class="NSTextTab" id="19717301"> + <double key="NSLocation">280</double> + </object> + <object class="NSTextTab" id="937773658"> + <double key="NSLocation">336</double> + </object> + <object class="NSTextTab" id="219483472"> + <double key="NSLocation">392</double> + </object> + <object class="NSTextTab" id="878853441"> + <double key="NSLocation">448</double> + </object> + <object class="NSTextTab" id="618333087"> + <double key="NSLocation">504</double> + </object> + <object class="NSTextTab" id="820362010"> + <double key="NSLocation">560</double> + </object> + <object class="NSTextTab" id="470724251"> + <double key="NSLocation">616</double> + </object> + <object class="NSTextTab" id="56552689"> + <double key="NSLocation">672</double> + </object> + <object class="NSTextTab" id="65501475"> + <double key="NSLocation">728</double> + </object> + <object class="NSTextTab" id="469693015"> + <double key="NSLocation">784</double> + </object> + <object class="NSTextTab" id="334479669"> + <double key="NSLocation">840</double> + </object> + <object class="NSTextTab" id="367366098"> + <double key="NSLocation">896</double> + </object> + <object class="NSTextTab" id="11887200"> + <double key="NSLocation">952</double> + </object> + <object class="NSTextTab" id="613253918"> + <double key="NSLocation">1008</double> + </object> + <object class="NSTextTab" id="683900068"> + <double key="NSLocation">1064</double> + </object> + <object class="NSTextTab" id="640062352"> + <double key="NSLocation">1120</double> + </object> + <object class="NSTextTab" id="953428032"> + <double key="NSLocation">1176</double> + </object> + <object class="NSTextTab" id="916708773"> + <double key="NSLocation">1232</double> + </object> + <object class="NSTextTab" id="777694472"> + <double key="NSLocation">1288</double> + </object> + <object class="NSTextTab" id="193444438"> + <double key="NSLocation">1344</double> + </object> + <object class="NSTextTab" id="392872653"> + <double key="NSLocation">1400</double> + </object> + <object class="NSTextTab" id="459383765"> + <double key="NSLocation">1456</double> + </object> + <object class="NSTextTab" id="729563838"> + <double key="NSLocation">1512</double> + </object> + <object class="NSTextTab" id="18292341"> + <double key="NSLocation">1568</double> + </object> + <object class="NSTextTab" id="1007283588"> + <double key="NSLocation">1624</double> + </object> + <object class="NSTextTab" id="133675098"> + <double key="NSLocation">1680</double> + </object> + <object class="NSTextTab" id="841926084"> + <double key="NSLocation">1736</double> + </object> + </object> + </object> + </object> + </object> + <object class="NSDictionary"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSColor</string> + <string>NSFont</string> + <string>NSParagraphStyle</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="491463784"/> + <object class="NSFont"> + <string key="NSName">LucidaGrande-Bold</string> + <double key="NSSize">10</double> + <int key="NSfFlags">16</int> + </object> + <object class="NSParagraphStyle"> + <int key="NSAlignment">3</int> + <object class="NSArray" key="NSTabStops"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="823634743"/> + <reference ref="713375536"/> + <reference ref="999774917"/> + <reference ref="634012080"/> + <reference ref="782574576"/> + <reference ref="19717301"/> + <reference ref="937773658"/> + <reference ref="219483472"/> + <reference ref="878853441"/> + <reference ref="618333087"/> + <reference ref="820362010"/> + <reference ref="470724251"/> + <reference ref="56552689"/> + <reference ref="65501475"/> + <reference ref="469693015"/> + <reference ref="334479669"/> + <reference ref="367366098"/> + <reference ref="11887200"/> + <reference ref="613253918"/> + <reference ref="683900068"/> + <reference ref="640062352"/> + <reference ref="953428032"/> + <reference ref="916708773"/> + <reference ref="777694472"/> + <reference ref="193444438"/> + <reference ref="392872653"/> + <reference ref="459383765"/> + <reference ref="729563838"/> + <reference ref="18292341"/> + <reference ref="1007283588"/> + <reference ref="133675098"/> + <reference ref="841926084"/> + </object> + </object> + </object> + </object> + </object> + <object class="NSMutableData" key="NSAttributeInfo"> + <bytes key="NS.bytes">GQAEAQgADAEiAAcBhAQAA</bytes> + </object> + <nil key="NSDelegate"/> + </object> + <object class="NSMutableArray" key="NSTextContainers"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="646915301"/> + </object> + <int key="NSLMFlags">6</int> + <nil key="NSDelegate"/> + </object> + <reference key="NSTextView" ref="59706192"/> + <double key="NSWidth">578</double> + <int key="NSTCFlags">1</int> + </object> + <object class="NSTextViewSharedData" key="NSSharedData"> + <int key="NSFlags">100673541</int> + <int key="NSTextCheckingTypes">0</int> + <nil key="NSMarkedAttributes"/> + <reference key="NSBackgroundColor" ref="402194341"/> + <object class="NSDictionary" key="NSSelectedAttributes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSBackgroundColor</string> + <string>NSColor</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">selectedTextBackgroundColor</string> + <reference key="NSColor" ref="355746054"/> + </object> + <object class="NSColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">selectedTextColor</string> + <reference key="NSColor" ref="643097066"/> + </object> + </object> + </object> + <reference key="NSInsertionColor" ref="643097066"/> + <object class="NSDictionary" key="NSLinkAttributes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSColor</string> + <string>NSUnderline</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="205208843"/> + <integer value="1"/> + </object> + </object> + <nil key="NSDefaultParagraphStyle"/> + <nil key="NSTextFinder"/> + <int key="NSPreferredTextFinderStyle">1</int> + </object> + <int key="NSTVFlags">6</int> + <string key="NSMaxSize">{1156, 10000000}</string> + <string key="NSMinize">{228, 0}</string> + <nil key="NSDelegate"/> + </object> + </object> + <string key="NSFrameSize">{578, 293}</string> + <reference key="NSSuperview" ref="699163511"/> + <reference key="NSNextKeyView" ref="59706192"/> + <reference key="NSDocView" ref="59706192"/> + <reference key="NSBGColor" ref="402194341"/> + <object class="NSCursor" key="NSCursor"> + <string key="NSHotSpot">{4, -5}</string> + <int key="NSCursorType">1</int> + </object> + <int key="NScvFlags">2</int> + </object> + <object class="BWTransparentScroller" id="79422493"> + <reference key="NSNextResponder" ref="699163511"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{566, 0}, {12, 293}}</string> + <reference key="NSSuperview" ref="699163511"/> + <bool key="NSEnabled">YES</bool> + <int key="NSArrowsLoc">2</int> + <reference key="NSTarget" ref="699163511"/> + <string key="NSAction">_doScroller:</string> + <double key="NSPercent">0.95705521106719971</double> + </object> + <object class="NSScroller" id="266224177"> + <reference key="NSNextResponder" ref="699163511"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{-100, -100}, {87, 18}}</string> + <reference key="NSSuperview" ref="699163511"/> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="699163511"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">1</double> + <double key="NSPercent">0.94565218687057495</double> + </object> + </object> + <string key="NSFrame">{{1, 20}, {578, 293}}</string> + <reference key="NSSuperview" ref="536120400"/> + <reference key="NSNextKeyView" ref="547900823"/> + <int key="NSsFlags">133648</int> + <reference key="NSVScroller" ref="79422493"/> + <reference key="NSHScroller" ref="266224177"/> + <reference key="NSContentView" ref="547900823"/> + </object> + </object> + <string key="NSFrameSize">{580, 320}</string> + <reference key="NSSuperview"/> + </object> + <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> + <string key="NSMinSize">{100, 119}</string> + <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> + <string key="NSFrameAutosaveName"/> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + <object class="NSUserDefaultsController" id="642702582"> + <bool key="NSSharedInstance">YES</bool> + </object> + <object class="NSMenu" id="9858888"> + <string key="NSTitle"/> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="471954922"> + <reference key="NSMenu" ref="9858888"/> + <string key="NSTitle">Edit Favorite...</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="1022504326"/> + <reference key="NSMixedImage" ref="329345764"/> + </object> + </object> + </object> + <object class="NSCustomView" id="567906875"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSButton" id="912885202"> + <reference key="NSNextResponder" ref="567906875"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{14, 14}, {273, 18}}</string> + <reference key="NSSuperview" ref="567906875"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="388136120"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Show hidden files</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="912885202"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <reference key="NSNormalImage" ref="804903244"/> + <reference key="NSAlternateImage" ref="791350007"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="44241774"> + <reference key="NSNextResponder" ref="567906875"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{2, 42}, {575, 34}}</string> + <reference key="NSSuperview" ref="567906875"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="1045018411"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">138674176</int> + <string key="NSContents">Choose a custom SSH key file to use with this connection. Note that standard locations like ~/.ssh are checked automatically, as are any files in your SSH configuration.</string> + <reference key="NSSupport" ref="951888633"/> + <reference key="NSControlView" ref="44241774"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrameSize">{579, 83}</string> + <string key="NSClassName">NSView</string> + </object> + <object class="NSCustomView" id="12066713"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSButton" id="388256324"> + <reference key="NSNextResponder" ref="12066713"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{14, 14}, {273, 18}}</string> + <reference key="NSSuperview" ref="12066713"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="844788897"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Show hidden files</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="388256324"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <reference key="NSNormalImage" ref="804903244"/> + <reference key="NSAlternateImage" ref="791350007"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="538839943"> + <reference key="NSNextResponder" ref="12066713"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{2, 42}, {575, 17}}</string> + <reference key="NSSuperview" ref="12066713"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="124352014"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">138674176</int> + <string key="NSContents">Please select the SSL key file to use when establishing a secure connection.</string> + <reference key="NSSupport" ref="951888633"/> + <reference key="NSControlView" ref="538839943"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrameSize">{579, 66}</string> + <string key="NSClassName">NSView</string> + </object> + <object class="NSCustomView" id="136328549"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSButton" id="103272364"> + <reference key="NSNextResponder" ref="136328549"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{14, 14}, {273, 18}}</string> + <reference key="NSSuperview" ref="136328549"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="20247014"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Show hidden files</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="103272364"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <reference key="NSNormalImage" ref="804903244"/> + <reference key="NSAlternateImage" ref="791350007"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="802544195"> + <reference key="NSNextResponder" ref="136328549"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{6, 42}, {576, 17}}</string> + <reference key="NSSuperview" ref="136328549"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="196059550"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">138674176</int> + <string key="NSContents">Please select the client SSL certificate file to use when establishing a secure connection.</string> + <reference key="NSSupport" ref="951888633"/> + <reference key="NSControlView" ref="802544195"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrameSize">{599, 66}</string> + <string key="NSClassName">NSView</string> + </object> + <object class="NSCustomView" id="3577372"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">274</int> + <object class="NSMutableArray" key="NSSubviews"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSButton" id="455655503"> + <reference key="NSNextResponder" ref="3577372"/> + <int key="NSvFlags">292</int> + <string key="NSFrame">{{14, 14}, {273, 18}}</string> + <reference key="NSSuperview" ref="3577372"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="609741956"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Show hidden files</string> + <reference key="NSSupport" ref="807120225"/> + <reference key="NSControlView" ref="455655503"/> + <int key="NSButtonFlags">1211912703</int> + <int key="NSButtonFlags2">2</int> + <reference key="NSNormalImage" ref="804903244"/> + <reference key="NSAlternateImage" ref="791350007"/> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + </object> + <object class="NSTextField" id="761812578"> + <reference key="NSNextResponder" ref="3577372"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{2, 42}, {575, 34}}</string> + <reference key="NSSuperview" ref="3577372"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="444474564"> + <int key="NSCellFlags">67239424</int> + <int key="NSCellFlags2">138674176</int> + <string key="NSContents">Please select the client SSL Certificate Authority certificate to use when establishing a secure connection. This must be the same as the server CA certificate.</string> + <reference key="NSSupport" ref="951888633"/> + <reference key="NSControlView" ref="761812578"/> + <reference key="NSBackgroundColor" ref="644242225"/> + <reference key="NSTextColor" ref="434026568"/> + </object> + </object> + </object> + <string key="NSFrameSize">{579, 83}</string> + <string key="NSClassName">NSView</string> + </object> + </object> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <object class="NSMutableArray" key="connectionRecords"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1012579052"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">4930</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">selectedIndex: type</string> + <reference key="source" ref="134031646"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="134031646"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">selectedIndex: type</string> + <string key="NSBinding">selectedIndex</string> + <string key="NSKeyPath">type</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">4992</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardConnectionFormContainer</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="233374444"/> + </object> + <int key="connectionID">5161</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">socketConnectionFormContainer</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="394302879"/> + </object> + <int key="connectionID">5163</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectionResizeContainer</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="735564334"/> + </object> + <int key="connectionID">5164</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="134031646"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5165</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sshConnectionFormContainer</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="326102394"/> + </object> + <int key="connectionID">5167</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: host</string> + <reference key="source" ref="644973446"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="644973446"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: host</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">host</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSValidatesImmediately</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <boolean value="YES"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5195</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: user</string> + <reference key="source" ref="978463433"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="978463433"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: user</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">user</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5199</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: password</string> + <reference key="source" ref="211629203"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="211629203"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: password</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">password</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5203</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: user</string> + <reference key="source" ref="68541783"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="68541783"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: user</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">user</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5231</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: password</string> + <reference key="source" ref="512253301"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="512253301"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: password</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">password</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5234</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: host</string> + <reference key="source" ref="1030226140"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1030226140"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: host</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">host</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5303</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: user</string> + <reference key="source" ref="358903996"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="358903996"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: user</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">user</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5307</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: password</string> + <reference key="source" ref="187191991"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="187191991"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: password</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">password</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5311</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sshHost</string> + <reference key="source" ref="844385120"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="844385120"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sshHost</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sshHost</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5323</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sshUser</string> + <reference key="source" ref="790983747"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="790983747"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sshUser</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sshUser</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5327</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">dataSource</string> + <reference key="source" ref="1012579052"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5341</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">editFavorites:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="642219827"/> + </object> + <int key="connectionID">5350</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">showHelp:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="990947983"/> + </object> + <int key="connectionID">5351</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">addToFavoritesButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="476973680"/> + </object> + <int key="connectionID">5357</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="644973446"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5358</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="978463433"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5359</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="211629203"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5360</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="950381827"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5361</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1013612483"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5362</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="68541783"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5363</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="512253301"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5364</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="58217156"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5365</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="728228957"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5366</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1030226140"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5367</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="358903996"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5368</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="187191991"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5369</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1000646962"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5370</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1049720725"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5371</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="844385120"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5372</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="790983747"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5373</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="21480939"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5374</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="692784990"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5375</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: name</string> + <reference key="source" ref="474825058"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="474825058"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: name</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">name</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5400</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="474825058"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5401</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="810791200"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5402</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: name</string> + <reference key="source" ref="1022082829"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1022082829"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: name</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">name</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5411</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: database</string> + <reference key="source" ref="1000646962"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1000646962"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: database</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">database</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5412</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: database</string> + <reference key="source" ref="58217156"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="58217156"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: database</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">database</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5413</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="1022082829"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5414</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: socket</string> + <reference key="source" ref="728228957"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="728228957"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: socket</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">socket</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5415</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: name</string> + <reference key="source" ref="810791200"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="810791200"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: name</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">name</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5416</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: database</string> + <reference key="source" ref="950381827"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="950381827"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: database</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">database</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5417</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: port</string> + <reference key="source" ref="1013612483"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1013612483"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: port</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">port</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>3306</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5418</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: port</string> + <reference key="source" ref="1049720725"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="1049720725"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: port</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">port</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>3306</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5419</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">progressIndicatorText</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="549907703"/> + </object> + <int key="connectionID">5425</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">progressIndicator</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="575228526"/> + </object> + <int key="connectionID">5426</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardPasswordField</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="211629203"/> + </object> + <int key="connectionID">5427</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">socketPasswordField</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="512253301"/> + </object> + <int key="connectionID">5428</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sshPasswordField</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="187191991"/> + </object> + <int key="connectionID">5429</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sshSSHPasswordField</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="21480939"/> + </object> + <int key="connectionID">5430</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">errorDetailText</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="59706192"/> + </object> + <int key="connectionID">5437</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">errorDetailWindow</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="958272936"/> + </object> + <int key="connectionID">5438</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">initiateConnection:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="460592307"/> + </object> + <int key="connectionID">5439</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">addFavorite:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="476973680"/> + </object> + <int key="connectionID">5443</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="460592307"/> + </object> + <int key="connectionID">5444</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sshSQLHostField</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="1030226140"/> + </object> + <int key="connectionID">5445</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardSQLHostField</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="644973446"/> + </object> + <int key="connectionID">5446</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectionSplitViewButtonBar</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="805249222"/> + </object> + <int key="connectionID">5448</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">helpButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="990947983"/> + </object> + <int key="connectionID">5458</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="958272936"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5461</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="59706192"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5462</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">nextKeyView</string> + <reference key="source" ref="68541783"/> + <reference key="destination" ref="512253301"/> + </object> + <int key="connectionID">5463</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">nextKeyView</string> + <reference key="source" ref="978463433"/> + <reference key="destination" ref="211629203"/> + </object> + <int key="connectionID">5464</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">nextKeyView</string> + <reference key="source" ref="358903996"/> + <reference key="destination" ref="187191991"/> + </object> + <int key="connectionID">5465</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">nextKeyView</string> + <reference key="source" ref="1012579052"/> + <reference key="destination" ref="134031646"/> + </object> + <int key="connectionID">5466</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">nextKeyView</string> + <reference key="source" ref="642219827"/> + <reference key="destination" ref="1012579052"/> + </object> + <int key="connectionID">5467</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="9858888"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5472</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">editFavorites:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="471954922"/> + </object> + <int key="connectionID">5473</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">menu</string> + <reference key="source" ref="1012579052"/> + <reference key="destination" ref="9858888"/> + </object> + <int key="connectionID">5474</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">sortFavorites:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="536740264"/> + </object> + <int key="connectionID">5487</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">sortFavorites:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="965148975"/> + </object> + <int key="connectionID">5488</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">sortFavorites:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="997359603"/> + </object> + <int key="connectionID">5489</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">reverseSortFavorites:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="513442721"/> + </object> + <int key="connectionID">5490</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">favoritesSortByMenuItem</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="623685715"/> + </object> + <int key="connectionID">5491</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sshSSHKeyButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="183948302"/> + </object> + <int key="connectionID">5494</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sshPassword</string> + <reference key="source" ref="21480939"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="21480939"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sshPassword</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sshPassword</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5504</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: sshKeyLocationEnabled</string> + <reference key="source" ref="627782947"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="627782947"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">hidden: sshKeyLocationEnabled</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">sshKeyLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5549</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sshKeyLocationEnabled</string> + <reference key="source" ref="183948302"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="183948302"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sshKeyLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sshKeyLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5551</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: sshKeyLocationEnabled</string> + <reference key="source" ref="21480939"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="21480939"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">hidden: sshKeyLocationEnabled</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">sshKeyLocationEnabled</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5559</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: sshKeyLocationEnabled</string> + <reference key="source" ref="906103858"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="906103858"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">hidden: sshKeyLocationEnabled</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">sshKeyLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + <string>NSValueTransformerName</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <string>NSNegateBoolean</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5561</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: sshKeyLocationEnabled</string> + <reference key="source" ref="180145997"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="180145997"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">hidden: sshKeyLocationEnabled</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">sshKeyLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + <string>NSValueTransformerName</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <string>NSNegateBoolean</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5562</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sshKeyLocation</string> + <reference key="source" ref="180145997"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="180145997"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sshKeyLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sshKeyLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSContinuouslyUpdatesValue</string> + <boolean value="YES" key="NS.object.0"/> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5563</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sshKeyLocation</string> + <reference key="source" ref="180145997"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="180145997"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sshKeyLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sshKeyLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5570</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sshKeyLocationHelp</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="567906875"/> + </object> + <int key="connectionID">5579</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectionDetailsScrollView</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="1058735001"/> + </object> + <int key="connectionID">5592</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardConnectionSSLDetailsContainer</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="31135925"/> + </object> + <int key="connectionID">5620</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: useSSL</string> + <reference key="source" ref="508687946"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="508687946"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: useSSL</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">useSSL</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5627</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sslCACertFileLocation</string> + <reference key="source" ref="638710413"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="638710413"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sslCACertFileLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sslCACertFileLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5637</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sslCertificateFileLocation</string> + <reference key="source" ref="950540175"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="950540175"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sslCertificateFileLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sslCertificateFileLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5639</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sslKeyFileLocation</string> + <reference key="source" ref="679511995"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="679511995"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sslKeyFileLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sslKeyFileLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5641</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: useSSL</string> + <reference key="source" ref="31135925"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="31135925"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">hidden: useSSL</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">useSSL</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + <string>NSValueTransformerName</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <string>NSNegateBoolean</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5649</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateSSLInterface:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="508687946"/> + </object> + <int key="connectionID">5651</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="183948302"/> + </object> + <int key="connectionID">5661</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="586011242"/> + </object> + <int key="connectionID">5662</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="945929172"/> + </object> + <int key="connectionID">5663</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="839299955"/> + </object> + <int key="connectionID">5664</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardSSLKeyFileButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="586011242"/> + </object> + <int key="connectionID">5665</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardSSLCertificateButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="945929172"/> + </object> + <int key="connectionID">5666</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">standardSSLCACertButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="839299955"/> + </object> + <int key="connectionID">5667</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sslKeyFileLocationHelp</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="12066713"/> + </object> + <int key="connectionID">5671</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslKeyFileLocationEnabled</string> + <reference key="source" ref="586011242"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="586011242"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslKeyFileLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslKeyFileLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5673</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCertificateFileLocationEnabled</string> + <reference key="source" ref="945929172"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="945929172"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCertificateFileLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCertificateFileLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5677</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCACertFileLocationEnabled</string> + <reference key="source" ref="839299955"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="839299955"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCACertFileLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCACertFileLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5679</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sslCACertLocationHelp</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="3577372"/> + </object> + <int key="connectionID">5686</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">sslCertificateLocationHelp</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="136328549"/> + </object> + <int key="connectionID">5687</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCertificateFileLocationEnabled</string> + <reference key="source" ref="988136593"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="988136593"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCertificateFileLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCertificateFileLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5707</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sslCertificateFileLocation</string> + <reference key="source" ref="216069484"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="216069484"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sslCertificateFileLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sslCertificateFileLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5708</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">hidden: useSSL</string> + <reference key="source" ref="866600720"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="866600720"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">hidden: useSSL</string> + <string key="NSBinding">hidden</string> + <string key="NSKeyPath">useSSL</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + <string>NSValueTransformerName</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <integer value="1"/> + <string>NSNegateBoolean</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5710</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslKeyFileLocationEnabled</string> + <reference key="source" ref="237955939"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="237955939"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslKeyFileLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslKeyFileLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5711</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sslCACertFileLocation</string> + <reference key="source" ref="484504415"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="484504415"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sslCACertFileLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sslCACertFileLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5712</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">toolTip: sslKeyFileLocation</string> + <reference key="source" ref="51601157"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="51601157"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">toolTip: sslKeyFileLocation</string> + <string key="NSBinding">toolTip</string> + <string key="NSKeyPath">sslKeyFileLocation</string> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5714</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCACertFileLocationEnabled</string> + <reference key="source" ref="680939705"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="680939705"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCACertFileLocationEnabled</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCACertFileLocationEnabled</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5715</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="237955939"/> + </object> + <int key="connectionID">5717</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="680939705"/> + </object> + <int key="connectionID">5718</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">chooseKeyLocation:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="988136593"/> + </object> + <int key="connectionID">5719</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: useSSL</string> + <reference key="source" ref="16421625"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="16421625"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: useSSL</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">useSSL</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSMultipleValuesPlaceholder</string> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5722</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateSSLInterface:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="16421625"/> + </object> + <int key="connectionID">5723</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">socketConnectionSSLDetailsContainer</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="866600720"/> + </object> + <int key="connectionID">5724</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">socketSSLCACertButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="680939705"/> + </object> + <int key="connectionID">5725</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">socketSSLCertificateButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="988136593"/> + </object> + <int key="connectionID">5726</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">socketSSLKeyFileButton</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="237955939"/> + </object> + <int key="connectionID">5727</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCACertFileLocation</string> + <reference key="source" ref="638710413"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="638710413"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCACertFileLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCACertFileLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSNullPlaceholder</string> + <string key="NS.object.0">none set</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5730</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCertificateFileLocation</string> + <reference key="source" ref="950540175"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="950540175"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCertificateFileLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCertificateFileLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSNullPlaceholder</string> + <string key="NS.object.0">none set</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5731</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslKeyFileLocation</string> + <reference key="source" ref="679511995"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="679511995"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslKeyFileLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslKeyFileLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSNullPlaceholder</string> + <string key="NS.object.0">none set</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5732</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslKeyFileLocation</string> + <reference key="source" ref="51601157"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="51601157"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslKeyFileLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslKeyFileLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSNullPlaceholder</string> + <string key="NS.object.0">none set</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5733</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCACertFileLocation</string> + <reference key="source" ref="484504415"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="484504415"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCACertFileLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCACertFileLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSNullPlaceholder</string> + <string key="NS.object.0">none set</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5734</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sslCertificateFileLocation</string> + <reference key="source" ref="216069484"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="216069484"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sslCertificateFileLocation</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sslCertificateFileLocation</string> + <object class="NSDictionary" key="NSOptions"> + <string key="NS.key.0">NSNullPlaceholder</string> + <string key="NS.object.0">none set</string> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5735</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: sshPort</string> + <reference key="source" ref="692784990"/> + <reference key="destination" ref="545410097"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="692784990"/> + <reference key="NSDestination" ref="545410097"/> + <string key="NSLabel">value: sshPort</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">sshPort</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSContinuouslyUpdatesValue</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <boolean value="YES"/> + <string>optional</string> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5737</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">favoritesTable</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="1012579052"/> + </object> + <int key="connectionID">5738</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectionView</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="733821228"/> + </object> + <int key="connectionID">5740</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="616749187"/> + <reference key="destination" ref="545410097"/> + </object> + <int key="connectionID">5744</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">connectionSplitView</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="616749187"/> + </object> + <int key="connectionID">5745</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> + <reference key="source" ref="912885202"/> + <reference key="destination" ref="642702582"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="912885202"/> + <reference key="NSDestination" ref="642702582"/> + <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5754</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateKeyLocationFileVisibility:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="912885202"/> + </object> + <int key="connectionID">5755</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> + <reference key="source" ref="388256324"/> + <reference key="destination" ref="642702582"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="388256324"/> + <reference key="NSDestination" ref="642702582"/> + <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5758</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateKeyLocationFileVisibility:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="388256324"/> + </object> + <int key="connectionID">5759</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> + <reference key="source" ref="103272364"/> + <reference key="destination" ref="642702582"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="103272364"/> + <reference key="NSDestination" ref="642702582"/> + <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5762</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateKeyLocationFileVisibility:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="103272364"/> + </object> + <int key="connectionID">5763</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBBindingConnection" key="connection"> + <string key="label">value: values.KeySelectionHiddenFilesVisibility</string> + <reference key="source" ref="455655503"/> + <reference key="destination" ref="642702582"/> + <object class="NSNibBindingConnector" key="connector"> + <reference key="NSSource" ref="455655503"/> + <reference key="NSDestination" ref="642702582"/> + <string key="NSLabel">value: values.KeySelectionHiddenFilesVisibility</string> + <string key="NSBinding">value</string> + <string key="NSKeyPath">values.KeySelectionHiddenFilesVisibility</string> + <object class="NSDictionary" key="NSOptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSNoSelectionPlaceholder</string> + <string>NSNotApplicablePlaceholder</string> + <string>NSNullPlaceholder</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <integer value="0"/> + <integer value="0"/> + <integer value="0"/> + </object> + </object> + <int key="NSNibBindingConnectorVersion">2</int> + </object> + </object> + <int key="connectionID">5766</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">updateKeyLocationFileVisibility:</string> + <reference key="source" ref="545410097"/> + <reference key="destination" ref="455655503"/> + </object> + <int key="connectionID">5767</int> + </object> + </object> + <object class="IBMutableOrderedSet" key="objectRecords"> + <object class="NSArray" key="orderedObjects"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <reference key="object" ref="0"/> + <reference key="children" ref="584594810"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="547391009"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="545410097"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="292263310"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5431</int> + <reference key="object" ref="958272936"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="536120400"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">Error Detail HUD</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5432</int> + <reference key="object" ref="536120400"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="699163511"/> + </object> + <reference key="parent" ref="958272936"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5433</int> + <reference key="object" ref="699163511"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="59706192"/> + <reference ref="266224177"/> + <reference ref="79422493"/> + </object> + <reference key="parent" ref="536120400"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5434</int> + <reference key="object" ref="59706192"/> + <reference key="parent" ref="699163511"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5435</int> + <reference key="object" ref="266224177"/> + <reference key="parent" ref="699163511"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5436</int> + <reference key="object" ref="79422493"/> + <reference key="parent" ref="699163511"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5455</int> + <reference key="object" ref="642702582"/> + <reference key="parent" ref="0"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5468</int> + <reference key="object" ref="9858888"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="471954922"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">Context Menu</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5469</int> + <reference key="object" ref="471954922"/> + <reference key="parent" ref="9858888"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5576</int> + <reference key="object" ref="567906875"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="44241774"/> + <reference ref="912885202"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">SSH Key Selection Help</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5577</int> + <reference key="object" ref="44241774"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1045018411"/> + </object> + <reference key="parent" ref="567906875"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5578</int> + <reference key="object" ref="1045018411"/> + <reference key="parent" ref="44241774"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5668</int> + <reference key="object" ref="12066713"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="538839943"/> + <reference ref="388256324"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">SSL Key File Selection Help</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5669</int> + <reference key="object" ref="538839943"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="124352014"/> + </object> + <reference key="parent" ref="12066713"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5670</int> + <reference key="object" ref="124352014"/> + <reference key="parent" ref="538839943"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5680</int> + <reference key="object" ref="3577372"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="761812578"/> + <reference ref="455655503"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">SSL CA Cert File Selection Help</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5681</int> + <reference key="object" ref="761812578"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="444474564"/> + </object> + <reference key="parent" ref="3577372"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5682</int> + <reference key="object" ref="444474564"/> + <reference key="parent" ref="761812578"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5683</int> + <reference key="object" ref="136328549"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="802544195"/> + <reference ref="103272364"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">SSL Certificate File Selection Help</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5684</int> + <reference key="object" ref="802544195"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="196059550"/> + </object> + <reference key="parent" ref="136328549"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5685</int> + <reference key="object" ref="196059550"/> + <reference key="parent" ref="802544195"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5739</int> + <reference key="object" ref="733821228"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="616749187"/> + </object> + <reference key="parent" ref="0"/> + <string key="objectName">ConnectionView</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5741</int> + <reference key="object" ref="616749187"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="551584428"/> + <reference ref="563806501"/> + </object> + <reference key="parent" ref="733821228"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5742</int> + <reference key="object" ref="551584428"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="805249222"/> + <reference ref="524598165"/> + </object> + <reference key="parent" ref="616749187"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5743</int> + <reference key="object" ref="563806501"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="570492783"/> + <reference ref="1058735001"/> + </object> + <reference key="parent" ref="616749187"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5345</int> + <reference key="object" ref="805249222"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="642219827"/> + <reference ref="221133754"/> + </object> + <reference key="parent" ref="551584428"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5346</int> + <reference key="object" ref="642219827"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="179580583"/> + </object> + <reference key="parent" ref="805249222"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5475</int> + <reference key="object" ref="221133754"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="270183415"/> + </object> + <reference key="parent" ref="805249222"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5476</int> + <reference key="object" ref="270183415"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="949612237"/> + </object> + <reference key="parent" ref="221133754"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5477</int> + <reference key="object" ref="949612237"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="751753648"/> + <reference ref="623685715"/> + </object> + <reference key="parent" ref="270183415"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5478</int> + <reference key="object" ref="751753648"/> + <reference key="parent" ref="949612237"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5479</int> + <reference key="object" ref="623685715"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="455108754"/> + </object> + <reference key="parent" ref="949612237"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5481</int> + <reference key="object" ref="455108754"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="536740264"/> + <reference ref="965148975"/> + <reference ref="997359603"/> + <reference ref="43427774"/> + <reference ref="513442721"/> + </object> + <reference key="parent" ref="623685715"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5482</int> + <reference key="object" ref="536740264"/> + <reference key="parent" ref="455108754"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5483</int> + <reference key="object" ref="965148975"/> + <reference key="parent" ref="455108754"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5484</int> + <reference key="object" ref="997359603"/> + <reference key="parent" ref="455108754"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5485</int> + <reference key="object" ref="43427774"/> + <reference key="parent" ref="455108754"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5486</int> + <reference key="object" ref="513442721"/> + <reference key="parent" ref="455108754"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5347</int> + <reference key="object" ref="179580583"/> + <reference key="parent" ref="642219827"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4910</int> + <reference key="object" ref="524598165"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1012579052"/> + <reference ref="802793151"/> + <reference ref="533108700"/> + </object> + <reference key="parent" ref="551584428"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4913</int> + <reference key="object" ref="1012579052"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="131458815"/> + </object> + <reference key="parent" ref="524598165"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4912</int> + <reference key="object" ref="802793151"/> + <reference key="parent" ref="524598165"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4911</int> + <reference key="object" ref="533108700"/> + <reference key="parent" ref="524598165"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4915</int> + <reference key="object" ref="131458815"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="93569184"/> + </object> + <reference key="parent" ref="1012579052"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4918</int> + <reference key="object" ref="93569184"/> + <reference key="parent" ref="131458815"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5154</int> + <reference key="object" ref="570492783"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="607446274"/> + </object> + <reference key="parent" ref="563806501"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5155</int> + <reference key="object" ref="607446274"/> + <reference key="parent" ref="570492783"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5588</int> + <reference key="object" ref="1058735001"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="508899576"/> + <reference ref="108277656"/> + <reference ref="315390047"/> + </object> + <reference key="parent" ref="563806501"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5589</int> + <reference key="object" ref="508899576"/> + <reference key="parent" ref="1058735001"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5590</int> + <reference key="object" ref="108277656"/> + <reference key="parent" ref="1058735001"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5447</int> + <reference key="object" ref="315390047"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="735564334"/> + </object> + <reference key="parent" ref="1058735001"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4888</int> + <reference key="object" ref="735564334"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="134031646"/> + <reference ref="575228526"/> + <reference ref="549907703"/> + <reference ref="990947983"/> + <reference ref="460592307"/> + <reference ref="476973680"/> + </object> + <reference key="parent" ref="315390047"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4980</int> + <reference key="object" ref="134031646"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="591192172"/> + <reference ref="517771995"/> + <reference ref="253369045"/> + </object> + <reference key="parent" ref="735564334"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5157</int> + <reference key="object" ref="460592307"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="424756162"/> + </object> + <reference key="parent" ref="735564334"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5159</int> + <reference key="object" ref="476973680"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="220047154"/> + </object> + <reference key="parent" ref="735564334"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5422</int> + <reference key="object" ref="575228526"/> + <reference key="parent" ref="735564334"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5423</int> + <reference key="object" ref="549907703"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="321846713"/> + </object> + <reference key="parent" ref="735564334"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4829</int> + <reference key="object" ref="990947983"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="757039715"/> + </object> + <reference key="parent" ref="735564334"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4839</int> + <reference key="object" ref="757039715"/> + <reference key="parent" ref="990947983"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5424</int> + <reference key="object" ref="321846713"/> + <reference key="parent" ref="549907703"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5160</int> + <reference key="object" ref="220047154"/> + <reference key="parent" ref="476973680"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5158</int> + <reference key="object" ref="424756162"/> + <reference key="parent" ref="460592307"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4985</int> + <reference key="object" ref="591192172"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="159800861"/> + </object> + <reference key="parent" ref="134031646"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4982</int> + <reference key="object" ref="517771995"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="962671066"/> + </object> + <reference key="parent" ref="134031646"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4981</int> + <reference key="object" ref="253369045"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="32802602"/> + </object> + <reference key="parent" ref="134031646"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4984</int> + <reference key="object" ref="32802602"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="31135925"/> + <reference ref="233374444"/> + </object> + <reference key="parent" ref="253369045"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5595</int> + <reference key="object" ref="31135925"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="104955330"/> + <reference ref="638710413"/> + <reference ref="684819179"/> + <reference ref="950540175"/> + <reference ref="1034069158"/> + <reference ref="586011242"/> + <reference ref="945929172"/> + <reference ref="839299955"/> + <reference ref="679511995"/> + </object> + <reference key="parent" ref="32802602"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5156</int> + <reference key="object" ref="233374444"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="508687946"/> + <reference ref="644973446"/> + <reference ref="786098118"/> + <reference ref="978463433"/> + <reference ref="987440606"/> + <reference ref="211629203"/> + <reference ref="105635377"/> + <reference ref="950381827"/> + <reference ref="788113046"/> + <reference ref="1013612483"/> + <reference ref="910543023"/> + <reference ref="810791200"/> + <reference ref="445567924"/> + </object> + <reference key="parent" ref="32802602"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5593</int> + <reference key="object" ref="508687946"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="184523755"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5171</int> + <reference key="object" ref="644973446"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="859982751"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5173</int> + <reference key="object" ref="786098118"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="393023945"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5175</int> + <reference key="object" ref="978463433"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="925313159"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5176</int> + <reference key="object" ref="987440606"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="377431100"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5179</int> + <reference key="object" ref="211629203"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="646391991"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5180</int> + <reference key="object" ref="105635377"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="785119002"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5183</int> + <reference key="object" ref="950381827"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="925102591"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5184</int> + <reference key="object" ref="788113046"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="441978581"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5187</int> + <reference key="object" ref="1013612483"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1003825843"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5188</int> + <reference key="object" ref="910543023"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="588889019"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5376</int> + <reference key="object" ref="810791200"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1040289660"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5377</int> + <reference key="object" ref="445567924"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="485990188"/> + </object> + <reference key="parent" ref="233374444"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5378</int> + <reference key="object" ref="485990188"/> + <reference key="parent" ref="445567924"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5379</int> + <reference key="object" ref="1040289660"/> + <reference key="parent" ref="810791200"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5189</int> + <reference key="object" ref="588889019"/> + <reference key="parent" ref="910543023"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5190</int> + <reference key="object" ref="1003825843"/> + <reference key="parent" ref="1013612483"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5185</int> + <reference key="object" ref="441978581"/> + <reference key="parent" ref="788113046"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5186</int> + <reference key="object" ref="925102591"/> + <reference key="parent" ref="950381827"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5181</int> + <reference key="object" ref="785119002"/> + <reference key="parent" ref="105635377"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5182</int> + <reference key="object" ref="646391991"/> + <reference key="parent" ref="211629203"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5177</int> + <reference key="object" ref="377431100"/> + <reference key="parent" ref="987440606"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5178</int> + <reference key="object" ref="925313159"/> + <reference key="parent" ref="978463433"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5174</int> + <reference key="object" ref="393023945"/> + <reference key="parent" ref="786098118"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5172</int> + <reference key="object" ref="859982751"/> + <reference key="parent" ref="644973446"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5594</int> + <reference key="object" ref="184523755"/> + <reference key="parent" ref="508687946"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5614</int> + <reference key="object" ref="104955330"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="69612386"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5613</int> + <reference key="object" ref="638710413"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="791857368"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5612</int> + <reference key="object" ref="839299955"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1013426677"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5606</int> + <reference key="object" ref="684819179"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="371333119"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5605</int> + <reference key="object" ref="950540175"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="196185392"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5604</int> + <reference key="object" ref="945929172"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1000000271"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5600</int> + <reference key="object" ref="586011242"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="85329089"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5598</int> + <reference key="object" ref="1034069158"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="943522732"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5596</int> + <reference key="object" ref="679511995"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="650760201"/> + </object> + <reference key="parent" ref="31135925"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5597</int> + <reference key="object" ref="650760201"/> + <reference key="parent" ref="679511995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5599</int> + <reference key="object" ref="943522732"/> + <reference key="parent" ref="1034069158"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5601</int> + <reference key="object" ref="85329089"/> + <reference key="parent" ref="586011242"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5609</int> + <reference key="object" ref="1000000271"/> + <reference key="parent" ref="945929172"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5608</int> + <reference key="object" ref="196185392"/> + <reference key="parent" ref="950540175"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5607</int> + <reference key="object" ref="371333119"/> + <reference key="parent" ref="684819179"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5617</int> + <reference key="object" ref="1013426677"/> + <reference key="parent" ref="839299955"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5616</int> + <reference key="object" ref="791857368"/> + <reference key="parent" ref="638710413"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5615</int> + <reference key="object" ref="69612386"/> + <reference key="parent" ref="104955330"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4983</int> + <reference key="object" ref="962671066"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="866600720"/> + <reference ref="394302879"/> + </object> + <reference key="parent" ref="517771995"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5688</int> + <reference key="object" ref="866600720"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="51601157"/> + <reference ref="57862599"/> + <reference ref="216069484"/> + <reference ref="521125104"/> + <reference ref="484504415"/> + <reference ref="98826968"/> + <reference ref="237955939"/> + <reference ref="988136593"/> + <reference ref="680939705"/> + </object> + <reference key="parent" ref="962671066"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5162</int> + <reference key="object" ref="394302879"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="16421625"/> + <reference ref="68541783"/> + <reference ref="607362814"/> + <reference ref="512253301"/> + <reference ref="789391730"/> + <reference ref="58217156"/> + <reference ref="745773732"/> + <reference ref="591324856"/> + <reference ref="474825058"/> + <reference ref="459734357"/> + <reference ref="728228957"/> + </object> + <reference key="parent" ref="962671066"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5720</int> + <reference key="object" ref="16421625"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="972347112"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5212</int> + <reference key="object" ref="68541783"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="279442436"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5213</int> + <reference key="object" ref="607362814"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="798396187"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5214</int> + <reference key="object" ref="512253301"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="251554254"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5215</int> + <reference key="object" ref="789391730"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="797213431"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5216</int> + <reference key="object" ref="58217156"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="185246669"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5217</int> + <reference key="object" ref="745773732"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="728524936"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5219</int> + <reference key="object" ref="591324856"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="317867885"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5385</int> + <reference key="object" ref="474825058"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="684614893"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5386</int> + <reference key="object" ref="459734357"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="352725628"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5218</int> + <reference key="object" ref="728228957"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="299457759"/> + </object> + <reference key="parent" ref="394302879"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5221</int> + <reference key="object" ref="299457759"/> + <reference key="parent" ref="728228957"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5387</int> + <reference key="object" ref="352725628"/> + <reference key="parent" ref="459734357"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5388</int> + <reference key="object" ref="684614893"/> + <reference key="parent" ref="474825058"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5220</int> + <reference key="object" ref="317867885"/> + <reference key="parent" ref="591324856"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5222</int> + <reference key="object" ref="728524936"/> + <reference key="parent" ref="745773732"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5223</int> + <reference key="object" ref="185246669"/> + <reference key="parent" ref="58217156"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5224</int> + <reference key="object" ref="797213431"/> + <reference key="parent" ref="789391730"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5225</int> + <reference key="object" ref="251554254"/> + <reference key="parent" ref="512253301"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5226</int> + <reference key="object" ref="798396187"/> + <reference key="parent" ref="607362814"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5227</int> + <reference key="object" ref="279442436"/> + <reference key="parent" ref="68541783"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5721</int> + <reference key="object" ref="972347112"/> + <reference key="parent" ref="16421625"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5697</int> + <reference key="object" ref="51601157"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="575863174"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5696</int> + <reference key="object" ref="57862599"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="357553281"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5695</int> + <reference key="object" ref="237955939"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="167444868"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5694</int> + <reference key="object" ref="988136593"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="559442548"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5693</int> + <reference key="object" ref="216069484"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="276609847"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5692</int> + <reference key="object" ref="521125104"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1025158673"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5691</int> + <reference key="object" ref="680939705"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="308087760"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5690</int> + <reference key="object" ref="484504415"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="169093017"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5689</int> + <reference key="object" ref="98826968"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="730590428"/> + </object> + <reference key="parent" ref="866600720"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5706</int> + <reference key="object" ref="730590428"/> + <reference key="parent" ref="98826968"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5705</int> + <reference key="object" ref="169093017"/> + <reference key="parent" ref="484504415"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5704</int> + <reference key="object" ref="308087760"/> + <reference key="parent" ref="680939705"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5703</int> + <reference key="object" ref="1025158673"/> + <reference key="parent" ref="521125104"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5702</int> + <reference key="object" ref="276609847"/> + <reference key="parent" ref="216069484"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5701</int> + <reference key="object" ref="559442548"/> + <reference key="parent" ref="988136593"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5700</int> + <reference key="object" ref="167444868"/> + <reference key="parent" ref="237955939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5699</int> + <reference key="object" ref="357553281"/> + <reference key="parent" ref="57862599"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5698</int> + <reference key="object" ref="575863174"/> + <reference key="parent" ref="51601157"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">4986</int> + <reference key="object" ref="159800861"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="326102394"/> + </object> + <reference key="parent" ref="591192172"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5166</int> + <reference key="object" ref="326102394"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="906103858"/> + <reference ref="180145997"/> + <reference ref="1030226140"/> + <reference ref="615962367"/> + <reference ref="358903996"/> + <reference ref="189856761"/> + <reference ref="187191991"/> + <reference ref="71258292"/> + <reference ref="1000646962"/> + <reference ref="632758915"/> + <reference ref="1049720725"/> + <reference ref="914345743"/> + <reference ref="844385120"/> + <reference ref="81612279"/> + <reference ref="790983747"/> + <reference ref="558754343"/> + <reference ref="21480939"/> + <reference ref="627782947"/> + <reference ref="692784990"/> + <reference ref="984151006"/> + <reference ref="1022082829"/> + <reference ref="761323775"/> + <reference ref="183948302"/> + </object> + <reference key="parent" ref="159800861"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5525</int> + <reference key="object" ref="906103858"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="882604644"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5523</int> + <reference key="object" ref="180145997"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="13940444"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5492</int> + <reference key="object" ref="183948302"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="510891456"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5264</int> + <reference key="object" ref="1030226140"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="933547668"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5265</int> + <reference key="object" ref="615962367"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="547674489"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5266</int> + <reference key="object" ref="358903996"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="869330413"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5267</int> + <reference key="object" ref="189856761"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="218707841"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5268</int> + <reference key="object" ref="187191991"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="737530250"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5269</int> + <reference key="object" ref="71258292"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="1056521404"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5270</int> + <reference key="object" ref="1000646962"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="289965133"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5271</int> + <reference key="object" ref="632758915"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="664433389"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5272</int> + <reference key="object" ref="1049720725"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="615536496"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5273</int> + <reference key="object" ref="914345743"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="265944034"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5284</int> + <reference key="object" ref="844385120"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="505035309"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5285</int> + <reference key="object" ref="81612279"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="386177793"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5286</int> + <reference key="object" ref="790983747"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="347555313"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5287</int> + <reference key="object" ref="558754343"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="222275233"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5288</int> + <reference key="object" ref="21480939"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="944931136"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5289</int> + <reference key="object" ref="627782947"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="369035253"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5290</int> + <reference key="object" ref="692784990"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="850057181"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5291</int> + <reference key="object" ref="984151006"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="563972303"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5403</int> + <reference key="object" ref="1022082829"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="833542503"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5404</int> + <reference key="object" ref="761323775"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="906889126"/> + </object> + <reference key="parent" ref="326102394"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5405</int> + <reference key="object" ref="906889126"/> + <reference key="parent" ref="761323775"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5406</int> + <reference key="object" ref="833542503"/> + <reference key="parent" ref="1022082829"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5292</int> + <reference key="object" ref="563972303"/> + <reference key="parent" ref="984151006"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5293</int> + <reference key="object" ref="850057181"/> + <reference key="parent" ref="692784990"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5294</int> + <reference key="object" ref="369035253"/> + <reference key="parent" ref="627782947"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5295</int> + <reference key="object" ref="944931136"/> + <reference key="parent" ref="21480939"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5296</int> + <reference key="object" ref="222275233"/> + <reference key="parent" ref="558754343"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5297</int> + <reference key="object" ref="347555313"/> + <reference key="parent" ref="790983747"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5298</int> + <reference key="object" ref="386177793"/> + <reference key="parent" ref="81612279"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5299</int> + <reference key="object" ref="505035309"/> + <reference key="parent" ref="844385120"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5274</int> + <reference key="object" ref="265944034"/> + <reference key="parent" ref="914345743"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5275</int> + <reference key="object" ref="615536496"/> + <reference key="parent" ref="1049720725"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5276</int> + <reference key="object" ref="664433389"/> + <reference key="parent" ref="632758915"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5277</int> + <reference key="object" ref="289965133"/> + <reference key="parent" ref="1000646962"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5278</int> + <reference key="object" ref="1056521404"/> + <reference key="parent" ref="71258292"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5279</int> + <reference key="object" ref="737530250"/> + <reference key="parent" ref="187191991"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5280</int> + <reference key="object" ref="218707841"/> + <reference key="parent" ref="189856761"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5281</int> + <reference key="object" ref="869330413"/> + <reference key="parent" ref="358903996"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5282</int> + <reference key="object" ref="547674489"/> + <reference key="parent" ref="615962367"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5283</int> + <reference key="object" ref="933547668"/> + <reference key="parent" ref="1030226140"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5493</int> + <reference key="object" ref="510891456"/> + <reference key="parent" ref="183948302"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5524</int> + <reference key="object" ref="13940444"/> + <reference key="parent" ref="180145997"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5526</int> + <reference key="object" ref="882604644"/> + <reference key="parent" ref="906103858"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5748</int> + <reference key="object" ref="912885202"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="388136120"/> + </object> + <reference key="parent" ref="567906875"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5749</int> + <reference key="object" ref="388136120"/> + <reference key="parent" ref="912885202"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5756</int> + <reference key="object" ref="388256324"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="844788897"/> + </object> + <reference key="parent" ref="12066713"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5757</int> + <reference key="object" ref="844788897"/> + <reference key="parent" ref="388256324"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5760</int> + <reference key="object" ref="103272364"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="20247014"/> + </object> + <reference key="parent" ref="136328549"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5761</int> + <reference key="object" ref="20247014"/> + <reference key="parent" ref="103272364"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5764</int> + <reference key="object" ref="455655503"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="609741956"/> + </object> + <reference key="parent" ref="3577372"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5765</int> + <reference key="object" ref="609741956"/> + <reference key="parent" ref="455655503"/> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="flattenedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>-3.IBPluginDependency</string> + <string>-3.ImportedFromIB2</string> + <string>4829.IBPluginDependency</string> + <string>4829.ImportedFromIB2</string> + <string>4839.IBPluginDependency</string> + <string>4888.IBPluginDependency</string> + <string>4888.IBViewBoundsToFrameTransform</string> + <string>4910.IBPluginDependency</string> + <string>4911.IBPluginDependency</string> + <string>4912.IBPluginDependency</string> + <string>4913.CustomClassName</string> + <string>4913.IBPluginDependency</string> + <string>4915.IBPluginDependency</string> + <string>4918.CustomClassName</string> + <string>4918.IBPluginDependency</string> + <string>4980.IBAttributePlaceholdersKey</string> + <string>4980.IBPluginDependency</string> + <string>4981.IBPluginDependency</string> + <string>4982.IBPluginDependency</string> + <string>4983.IBPluginDependency</string> + <string>4984.IBPluginDependency</string> + <string>4985.IBPluginDependency</string> + <string>4986.IBPluginDependency</string> + <string>5154.IBPluginDependency</string> + <string>5155.IBPluginDependency</string> + <string>5156.IBPluginDependency</string> + <string>5157.IBPluginDependency</string> + <string>5157.IBViewBoundsToFrameTransform</string> + <string>5158.IBPluginDependency</string> + <string>5159.IBAttributePlaceholdersKey</string> + <string>5159.IBPluginDependency</string> + <string>5159.IBViewBoundsToFrameTransform</string> + <string>5160.IBPluginDependency</string> + <string>5162.IBPluginDependency</string> + <string>5166.IBPluginDependency</string> + <string>5171.IBAttributePlaceholdersKey</string> + <string>5171.IBPluginDependency</string> + <string>5172.IBPluginDependency</string> + <string>5173.IBPluginDependency</string> + <string>5174.IBPluginDependency</string> + <string>5175.IBAttributePlaceholdersKey</string> + <string>5175.IBPluginDependency</string> + <string>5176.IBPluginDependency</string> + <string>5177.IBPluginDependency</string> + <string>5178.IBPluginDependency</string> + <string>5179.CustomClassName</string> + <string>5179.IBAttributePlaceholdersKey</string> + <string>5179.IBPluginDependency</string> + <string>5180.IBPluginDependency</string> + <string>5181.IBPluginDependency</string> + <string>5182.IBPluginDependency</string> + <string>5183.IBAttributePlaceholdersKey</string> + <string>5183.IBPluginDependency</string> + <string>5184.IBPluginDependency</string> + <string>5185.IBPluginDependency</string> + <string>5186.IBPluginDependency</string> + <string>5187.IBAttributePlaceholdersKey</string> + <string>5187.IBPluginDependency</string> + <string>5188.IBPluginDependency</string> + <string>5189.IBPluginDependency</string> + <string>5190.IBPluginDependency</string> + <string>5212.IBAttributePlaceholdersKey</string> + <string>5212.IBPluginDependency</string> + <string>5213.IBPluginDependency</string> + <string>5214.CustomClassName</string> + <string>5214.IBAttributePlaceholdersKey</string> + <string>5214.IBPluginDependency</string> + <string>5215.IBPluginDependency</string> + <string>5216.IBAttributePlaceholdersKey</string> + <string>5216.IBPluginDependency</string> + <string>5217.IBPluginDependency</string> + <string>5218.IBAttributePlaceholdersKey</string> + <string>5218.IBPluginDependency</string> + <string>5219.IBPluginDependency</string> + <string>5220.IBPluginDependency</string> + <string>5221.IBPluginDependency</string> + <string>5222.IBPluginDependency</string> + <string>5223.IBPluginDependency</string> + <string>5224.IBPluginDependency</string> + <string>5225.IBPluginDependency</string> + <string>5226.IBPluginDependency</string> + <string>5227.IBPluginDependency</string> + <string>5264.IBAttributePlaceholdersKey</string> + <string>5264.IBPluginDependency</string> + <string>5265.IBPluginDependency</string> + <string>5266.IBAttributePlaceholdersKey</string> + <string>5266.IBPluginDependency</string> + <string>5267.IBPluginDependency</string> + <string>5268.CustomClassName</string> + <string>5268.IBAttributePlaceholdersKey</string> + <string>5268.IBPluginDependency</string> + <string>5269.IBPluginDependency</string> + <string>5270.IBAttributePlaceholdersKey</string> + <string>5270.IBPluginDependency</string> + <string>5271.IBPluginDependency</string> + <string>5272.IBAttributePlaceholdersKey</string> + <string>5272.IBPluginDependency</string> + <string>5273.IBPluginDependency</string> + <string>5274.IBPluginDependency</string> + <string>5275.IBPluginDependency</string> + <string>5276.IBPluginDependency</string> + <string>5277.IBPluginDependency</string> + <string>5278.IBPluginDependency</string> + <string>5279.IBPluginDependency</string> + <string>5280.IBPluginDependency</string> + <string>5281.IBPluginDependency</string> + <string>5282.IBPluginDependency</string> + <string>5283.IBPluginDependency</string> + <string>5284.IBAttributePlaceholdersKey</string> + <string>5284.IBPluginDependency</string> + <string>5285.IBPluginDependency</string> + <string>5286.IBAttributePlaceholdersKey</string> + <string>5286.IBPluginDependency</string> + <string>5287.IBPluginDependency</string> + <string>5288.CustomClassName</string> + <string>5288.IBAttributePlaceholdersKey</string> + <string>5288.IBPluginDependency</string> + <string>5289.IBPluginDependency</string> + <string>5290.IBAttributePlaceholdersKey</string> + <string>5290.IBPluginDependency</string> + <string>5291.IBPluginDependency</string> + <string>5292.IBPluginDependency</string> + <string>5293.IBPluginDependency</string> + <string>5294.IBPluginDependency</string> + <string>5295.IBPluginDependency</string> + <string>5296.IBPluginDependency</string> + <string>5297.IBPluginDependency</string> + <string>5298.IBPluginDependency</string> + <string>5299.IBPluginDependency</string> + <string>5345.IBPluginDependency</string> + <string>5346.IBAttributePlaceholdersKey</string> + <string>5346.IBPluginDependency</string> + <string>5347.IBPluginDependency</string> + <string>5376.IBAttributePlaceholdersKey</string> + <string>5376.IBPluginDependency</string> + <string>5377.IBPluginDependency</string> + <string>5378.IBPluginDependency</string> + <string>5379.IBPluginDependency</string> + <string>5385.IBAttributePlaceholdersKey</string> + <string>5385.IBPluginDependency</string> + <string>5386.IBPluginDependency</string> + <string>5387.IBPluginDependency</string> + <string>5388.IBAttributePlaceholdersKey</string> + <string>5388.IBPluginDependency</string> + <string>5403.IBAttributePlaceholdersKey</string> + <string>5403.IBPluginDependency</string> + <string>5404.IBPluginDependency</string> + <string>5405.IBPluginDependency</string> + <string>5406.IBPluginDependency</string> + <string>5422.IBPluginDependency</string> + <string>5423.IBPluginDependency</string> + <string>5424.IBPluginDependency</string> + <string>5431.IBEditorWindowLastContentRect</string> + <string>5431.IBPluginDependency</string> + <string>5431.IBWindowTemplateEditedContentRect</string> + <string>5431.NSWindowTemplate.visibleAtLaunch</string> + <string>5431.editorWindowContentRectSynchronizationRect</string> + <string>5431.windowTemplate.hasMaxSize</string> + <string>5431.windowTemplate.hasMinSize</string> + <string>5431.windowTemplate.maxSize</string> + <string>5431.windowTemplate.minSize</string> + <string>5432.IBPluginDependency</string> + <string>5433.IBPluginDependency</string> + <string>5434.IBPluginDependency</string> + <string>5435.IBPluginDependency</string> + <string>5436.IBPluginDependency</string> + <string>5447.IBPluginDependency</string> + <string>5455.IBPluginDependency</string> + <string>5468.IBEditorWindowLastContentRect</string> + <string>5468.IBPluginDependency</string> + <string>5469.IBPluginDependency</string> + <string>5475.IBPluginDependency</string> + <string>5476.IBPluginDependency</string> + <string>5477.IBEditorWindowLastContentRect</string> + <string>5477.IBPluginDependency</string> + <string>5478.IBPluginDependency</string> + <string>5479.IBPluginDependency</string> + <string>5481.IBEditorWindowLastContentRect</string> + <string>5481.IBPluginDependency</string> + <string>5482.IBPluginDependency</string> + <string>5483.IBPluginDependency</string> + <string>5484.IBPluginDependency</string> + <string>5485.IBPluginDependency</string> + <string>5486.IBPluginDependency</string> + <string>5492.IBAttributePlaceholdersKey</string> + <string>5492.IBPluginDependency</string> + <string>5492.IBViewBoundsToFrameTransform</string> + <string>5493.IBPluginDependency</string> + <string>5523.IBPluginDependency</string> + <string>5524.IBPluginDependency</string> + <string>5525.IBPluginDependency</string> + <string>5526.IBPluginDependency</string> + <string>5576.IBEditorWindowLastContentRect</string> + <string>5576.IBPluginDependency</string> + <string>5577.IBPluginDependency</string> + <string>5578.IBPluginDependency</string> + <string>5588.IBPluginDependency</string> + <string>5589.IBPluginDependency</string> + <string>5590.IBPluginDependency</string> + <string>5593.IBPluginDependency</string> + <string>5594.IBPluginDependency</string> + <string>5595.IBPluginDependency</string> + <string>5596.IBPluginDependency</string> + <string>5597.IBPluginDependency</string> + <string>5598.IBPluginDependency</string> + <string>5599.IBPluginDependency</string> + <string>5600.IBAttributePlaceholdersKey</string> + <string>5600.IBPluginDependency</string> + <string>5600.IBViewBoundsToFrameTransform</string> + <string>5601.IBPluginDependency</string> + <string>5604.IBAttributePlaceholdersKey</string> + <string>5604.IBPluginDependency</string> + <string>5604.IBViewBoundsToFrameTransform</string> + <string>5605.IBPluginDependency</string> + <string>5606.IBPluginDependency</string> + <string>5607.IBPluginDependency</string> + <string>5608.IBPluginDependency</string> + <string>5609.IBPluginDependency</string> + <string>5612.IBAttributePlaceholdersKey</string> + <string>5612.IBPluginDependency</string> + <string>5612.IBViewBoundsToFrameTransform</string> + <string>5613.IBPluginDependency</string> + <string>5614.IBPluginDependency</string> + <string>5615.IBPluginDependency</string> + <string>5616.IBPluginDependency</string> + <string>5617.IBPluginDependency</string> + <string>5668.IBEditorWindowLastContentRect</string> + <string>5668.IBPluginDependency</string> + <string>5669.IBPluginDependency</string> + <string>5670.IBPluginDependency</string> + <string>5680.IBEditorWindowLastContentRect</string> + <string>5680.IBPluginDependency</string> + <string>5681.IBPluginDependency</string> + <string>5682.IBPluginDependency</string> + <string>5683.IBEditorWindowLastContentRect</string> + <string>5683.IBPluginDependency</string> + <string>5684.IBPluginDependency</string> + <string>5685.IBPluginDependency</string> + <string>5688.IBPluginDependency</string> + <string>5689.IBPluginDependency</string> + <string>5690.IBPluginDependency</string> + <string>5691.IBAttributePlaceholdersKey</string> + <string>5691.IBPluginDependency</string> + <string>5691.IBViewBoundsToFrameTransform</string> + <string>5692.IBPluginDependency</string> + <string>5693.IBPluginDependency</string> + <string>5694.IBAttributePlaceholdersKey</string> + <string>5694.IBPluginDependency</string> + <string>5694.IBViewBoundsToFrameTransform</string> + <string>5695.IBAttributePlaceholdersKey</string> + <string>5695.IBPluginDependency</string> + <string>5695.IBViewBoundsToFrameTransform</string> + <string>5696.IBPluginDependency</string> + <string>5697.IBPluginDependency</string> + <string>5698.IBPluginDependency</string> + <string>5699.IBPluginDependency</string> + <string>5700.IBPluginDependency</string> + <string>5701.IBPluginDependency</string> + <string>5702.IBPluginDependency</string> + <string>5703.IBPluginDependency</string> + <string>5704.IBPluginDependency</string> + <string>5705.IBPluginDependency</string> + <string>5706.IBPluginDependency</string> + <string>5720.IBPluginDependency</string> + <string>5721.IBPluginDependency</string> + <string>5739.IBEditorWindowLastContentRect</string> + <string>5739.IBPluginDependency</string> + <string>5741.IBPluginDependency</string> + <string>5742.IBPluginDependency</string> + <string>5743.IBPluginDependency</string> + <string>5748.IBPluginDependency</string> + <string>5748.IBViewBoundsToFrameTransform</string> + <string>5749.IBPluginDependency</string> + <string>5756.IBPluginDependency</string> + <string>5756.IBViewBoundsToFrameTransform</string> + <string>5757.IBPluginDependency</string> + <string>5760.IBPluginDependency</string> + <string>5760.IBViewBoundsToFrameTransform</string> + <string>5761.IBPluginDependency</string> + <string>5764.IBPluginDependency</string> + <string>5764.IBViewBoundsToFrameTransform</string> + <string>5765.IBPluginDependency</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">AUMFAABAAAAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>SPFavoritesOutlineView</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>SPTableTextFieldCell</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">InitialTabViewItem</string> + <object class="IBInitialTabViewItemAttribute" key="NS.object.0"> + <string key="name">InitialTabViewItem</string> + <reference key="object" ref="134031646"/> + <reference key="initialTabViewItem" ref="253369045"/> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDjIAAwdgAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="476973680"/> + <string key="toolTip">Add to Favorites (⌥⌘A)</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABCsgAAwdgAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="644973446"/> + <string key="toolTip">Enter the hostname of the MySQL server you want to connect to. Enter 127.0.0.1 to connect to a server on this computer</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="978463433"/> + <string key="toolTip">Enter the MySQL username to connect with</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>NSSecureTextField</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="211629203"/> + <string key="toolTip">Enter the password to use when connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="950381827"/> + <string key="toolTip">Optionally enter a database to select after successfully connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1013612483"/> + <string key="toolTip">Enter the port to use when connecting to the MySQL server. The default MySQL port is 3306</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="68541783"/> + <string key="toolTip">Enter the MySQL username to connect with</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>NSSecureTextField</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="512253301"/> + <string key="toolTip">Enter the password to use when connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="58217156"/> + <string key="toolTip">Optionally enter a database to select after successfully connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="728228957"/> + <string key="toolTip">Enter the path to the socket file to use when connecting to MySQL. Leave this field blank to use the default socket location</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1030226140"/> + <string key="toolTip">Enter the hostname of the MySQL server you want to connect to. Enter 127.0.0.1 to connect to a server running on the machine you are tunnelling to</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="358903996"/> + <string key="toolTip">Enter the MySQL username to connect with</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>NSSecureTextField</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="187191991"/> + <string key="toolTip">Enter the password to use when connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1000646962"/> + <string key="toolTip">Optionally enter a database to select after successfully connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1049720725"/> + <string key="toolTip">Enter the port to use when connecting to the MySQL server. The default MySQL port is 3306</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="844385120"/> + <string key="toolTip">Enter the hostname of the SSH server to tunnel via when connecting to the MySQL server</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="790983747"/> + <string key="toolTip">Enter the SSH username to connect with</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>NSSecureTextField</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="21480939"/> + <string key="toolTip">Enter the password to use when connecting to the SSH server. NB: your SSH configuration is used, and public/private key pairs and other authentication methods will be used if available</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="692784990"/> + <string key="toolTip">Enter the port to use when connecting to the SSH server. The default SSH port is 22</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.brandonwalkin.BWToolkit</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="642219827"/> + <string key="toolTip">Edit Favorites in Preferences (⌥⌘E)</string> + </object> + </object> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="810791200"/> + <string key="toolTip">Enter a nickname to use if adding to favorites. Optional.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="474825058"/> + <string key="toolTip">Enter a nickname to use if adding to favorites. Optional.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1022082829"/> + <string key="toolTip">Enter a nickname to use if adding to favorites. Optional.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{178, 539}, {580, 320}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{178, 539}, {580, 320}}</string> + <integer value="0"/> + <string>{{115, 214}, {588, 350}}</string> + <integer value="0"/> + <boolean value="YES"/> + <string>{3.40282e+38, 3.40282e+38}</string> + <string>{100, 100}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{639, 342}, {150, 23}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>{{147, 368}, {97, 37}}</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>{{244, 295}, {180, 93}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="183948302"/> + <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwogAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{71, 624}, {579, 83}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="586011242"/> + <string key="toolTip">Click to choose the SSL key file to use when establishing a secure connection</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwswAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="945929172"/> + <string key="toolTip">Click to choose the client SSL certificate file to use when establishing a secure connection</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwogAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="839299955"/> + <string key="toolTip">Click to choose the client SSL Certificate Authority certificate to use when establishing a secure connection</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwggAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{322, 595}, {579, 66}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{167, 425}, {579, 83}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{339, 568}, {599, 66}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="680939705"/> + <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwggAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="988136593"/> + <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwogAAA</bytes> + </object> + <object class="NSMutableDictionary"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="237955939"/> + <string key="toolTip">Choose a custom SSH key file to use with this connection. Standard locations like ~/.ssh are checked automatically.</string> + </object> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDmYAAwswAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{159, 381}, {882, 475}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.brandonwalkin.BWToolkit</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABBYAAAwfAAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABBAAAAwo4AAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDqQAAwiAAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <object class="NSAffineTransform"> + <bytes key="NSTransformStruct">P4AAAL+AAABDGQAAwgAAAA</bytes> + </object> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </object> + </object> + <object class="NSMutableDictionary" key="unlocalizedProperties"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="activeLocalization"/> + <object class="NSMutableDictionary" key="localizations"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference key="dict.sortedKeys" ref="0"/> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + </object> + </object> + <nil key="sourceID"/> + <int key="maxID">5767</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"> + <object class="NSMutableArray" key="referencedPartialClassDescriptions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">ImageAndTextCell</string> + <string key="superclassName">NSTextFieldCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/ImageAndTextCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabDragAssistant.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPMenuAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/MCPKit/MCPFoundationKit/MCPNull.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Frameworks/PSMTabBar/PSMTabBarController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="968459546"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPConnectionController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPContentFilterManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPImageView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPMainThreadTrampoline.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPNotLoaded.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPQueryFavoriteManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="NSMutableDictionary" key="actions"> + <string key="NS.key.0">toggleCollapse:</string> + <string key="NS.object.0">id</string> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <string key="NS.key.0">toggleCollapse:</string> + <object class="IBActionInfo" key="NS.object.0"> + <string key="name">toggleCollapse:</string> + <string key="candidateClassName">id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPTablesList.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextView</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>doDecomposedStringWithCanonicalMapping:</string> + <string>doDecomposedStringWithCompatibilityMapping:</string> + <string>doPrecomposedStringWithCanonicalMapping:</string> + <string>doPrecomposedStringWithCompatibilityMapping:</string> + <string>doRemoveDiacritics:</string> + <string>doSelectionLowerCase:</string> + <string>doSelectionTitleCase:</string> + <string>doSelectionUpperCase:</string> + <string>doTranspose:</string> + <string>executeBundleItemForInputField:</string> + <string>insertNULLvalue:</string> + <string>moveSelectionLineDown:</string> + <string>moveSelectionLineUp:</string> + <string>selectCurrentLine:</string> + <string>selectCurrentWord:</string> + <string>selectEnclosingBrackets:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>doDecomposedStringWithCanonicalMapping:</string> + <string>doDecomposedStringWithCompatibilityMapping:</string> + <string>doPrecomposedStringWithCanonicalMapping:</string> + <string>doPrecomposedStringWithCompatibilityMapping:</string> + <string>doRemoveDiacritics:</string> + <string>doSelectionLowerCase:</string> + <string>doSelectionTitleCase:</string> + <string>doSelectionUpperCase:</string> + <string>doTranspose:</string> + <string>executeBundleItemForInputField:</string> + <string>insertNULLvalue:</string> + <string>moveSelectionLineDown:</string> + <string>moveSelectionLineUp:</string> + <string>selectCurrentLine:</string> + <string>selectCurrentWord:</string> + <string>selectEnclosingBrackets:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">doDecomposedStringWithCanonicalMapping:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doDecomposedStringWithCompatibilityMapping:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doPrecomposedStringWithCanonicalMapping:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doPrecomposedStringWithCompatibilityMapping:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doRemoveDiacritics:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doSelectionLowerCase:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doSelectionTitleCase:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doSelectionUpperCase:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">doTranspose:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">executeBundleItemForInputField:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">insertNULLvalue:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">moveSelectionLineDown:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">moveSelectionLineUp:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">selectCurrentLine:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">selectCurrentWord:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">selectEnclosingBrackets:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPTextViewAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPWindowAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">SPConnectionController</string> + <string key="superclassName">NSViewController</string> + <object class="NSMutableDictionary" key="actions"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>addFavorite:</string> + <string>cancelMySQLConnection:</string> + <string>chooseKeyLocation:</string> + <string>editFavorites:</string> + <string>initiateConnection:</string> + <string>reverseSortFavorites:</string> + <string>showHelp:</string> + <string>sortFavorites:</string> + <string>updateFavoriteSelection:</string> + <string>updateKeyLocationFileVisibility:</string> + <string>updateSSLInterface:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + <string>NSButton</string> + <string>id</string> + <string>id</string> + <string>NSMenuItem</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>addFavorite:</string> + <string>cancelMySQLConnection:</string> + <string>chooseKeyLocation:</string> + <string>editFavorites:</string> + <string>initiateConnection:</string> + <string>reverseSortFavorites:</string> + <string>showHelp:</string> + <string>sortFavorites:</string> + <string>updateFavoriteSelection:</string> + <string>updateKeyLocationFileVisibility:</string> + <string>updateSSLInterface:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">addFavorite:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">cancelMySQLConnection:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">chooseKeyLocation:</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBActionInfo"> + <string key="name">editFavorites:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">initiateConnection:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">reverseSortFavorites:</string> + <string key="candidateClassName">NSMenuItem</string> + </object> + <object class="IBActionInfo"> + <string key="name">showHelp:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">sortFavorites:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">updateFavoriteSelection:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">updateKeyLocationFileVisibility:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">updateSSLInterface:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> + <object class="NSMutableDictionary" key="outlets"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>addToFavoritesButton</string> + <string>connectButton</string> + <string>connectionDetailsScrollView</string> + <string>connectionResizeContainer</string> + <string>connectionSplitView</string> + <string>connectionSplitViewButtonBar</string> + <string>connectionView</string> + <string>delegate</string> + <string>errorDetailText</string> + <string>errorDetailWindow</string> + <string>favoritesSortByMenuItem</string> + <string>favoritesTable</string> + <string>helpButton</string> + <string>progressIndicator</string> + <string>progressIndicatorText</string> + <string>socketConnectionFormContainer</string> + <string>socketConnectionSSLDetailsContainer</string> + <string>socketPasswordField</string> + <string>socketSSLCACertButton</string> + <string>socketSSLCertificateButton</string> + <string>socketSSLKeyFileButton</string> + <string>sshConnectionFormContainer</string> + <string>sshKeyLocationHelp</string> + <string>sshPasswordField</string> + <string>sshSQLHostField</string> + <string>sshSSHKeyButton</string> + <string>sshSSHPasswordField</string> + <string>sslCACertLocationHelp</string> + <string>sslCertificateLocationHelp</string> + <string>sslKeyFileLocationHelp</string> + <string>standardConnectionFormContainer</string> + <string>standardConnectionSSLDetailsContainer</string> + <string>standardPasswordField</string> + <string>standardSQLHostField</string> + <string>standardSSLCACertButton</string> + <string>standardSSLCertificateButton</string> + <string>standardSSLKeyFileButton</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSButton</string> + <string>NSButton</string> + <string>NSScrollView</string> + <string>NSView</string> + <string>NSSplitView</string> + <string>BWAnchoredButtonBar</string> + <string>NSView</string> + <string>id</string> + <string>NSTextView</string> + <string>NSWindow</string> + <string>NSMenuItem</string> + <string>SPFavoritesOutlineView</string> + <string>NSButton</string> + <string>NSProgressIndicator</string> + <string>NSTextField</string> + <string>NSView</string> + <string>NSView</string> + <string>NSSecureTextField</string> + <string>NSButton</string> + <string>NSButton</string> + <string>NSButton</string> + <string>NSView</string> + <string>NSView</string> + <string>NSSecureTextField</string> + <string>NSTextField</string> + <string>NSButton</string> + <string>NSSecureTextField</string> + <string>NSView</string> + <string>NSView</string> + <string>NSView</string> + <string>NSView</string> + <string>NSView</string> + <string>NSSecureTextField</string> + <string>NSTextField</string> + <string>NSButton</string> + <string>NSButton</string> + <string>NSButton</string> + </object> + </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>addToFavoritesButton</string> + <string>connectButton</string> + <string>connectionDetailsScrollView</string> + <string>connectionResizeContainer</string> + <string>connectionSplitView</string> + <string>connectionSplitViewButtonBar</string> + <string>connectionView</string> + <string>delegate</string> + <string>errorDetailText</string> + <string>errorDetailWindow</string> + <string>favoritesSortByMenuItem</string> + <string>favoritesTable</string> + <string>helpButton</string> + <string>progressIndicator</string> + <string>progressIndicatorText</string> + <string>socketConnectionFormContainer</string> + <string>socketConnectionSSLDetailsContainer</string> + <string>socketPasswordField</string> + <string>socketSSLCACertButton</string> + <string>socketSSLCertificateButton</string> + <string>socketSSLKeyFileButton</string> + <string>sshConnectionFormContainer</string> + <string>sshKeyLocationHelp</string> + <string>sshPasswordField</string> + <string>sshSQLHostField</string> + <string>sshSSHKeyButton</string> + <string>sshSSHPasswordField</string> + <string>sslCACertLocationHelp</string> + <string>sslCertificateLocationHelp</string> + <string>sslKeyFileLocationHelp</string> + <string>standardConnectionFormContainer</string> + <string>standardConnectionSSLDetailsContainer</string> + <string>standardPasswordField</string> + <string>standardSQLHostField</string> + <string>standardSSLCACertButton</string> + <string>standardSSLCertificateButton</string> + <string>standardSSLKeyFileButton</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBToOneOutletInfo"> + <string key="name">addToFavoritesButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">connectButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">connectionDetailsScrollView</string> + <string key="candidateClassName">NSScrollView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">connectionResizeContainer</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">connectionSplitView</string> + <string key="candidateClassName">NSSplitView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">connectionSplitViewButtonBar</string> + <string key="candidateClassName">BWAnchoredButtonBar</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">connectionView</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">delegate</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">errorDetailText</string> + <string key="candidateClassName">NSTextView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">errorDetailWindow</string> + <string key="candidateClassName">NSWindow</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">favoritesSortByMenuItem</string> + <string key="candidateClassName">NSMenuItem</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">favoritesTable</string> + <string key="candidateClassName">SPFavoritesOutlineView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">helpButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">progressIndicator</string> + <string key="candidateClassName">NSProgressIndicator</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">progressIndicatorText</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">socketConnectionFormContainer</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">socketConnectionSSLDetailsContainer</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">socketPasswordField</string> + <string key="candidateClassName">NSSecureTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">socketSSLCACertButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">socketSSLCertificateButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">socketSSLKeyFileButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sshConnectionFormContainer</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sshKeyLocationHelp</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sshPasswordField</string> + <string key="candidateClassName">NSSecureTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sshSQLHostField</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sshSSHKeyButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sshSSHPasswordField</string> + <string key="candidateClassName">NSSecureTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sslCACertLocationHelp</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sslCertificateLocationHelp</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">sslKeyFileLocationHelp</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardConnectionFormContainer</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardConnectionSSLDetailsContainer</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardPasswordField</string> + <string key="candidateClassName">NSSecureTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardSQLHostField</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardSSLCACertButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardSSLCertificateButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">standardSSLKeyFileButton</string> + <string key="candidateClassName">NSButton</string> + </object> + </object> + </object> + <reference key="sourceIdentifier" ref="968459546"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">SPConnectionController</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPConnectionControllerDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">SPFavoritesOutlineView</string> + <string key="superclassName">NSOutlineView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPFavoritesOutlineView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">SPFlippedView</string> + <string key="superclassName">NSView</string> + <reference key="sourceIdentifier" ref="968459546"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">SPTableTextFieldCell</string> + <string key="superclassName">ImageAndTextCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">Source/SPTableTextFieldCell.h</string> + </object> + </object> + </object> + <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBPartialClassDescription"> + <string key="className">BWAnchoredButton</string> + <string key="superclassName">NSButton</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredButton.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWAnchoredButtonBar</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredButtonBar.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWAnchoredButtonCell</string> + <string key="superclassName">NSButtonCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredButtonCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWAnchoredPopUpButton</string> + <string key="superclassName">NSPopUpButton</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredPopUpButton.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWAnchoredPopUpButtonCell</string> + <string key="superclassName">NSPopUpButtonCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWAnchoredPopUpButtonCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWSplitView</string> + <string key="superclassName">NSSplitView</string> + <object class="NSMutableDictionary" key="actions"> + <string key="NS.key.0">toggleCollapse:</string> + <string key="NS.object.0">id</string> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <string key="NS.key.0">toggleCollapse:</string> + <object class="IBActionInfo" key="NS.object.0"> + <string key="name">toggleCollapse:</string> + <string key="candidateClassName">id</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWSplitView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWTransparentScrollView</string> + <string key="superclassName">NSScrollView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWTransparentScrollView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">BWTransparentScroller</string> + <string key="superclassName">NSScroller</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/BWTransparentScroller.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSActionCell</string> + <string key="superclassName">NSCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="749297199"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="915418474"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="818190051"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSApplication</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/NSApplication+BWAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSButton</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSButton.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSButtonCell</string> + <string key="superclassName">NSActionCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSCell</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSControl</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="68211622"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSController</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSFormatter</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenu</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="315030118"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenuItem</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="203440835"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSMenuItemCell</string> + <string key="superclassName">NSButtonCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSMenuItemCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="749297199"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="915418474"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="818190051"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="68211622"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="315030118"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="124846695"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="498538215"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="79203157"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSError.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSThread.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURL.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">PSMTabBar.framework/Headers/PSMTabBarCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">PSMTabBar.framework/Headers/PSMTabBarControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">PrintCore.framework/Headers/PDEPluginInterface.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">ShortcutRecorder.framework/Headers/SRRecorderControl.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">ShortcutRecorder.framework/Headers/SRValidator.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebDownload.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebEditingDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebFrameLoadDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebJavaPlugIn.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebPlugin.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebPluginContainer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebPolicyDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebResourceLoadDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebScriptObject.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">WebKit.framework/Headers/WebUIDelegate.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSOutlineView</string> + <string key="superclassName">NSTableView</string> + <reference key="sourceIdentifier" ref="124846695"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSPanel</string> + <string key="superclassName">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPanel.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSPopUpButton</string> + <string key="superclassName">NSButton</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPopUpButton.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSPopUpButtonCell</string> + <string key="superclassName">NSMenuItemCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSPopUpButtonCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSProgressIndicator</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSProgressIndicator.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSResponder</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSScrollView</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSScrollView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSScroller</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSScroller.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSSecureTextField</string> + <string key="superclassName">NSTextField</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSecureTextField.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSSplitView</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSSplitView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTabView</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTabView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTabViewItem</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTabViewItem.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTableColumn</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTableColumn.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTableView</string> + <string key="superclassName">NSControl</string> + <reference key="sourceIdentifier" ref="498538215"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSText</string> + <string key="superclassName">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSText.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextField</string> + <string key="superclassName">NSControl</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextFieldCell</string> + <string key="superclassName">NSActionCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSTextView</string> + <string key="superclassName">NSText</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSUserDefaultsController</string> + <string key="superclassName">NSController</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSUserDefaultsController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <reference key="sourceIdentifier" ref="203440835"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <string key="superclassName">NSResponder</string> + <reference key="sourceIdentifier" ref="79203157"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSView</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/NSView+BWAdditions.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSViewController</string> + <string key="superclassName">NSResponder</string> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">view</string> + <string key="NS.object.0">NSView</string> + </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <string key="NS.key.0">view</string> + <object class="IBToOneOutletInfo" key="NS.object.0"> + <string key="name">view</string> + <string key="candidateClassName">NSView</string> + </object> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSViewController.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <string key="superclassName">NSResponder</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSWindow</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">BWToolkitFramework.framework/Headers/NSWindow+BWAdditions.h</string> + </object> + </object> + </object> + </object> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="3000" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <string key="IBDocument.LastKnownRelativeProjectPath">../../sequel-pro.xcodeproj</string> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>KeyTemplate</string> + <string>NSActionTemplate</string> + <string>NSMenuCheckmark</string> + <string>NSMenuMixedState</string> + <string>NSSwitch</string> + <string>button_edit</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>{16, 8}</string> + <string>{10, 10}</string> + <string>{11, 11}</string> + <string>{10, 3}</string> + <string>{15, 15}</string> + <string>{32, 23}</string> + </object> + </object> + </data> </archive> diff --git a/Interfaces/English.lproj/DBView.xib b/Interfaces/English.lproj/DBView.xib index 17381d26..49c3a138 100644 --- a/Interfaces/English.lproj/DBView.xib +++ b/Interfaces/English.lproj/DBView.xib @@ -23,7 +23,6 @@ </object> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="27"/> <integer value="6225"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> @@ -48,7 +47,7 @@ <string key="NSClassName">NSApplication</string> </object> <object class="NSCustomView" id="632807581"> - <reference key="NSNextResponder"/> + <nil key="NSNextResponder"/> <int key="NSvFlags">274</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -582,7 +581,6 @@ </object> <string key="NSFrame">{{1, 1}, {218, 38}}</string> <reference key="NSSuperview" ref="607475905"/> - <reference key="NSNextKeyView" ref="970881282"/> <reference key="NSDocView" ref="970881282"/> <object class="NSColor" key="NSBGColor" id="1024678221"> <int key="NSColorSpace">6</int> @@ -614,7 +612,6 @@ </object> <string key="NSFrame">{{-1, -13}, {220, 40}}</string> <reference key="NSSuperview" ref="801427893"/> - <reference key="NSNextKeyView" ref="494991824"/> <int key="NSsFlags">133122</int> <reference key="NSVScroller" ref="196112633"/> <reference key="NSHScroller" ref="142487484"/> @@ -710,7 +707,6 @@ </object> <string key="NSFrameSize">{214, 352}</string> <reference key="NSSuperview" ref="233472824"/> - <reference key="NSNextKeyView" ref="251040077"/> <reference key="NSDocView" ref="251040077"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">4</int> @@ -738,7 +734,6 @@ </object> <string key="NSFrameSize">{214, 352}</string> <reference key="NSSuperview" ref="1017775084"/> - <reference key="NSNextKeyView" ref="73685676"/> <int key="NSsFlags">133648</int> <reference key="NSVScroller" ref="693168867"/> <reference key="NSHScroller" ref="656188692"/> @@ -869,7 +864,6 @@ </object> <string key="NSFrameSize">{216, 145}</string> <reference key="NSSuperview" ref="561874764"/> - <reference key="NSNextKeyView" ref="794785393"/> <reference key="NSDocView" ref="794785393"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">6</int> @@ -896,7 +890,6 @@ </object> <string key="NSFrame">{{-1, 0}, {216, 145}}</string> <reference key="NSSuperview" ref="192579410"/> - <reference key="NSNextKeyView" ref="242523705"/> <int key="NSsFlags">133648</int> <reference key="NSVScroller" ref="313695606"/> <reference key="NSHScroller" ref="464071814"/> @@ -982,7 +975,6 @@ </object> <string key="NSFrameSize">{214, 145}</string> <reference key="NSSuperview" ref="298226231"/> - <reference key="NSNextKeyView" ref="347093764"/> <reference key="NSDocView" ref="347093764"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">6</int> @@ -1010,7 +1002,6 @@ </object> <string key="NSFrameSize">{214, 145}</string> <reference key="NSSuperview" ref="192579410"/> - <reference key="NSNextKeyView" ref="685057119"/> <int key="NSsFlags">133632</int> <reference key="NSVScroller" ref="245346414"/> <reference key="NSHScroller" ref="353686052"/> @@ -1085,7 +1076,7 @@ <object class="NSTabViewItem" id="831053945"> <string key="NSIdentifier">source</string> <object class="NSView" key="NSView" id="461236772"> - <nil key="NSNextResponder"/> + <reference key="NSNextResponder" ref="714795046"/> <int key="NSvFlags">256</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -1200,6 +1191,7 @@ </object> </object> </object> + <int key="NSSelectedIndex">1</int> <bool key="NSPullDown">YES</bool> <int key="NSPreferredEdge">1</int> <bool key="NSUsesItemFromMenu">YES</bool> @@ -1813,7 +1805,6 @@ </object> <string key="NSFrame">{{1, 17}, {694, 288}}</string> <reference key="NSSuperview" ref="22340145"/> - <reference key="NSNextKeyView" ref="715508012"/> <reference key="NSDocView" ref="715508012"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">4</int> @@ -1847,7 +1838,6 @@ </object> <string key="NSFrame">{{1, 0}, {694, 17}}</string> <reference key="NSSuperview" ref="22340145"/> - <reference key="NSNextKeyView" ref="926883367"/> <reference key="NSDocView" ref="926883367"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">4</int> @@ -1855,7 +1845,6 @@ </object> <string key="NSFrame">{{-1, 22}, {696, 306}}</string> <reference key="NSSuperview" ref="220777809"/> - <reference key="NSNextKeyView" ref="16936123"/> <int key="NSsFlags">133682</int> <reference key="NSVScroller" ref="943144555"/> <reference key="NSHScroller" ref="456666876"/> @@ -2401,7 +2390,6 @@ </object> <string key="NSFrame">{{1, 17}, {694, 140}}</string> <reference key="NSSuperview" ref="376224367"/> - <reference key="NSNextKeyView" ref="584834515"/> <reference key="NSDocView" ref="584834515"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">4</int> @@ -2434,7 +2422,6 @@ </object> <string key="NSFrame">{{1, 0}, {694, 17}}</string> <reference key="NSSuperview" ref="376224367"/> - <reference key="NSNextKeyView" ref="459548655"/> <reference key="NSDocView" ref="459548655"/> <reference key="NSBGColor" ref="1024678221"/> <int key="NScvFlags">4</int> @@ -2442,7 +2429,6 @@ </object> <string key="NSFrame">{{-1, 23}, {696, 158}}</string> <reference key="NSSuperview" ref="1063281455"/> - <reference key="NSNextKeyView" ref="794929378"/> <int key="NSsFlags">133682</int> <reference key="NSVScroller" ref="1019209947"/> <reference key="NSHScroller" ref="328951385"/> @@ -2554,6 +2540,7 @@ </object> </object> <string key="NSFrame">{{10, 7}, {706, 544}}</string> + <reference key="NSSuperview" ref="714795046"/> </object> <string key="NSLabel">Structure</string> <reference key="NSColor" ref="62854682"/> @@ -2562,7 +2549,7 @@ <object class="NSTabViewItem" id="624106058"> <string key="NSIdentifier">content</string> <object class="NSView" key="NSView" id="1013108064"> - <reference key="NSNextResponder" ref="714795046"/> + <nil key="NSNextResponder"/> <int key="NSvFlags">256</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -3299,7 +3286,6 @@ </object> </object> <string key="NSFrame">{{10, 7}, {706, 544}}</string> - <reference key="NSSuperview" ref="714795046"/> </object> <string key="NSLabel">Content</string> <reference key="NSColor" ref="62854682"/> @@ -4406,7 +4392,7 @@ <object class="NSTextView" id="714539623"> <reference key="NSNextResponder" ref="572051963"/> <int key="NSvFlags">2322</int> - <string key="NSFrameSize">{887, 14}</string> + <string key="NSFrameSize">{887, 13}</string> <reference key="NSSuperview" ref="572051963"/> <object class="NSTextContainer" key="NSTextContainer" id="322143189"> <object class="NSLayoutManager" key="NSLayoutManager"> @@ -6424,14 +6410,14 @@ <reference key="NSTabView" ref="714795046"/> </object> </object> - <reference key="NSSelectedTabViewItem" ref="624106058"/> + <reference key="NSSelectedTabViewItem" ref="831053945"/> <reference key="NSFont" ref="26"/> <int key="NSTvFlags">134217731</int> <bool key="NSAllowTruncatedLabels">YES</bool> <bool key="NSDrawsBackground">YES</bool> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1013108064"/> + <reference ref="461236772"/> </object> </object> </object> @@ -6489,7 +6475,6 @@ </object> </object> <string key="NSFrameSize">{943, 549}</string> - <reference key="NSSuperview"/> <string key="NSClassName">NSView</string> </object> <object class="NSWindowTemplate" id="554105051"> @@ -8321,7 +8306,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> <string key="NSWindowContentMinSize">{360, 348}</string> <object class="NSView" key="NSWindowView" id="729080358"> - <reference key="NSNextResponder"/> + <nil key="NSNextResponder"/> <int key="NSvFlags">256</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -8340,7 +8325,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">268</int> <string key="NSFrame">{{1, 66}, {116, 14}}</string> <reference key="NSSuperview" ref="744559560"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="423785954"> <int key="NSCellFlags">68288064</int> @@ -8357,7 +8341,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">266</int> <string key="NSFrame">{{125, 64}, {181, 19}}</string> <reference key="NSSuperview" ref="744559560"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="868956191"> <int key="NSCellFlags">-1804468671</int> @@ -8375,7 +8358,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">268</int> <string key="NSFrame">{{121, 35}, {187, 22}}</string> <reference key="NSSuperview" ref="744559560"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSPopUpButtonCell" key="NSCell" id="395583979"> <int key="NSCellFlags">-2076049856</int> @@ -8430,7 +8412,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">268</int> <string key="NSFrame">{{121, 10}, {187, 22}}</string> <reference key="NSSuperview" ref="744559560"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSPopUpButtonCell" key="NSCell" id="545923807"> <int key="NSCellFlags">-2076049856</int> @@ -8496,7 +8477,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">268</int> <string key="NSFrame">{{1, 40}, {116, 14}}</string> <reference key="NSSuperview" ref="744559560"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="485839481"> <int key="NSCellFlags">68288064</int> @@ -8513,7 +8493,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">268</int> <string key="NSFrame">{{1, 15}, {116, 14}}</string> <reference key="NSSuperview" ref="744559560"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="972905785"> <int key="NSCellFlags">68288064</int> @@ -8528,12 +8507,10 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {324, 93}}</string> <reference key="NSSuperview" ref="215249222"/> - <reference key="NSWindow"/> </object> </object> <string key="NSFrame">{{17, 219}, {326, 109}}</string> <reference key="NSSuperview" ref="729080358"/> - <reference key="NSWindow"/> <string key="NSOffsets">{0, 0}</string> <object class="NSTextFieldCell" key="NSTitleCell"> <int key="NSCellFlags">67239424</int> @@ -8557,7 +8534,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">289</int> <string key="NSFrame">{{249, 13}, {96, 28}}</string> <reference key="NSSuperview" ref="729080358"/> - <reference key="NSWindow"/> <int key="NSTag">1</int> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="1062269056"> @@ -8579,7 +8555,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">289</int> <string key="NSFrame">{{155, 13}, {96, 28}}</string> <reference key="NSSuperview" ref="729080358"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="442324996"> <int key="NSCellFlags">67239424</int> @@ -8633,7 +8608,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrameSize">{318, 14}</string> <reference key="NSSuperview" ref="43515485"/> - <reference key="NSWindow"/> <object class="NSTextContainer" key="NSTextContainer" id="880430958"> <object class="NSLayoutManager" key="NSLayoutManager"> <object class="NSTextStorage" key="NSTextStorage"> @@ -8697,7 +8671,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {318, 168}}</string> <reference key="NSSuperview" ref="535637428"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="524621994"/> <reference key="NSDocView" ref="524621994"/> <reference key="NSBGColor" ref="449903125"/> @@ -8709,7 +8682,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{-100, -100}, {11, 133}}</string> <reference key="NSSuperview" ref="535637428"/> - <reference key="NSWindow"/> <int key="NSsFlags">256</int> <reference key="NSTarget" ref="535637428"/> <string key="NSAction">_doScroller:</string> @@ -8720,7 +8692,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{-100, -100}, {87, 18}}</string> <reference key="NSSuperview" ref="535637428"/> - <reference key="NSWindow"/> <int key="NSsFlags">1</int> <reference key="NSTarget" ref="535637428"/> <string key="NSAction">_doScroller:</string> @@ -8730,7 +8701,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{20, 45}, {320, 170}}</string> <reference key="NSSuperview" ref="729080358"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="43515485"/> <int key="NSsFlags">133650</int> <reference key="NSVScroller" ref="410655922"/> @@ -8739,8 +8709,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> </object> <string key="NSFrameSize">{360, 348}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> </object> <string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string> <string key="NSMinSize">{360, 370}</string> @@ -8895,7 +8863,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> <string key="NSWindowContentMinSize">{213, 107}</string> <object class="NSView" key="NSWindowView" id="1052076676"> - <reference key="NSNextResponder"/> + <nil key="NSNextResponder"/> <int key="NSvFlags">256</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -8914,7 +8882,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">2322</int> <string key="NSFrameSize">{370, 14}</string> <reference key="NSSuperview" ref="240408862"/> - <reference key="NSWindow"/> <object class="NSTextContainer" key="NSTextContainer" id="999014274"> <object class="NSLayoutManager" key="NSLayoutManager"> <object class="NSTextStorage" key="NSTextStorage"> @@ -8966,7 +8933,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {381, 204}}</string> <reference key="NSSuperview" ref="271089627"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="405634773"/> <reference key="NSDocView" ref="405634773"/> <reference key="NSBGColor" ref="449903125"/> @@ -8978,7 +8944,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">256</int> <string key="NSFrame">{{371, 1}, {11, 204}}</string> <reference key="NSSuperview" ref="271089627"/> - <reference key="NSWindow"/> <int key="NSsFlags">256</int> <reference key="NSTarget" ref="271089627"/> <string key="NSAction">_doScroller:</string> @@ -8989,7 +8954,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{-100, -100}, {87, 18}}</string> <reference key="NSSuperview" ref="271089627"/> - <reference key="NSWindow"/> <int key="NSsFlags">257</int> <reference key="NSTarget" ref="271089627"/> <string key="NSAction">_doScroller:</string> @@ -8999,7 +8963,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{-1, 35}, {383, 206}}</string> <reference key="NSSuperview" ref="1052076676"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="240408862"/> <int key="NSsFlags">133138</int> <reference key="NSVScroller" ref="850107135"/> @@ -9011,7 +8974,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">289</int> <string key="NSFrame">{{285, 4}, {76, 25}}</string> <reference key="NSSuperview" ref="1052076676"/> - <reference key="NSWindow"/> <int key="NSTag">1</int> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="660726210"> @@ -9032,8 +8994,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> </object> <string key="NSFrameSize">{381, 247}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> </object> <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> <string key="NSMinSize">{213, 129}</string> @@ -9214,6 +9174,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {411, 264}}</string> <reference key="NSSuperview" ref="666283614"/> + <reference key="NSNextKeyView" ref="843242867"/> <reference key="NSDocView" ref="843242867"/> <reference key="NSBGColor" ref="449903125"/> <reference key="NSCursor" ref="32917531"/> @@ -9243,6 +9204,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{-1, 42}, {413, 266}}</string> <reference key="NSSuperview" ref="749598685"/> + <reference key="NSNextKeyView" ref="789153540"/> <int key="NSsFlags">133634</int> <reference key="NSVScroller" ref="497829974"/> <reference key="NSHScroller" ref="246464134"/> @@ -9292,7 +9254,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> <string key="NSWindowContentMinSize">{213, 107}</string> <object class="NSView" key="NSWindowView" id="860968037"> - <reference key="NSNextResponder"/> + <nil key="NSNextResponder"/> <int key="NSvFlags">256</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -9301,7 +9263,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">264</int> <string key="NSFrame">{{20, 233}, {140, 14}}</string> <reference key="NSSuperview" ref="860968037"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="326519111"> <int key="NSCellFlags">67239424</int> @@ -9328,7 +9289,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">2322</int> <string key="NSFrameSize">{352, 14}</string> <reference key="NSSuperview" ref="158897172"/> - <reference key="NSWindow"/> <object class="NSTextContainer" key="NSTextContainer" id="197710090"> <object class="NSLayoutManager" key="NSLayoutManager"> <object class="NSTextStorage" key="NSTextStorage"> @@ -9380,7 +9340,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {363, 178}}</string> <reference key="NSSuperview" ref="972781700"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="347971361"/> <reference key="NSDocView" ref="347971361"/> <reference key="NSBGColor" ref="449903125"/> @@ -9392,7 +9351,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">256</int> <string key="NSFrame">{{353, 1}, {11, 178}}</string> <reference key="NSSuperview" ref="972781700"/> - <reference key="NSWindow"/> <int key="NSsFlags">256</int> <reference key="NSTarget" ref="972781700"/> <string key="NSAction">_doScroller:</string> @@ -9403,7 +9361,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{-100, -100}, {87, 18}}</string> <reference key="NSSuperview" ref="972781700"/> - <reference key="NSWindow"/> <int key="NSsFlags">257</int> <reference key="NSTarget" ref="972781700"/> <string key="NSAction">_doScroller:</string> @@ -9413,7 +9370,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{20, 45}, {365, 180}}</string> <reference key="NSSuperview" ref="860968037"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="158897172"/> <int key="NSsFlags">133138</int> <reference key="NSVScroller" ref="84024470"/> @@ -9425,7 +9381,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">257</int> <string key="NSFrame">{{314, 13}, {76, 28}}</string> <reference key="NSSuperview" ref="860968037"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="693776804"> <int key="NSCellFlags">67239424</int> @@ -9447,7 +9402,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">257</int> <string key="NSFrame">{{350, -130}, {80, 28}}</string> <reference key="NSSuperview" ref="860968037"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="725784088"> <int key="NSCellFlags">67239424</int> @@ -9466,8 +9420,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> </object> <string key="NSFrameSize">{405, 267}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> </object> <string key="NSScreenRect">{{0, 0}, {1440, 878}}</string> <string key="NSMinSize">{213, 129}</string> @@ -9897,7 +9849,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string> <string key="NSWindowContentMinSize">{380, 170}</string> <object class="NSView" key="NSWindowView" id="257361103"> - <reference key="NSNextResponder"/> + <nil key="NSNextResponder"/> <int key="NSvFlags">274</int> <object class="NSMutableArray" key="NSSubviews"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -9916,7 +9868,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">4352</int> <string key="NSFrameSize">{478, 1002}</string> <reference key="NSSuperview" ref="585936743"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="_NSCornerView" key="NSCornerView"> <nil key="NSNextResponder"/> @@ -9976,7 +9927,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {478, 53}}</string> <reference key="NSSuperview" ref="571404189"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="1256480"/> <reference key="NSDocView" ref="1256480"/> <object class="NSColor" key="NSBGColor"> @@ -9990,7 +9940,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{-100, -100}, {15, 120}}</string> <reference key="NSSuperview" ref="571404189"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <int key="NSArrowsLoc">2</int> <reference key="NSTarget" ref="571404189"/> @@ -10002,7 +9951,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{-100, -100}, {225, 15}}</string> <reference key="NSSuperview" ref="571404189"/> - <reference key="NSWindow"/> <int key="NSsFlags">1</int> <reference key="NSTarget" ref="571404189"/> <string key="NSAction">_doScroller:</string> @@ -10011,7 +9959,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrameSize">{480, 55}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="585936743"/> <int key="NSsFlags">133185</int> <reference key="NSVScroller" ref="175346013"/> @@ -10024,7 +9971,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">289</int> <string key="NSFrame">{{380, 8}, {81, 28}}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="BWTransparentButtonCell" key="NSCell" id="800774053"> <int key="NSCellFlags">67239424</int> @@ -10045,7 +9991,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">289</int> <string key="NSFrame">{{293, 9}, {81, 28}}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="BWTransparentButtonCell" key="NSCell" id="1073467237"> <int key="NSCellFlags">67239424</int> @@ -10086,14 +10031,12 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">274</int> <string key="NSFrameSize">{480, 87}</string> <reference key="NSSuperview" ref="824010218"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSTableHeaderView" key="NSHeaderView" id="493190585"> <reference key="NSNextResponder" ref="970708568"/> <int key="NSvFlags">256</int> <string key="NSFrameSize">{480, 17}</string> <reference key="NSSuperview" ref="970708568"/> - <reference key="NSWindow"/> <reference key="NSTableView" ref="233010382"/> </object> <object class="_NSCornerView" key="NSCornerView"> @@ -10155,7 +10098,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 17}, {480, 87}}</string> <reference key="NSSuperview" ref="332689220"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="233010382"/> <reference key="NSDocView" ref="233010382"/> <object class="NSColor" key="NSBGColor"> @@ -10169,7 +10111,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{464, 17}, {15, 72}}</string> <reference key="NSSuperview" ref="332689220"/> - <reference key="NSWindow"/> <reference key="NSTarget" ref="332689220"/> <string key="NSAction">_doScroller:</string> <double key="NSPercent">0.98275864124298096</double> @@ -10179,7 +10120,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{1, 89}, {463, 15}}</string> <reference key="NSSuperview" ref="332689220"/> - <reference key="NSWindow"/> <int key="NSsFlags">1</int> <reference key="NSTarget" ref="332689220"/> <string key="NSAction">_doScroller:</string> @@ -10194,7 +10134,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 0}, {480, 17}}</string> <reference key="NSSuperview" ref="332689220"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="493190585"/> <reference key="NSDocView" ref="493190585"/> <reference key="NSBGColor" ref="1024678221"/> @@ -10203,7 +10142,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrameSize">{482, 105}</string> <reference key="NSSuperview" ref="40644394"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="824010218"/> <int key="NSsFlags">133682</int> <reference key="NSVScroller" ref="281953763"/> @@ -10215,7 +10153,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrameSize">{482, 106}</string> <reference key="NSSuperview" ref="80390753"/> - <reference key="NSWindow"/> <string key="NSClassName">NSView</string> </object> <object class="BWCustomView" id="317678649"> @@ -10261,7 +10198,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrameSize">{480, 14}</string> <reference key="NSSuperview" ref="673776733"/> - <reference key="NSWindow"/> <object class="NSTextContainer" key="NSTextContainer" id="310042793"> <object class="NSLayoutManager" key="NSLayoutManager"> <object class="NSTextStorage" key="NSTextStorage"> @@ -10327,7 +10263,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{1, 1}, {480, 106}}</string> <reference key="NSSuperview" ref="81944450"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="378021102"/> <reference key="NSDocView" ref="378021102"/> <reference key="NSBGColor" ref="449903125"/> @@ -10339,7 +10274,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{464, 1}, {15, 91}}</string> <reference key="NSSuperview" ref="81944450"/> - <reference key="NSWindow"/> <reference key="NSTarget" ref="81944450"/> <string key="NSAction">_doScroller:</string> <double key="NSCurValue">1</double> @@ -10350,7 +10284,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">-2147483392</int> <string key="NSFrame">{{1, 92}, {463, 15}}</string> <reference key="NSSuperview" ref="81944450"/> - <reference key="NSWindow"/> <int key="NSsFlags">1</int> <reference key="NSTarget" ref="81944450"/> <string key="NSAction">_doScroller:</string> @@ -10360,7 +10293,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrameSize">{482, 108}</string> <reference key="NSSuperview" ref="317678649"/> - <reference key="NSWindow"/> <reference key="NSNextKeyView" ref="673776733"/> <int key="NSsFlags">133682</int> <reference key="NSVScroller" ref="617167031"/> @@ -10370,13 +10302,11 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <string key="NSFrame">{{0, 107}, {482, 108}}</string> <reference key="NSSuperview" ref="80390753"/> - <reference key="NSWindow"/> <string key="NSClassName">NSView</string> </object> </object> <string key="NSFrame">{{-1, 55}, {482, 215}}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <int key="NSDividerStyle">2</int> <reference key="BWSVColor" ref="304829493"/> <bool key="BWSVColorIsEnabled">NO</bool> @@ -10434,7 +10364,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">292</int> <string key="NSFrame">{{68, 28}, {207, 18}}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="BWTransparentCheckboxCell" key="NSCell" id="1038452661"> <int key="NSCellFlags">67239424</int> @@ -10457,7 +10386,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">292</int> <string key="NSFrame">{{68, 10}, {207, 18}}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="BWTransparentCheckboxCell" key="NSCell" id="334758487"> <int key="NSCellFlags">67239424</int> @@ -10480,7 +10408,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <int key="NSvFlags">292</int> <string key="NSFrame">{{10, 11}, {32, 32}}</string> <reference key="NSSuperview" ref="257361103"/> - <reference key="NSWindow"/> <bool key="NSEnabled">YES</bool> <object class="NSPopUpButtonCell" key="NSCell" id="131977594"> <int key="NSCellFlags">-2076049856</int> @@ -10583,8 +10510,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> </object> <string key="NSFrameSize">{480, 269}</string> - <reference key="NSSuperview"/> - <reference key="NSWindow"/> </object> <string key="NSScreenRect">{{0, 0}, {1280, 778}}</string> <string key="NSMinSize">{380, 192}</string> @@ -26239,7 +26164,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{96, 294}, {943, 549}}</string> + <string>{{4, 294}, {943, 549}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -26695,11 +26620,11 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.brandonwalkin.BWToolkit</string> <string>com.brandonwalkin.BWToolkit</string> - <string>{{423, 617}, {136, 37}}</string> + <string>{{880, 495}, {136, 37}}</string> <string>com.brandonwalkin.BWToolkit</string> <string>com.brandonwalkin.BWToolkit</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{559, 554}, {119, 83}}</string> + <string>{{1016, 432}, {119, 83}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -27202,7 +27127,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>id</string> <string>id</string> <string>id</string> - <string>id</string> + <string>NSButton</string> </object> </object> <object class="NSMutableDictionary" key="actionInfosByName"> @@ -27325,7 +27250,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <object class="IBActionInfo"> <string key="name">toggleQueryInfoPaneCollapse:</string> - <string key="candidateClassName">id</string> + <string key="candidateClassName">NSButton</string> </object> </object> </object> @@ -28454,7 +28379,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>statusTableAccessoryView</string> <string>statusTableCopyChecksum</string> <string>statusTableView</string> - <string>statusValues</string> <string>tableContentInstance</string> <string>tableDataInstance</string> <string>tableDumpInstance</string> @@ -28483,7 +28407,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>NSWindow</string> <string>NSSplitView</string> <string>id</string> - <string>id</string> + <string>NSButton</string> <string>id</string> <string>NSTextField</string> <string>NSTextView</string> @@ -28528,7 +28452,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>id</string> <string>id</string> <string>id</string> - <string>id</string> <string>SPTableContent</string> <string>SPTableData</string> <string>id</string> @@ -28605,7 +28528,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>statusTableAccessoryView</string> <string>statusTableCopyChecksum</string> <string>statusTableView</string> - <string>statusValues</string> <string>tableContentInstance</string> <string>tableDataInstance</string> <string>tableDumpInstance</string> @@ -28651,7 +28573,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <object class="IBToOneOutletInfo"> <string key="name">copyDatabaseDataButton</string> - <string key="candidateClassName">id</string> + <string key="candidateClassName">NSButton</string> </object> <object class="IBToOneOutletInfo"> <string key="name">copyDatabaseMessageField</string> @@ -28830,10 +28752,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string key="candidateClassName">id</string> </object> <object class="IBToOneOutletInfo"> - <string key="name">statusValues</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBToOneOutletInfo"> <string key="name">tableContentInstance</string> <string key="candidateClassName">SPTableContent</string> </object> @@ -30692,7 +30610,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>id</string> <string>id</string> <string>id</string> - <string>id</string> + <string>NSButton</string> </object> </object> <object class="NSMutableDictionary" key="actionInfosByName"> @@ -30790,7 +30708,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <object class="IBActionInfo"> <string key="name">togglePagination:</string> - <string key="candidateClassName">id</string> + <string key="candidateClassName">NSButton</string> </object> </object> </object> @@ -30866,7 +30784,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>id</string> <string>id</string> <string>id</string> - <string>id</string> + <string>NSButton</string> <string>NSButton</string> <string>NSButton</string> <string>NSTextField</string> @@ -31031,7 +30949,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <object class="IBToOneOutletInfo"> <string key="name">multipleLineEditingButton</string> - <string key="candidateClassName">id</string> + <string key="candidateClassName">NSButton</string> </object> <object class="IBToOneOutletInfo"> <string key="name">paginationButton</string> @@ -31492,7 +31410,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> <string>id</string> <string>id</string> <string>id</string> - <string>id</string> + <string>NSMenuItem</string> <string>id</string> </object> </object> @@ -31542,7 +31460,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8</string> </object> <object class="IBActionInfo"> <string key="name">toggleColumnView:</string> - <string key="candidateClassName">id</string> + <string key="candidateClassName">NSMenuItem</string> </object> <object class="IBActionInfo"> <string key="name">unhideIndexesView:</string> diff --git a/Source/DMLocalizedNib.m b/Source/DMLocalizedNib.m index 55e51e35..3f56a07d 100644 --- a/Source/DMLocalizedNib.m +++ b/Source/DMLocalizedNib.m @@ -136,4 +136,4 @@ static NSMutableDictionary *deliciousNibNames = nil; [self deliciousDealloc]; } -@end
\ No newline at end of file +@end diff --git a/Source/ImageAndTextCell.m b/Source/ImageAndTextCell.m index eb2f6678..e3c835f0 100644 --- a/Source/ImageAndTextCell.m +++ b/Source/ImageAndTextCell.m @@ -53,7 +53,7 @@ imageFrame.size = [image size]; imageFrame.origin = cellFrame.origin; imageFrame.origin.x += ((1 - MIN(1,INDENT_AMOUNT)) * 3) + (INDENT_AMOUNT * _indentationLevel); - imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); + imageFrame.origin.y += ceilf((cellFrame.size.height - imageFrame.size.height) / 2); return imageFrame; } else @@ -115,9 +115,9 @@ imageFrame.size = imageSize; if ([view isFlipped]) - imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2); + imageFrame.origin.y += ceilf((cellFrame.size.height + imageFrame.size.height) / 2); else - imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); + imageFrame.origin.y += ceilf((cellFrame.size.height - imageFrame.size.height) / 2); imageFrame.origin.y -= 1; @@ -154,9 +154,9 @@ imageFrame.size = imageSize; if ([controlView isFlipped]) - imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2); + imageFrame.origin.y += ceilf((cellFrame.size.height + imageFrame.size.height) / 2); else - imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); + imageFrame.origin.y += ceilf((cellFrame.size.height - imageFrame.size.height) / 2); [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver]; } diff --git a/Source/NSMutableArray-MultipleSort.m b/Source/NSMutableArray-MultipleSort.m index 55a55962..e48db16b 100644 --- a/Source/NSMutableArray-MultipleSort.m +++ b/Source/NSMutableArray-MultipleSort.m @@ -74,4 +74,4 @@ } } } -@end
\ No newline at end of file +@end diff --git a/Source/SPArrayAdditions.h b/Source/SPArrayAdditions.h index e08bfa33..abeec095 100644 --- a/Source/SPArrayAdditions.h +++ b/Source/SPArrayAdditions.h @@ -27,9 +27,41 @@ static inline id NSArrayObjectAtIndex(NSArray *self, NSUInteger i) return (id)CFArrayGetValueAtIndex((CFArrayRef)self, (long)i); } -static inline void NSMutableArrayAddObject(NSArray *self, id anObject) +/** + * Set up a static function to allow fast mutable array insertion using + * cached selectors. + * At least in 10.7, inserting items into an array at a known point + * using NSMutableArray methods appears to be the fastest way of adding + * items to a CF/NSMutableArray. + */ +static inline void NSMutableArrayInsertObject(NSMutableArray *self, id anObject, NSUInteger anIndex) { - CFArrayAppendValue((CFMutableArrayRef)self, anObject); + typedef id (*NSMutableArrayInsertObjectPtr)(NSMutableArray*, SEL, id, NSUInteger); + static NSMutableArrayInsertObjectPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(insertObject:atIndex:); + if (!cachedMethodPointer) cachedMethodPointer = (NSMutableArrayInsertObjectPtr)[self methodForSelector:cachedSelector]; + + cachedMethodPointer(self, cachedSelector, anObject, anIndex); +} +/** + * Set up a static function to allow fast mutable array insertion using + * cached selectors. + * At least in 10.7, adding items to an array using NSMutableArray methods + * appears to be the fastest approach to adding items to a CF/NSMutableArray; + * only NSMutableArrayInsertObject is faster if the position is known. + */ +static inline void NSMutableArrayAddObject(NSMutableArray *self, id anObject) +{ + typedef id (*NSMutableArrayAddObjectPtr)(NSMutableArray*, SEL, id); + static NSMutableArrayAddObjectPtr cachedMethodPointer; + static SEL cachedSelector; + + if (!cachedSelector) cachedSelector = @selector(addObject:); + if (!cachedMethodPointer) cachedMethodPointer = (NSMutableArrayAddObjectPtr)[self methodForSelector:cachedSelector]; + + cachedMethodPointer(self, cachedSelector, anObject); } static inline void NSMutableArrayReplaceObject(NSArray *self, CFIndex idx, id anObject) diff --git a/Source/SPBundleHTMLOutputController.m b/Source/SPBundleHTMLOutputController.m index 1b37be2e..9243741c 100644 --- a/Source/SPBundleHTMLOutputController.m +++ b/Source/SPBundleHTMLOutputController.m @@ -126,6 +126,7 @@ - (void)dealloc { if(webPreferences) [webPreferences release]; + [super dealloc]; } - (void)keyDown:(NSEvent *)theEvent diff --git a/Source/SPCSVExporter.m b/Source/SPCSVExporter.m index 6e0fa715..c40bc8f0 100644 --- a/Source/SPCSVExporter.m +++ b/Source/SPCSVExporter.m @@ -23,13 +23,12 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - #import "SPCSVExporter.h" #import "SPFileHandle.h" #import "SPTableData.h" #import "SPExportUtilities.h" #import "SPExportFile.h" +#import "SPMySQL.h" @implementation SPCSVExporter @@ -77,7 +76,7 @@ NSArray *csvRow = nil; NSScanner *csvNumericTester = nil; - MCPStreamingResult *streamingResult = nil; + SPMySQLFastStreamingResult *streamingResult = nil; NSString *escapedEscapeString, *escapedFieldSeparatorString, *escapedEnclosingString, *escapedLineEndString, *dataConversionString; id csvCell; @@ -122,7 +121,7 @@ // Make a streaming request for the data if the data array isn't set if ((![self csvDataArray]) && [self csvTableName]) { - totalRows = [[[[connection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [[self csvTableName] backtickQuotedString]]] fetchRowAsArray] objectAtIndex:0] integerValue]; + totalRows = [[connection getFirstFieldFromQuery:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [[self csvTableName] backtickQuotedString]]] integerValue]; streamingResult = [connection streamingQueryString:[NSString stringWithFormat:@"SELECT * FROM %@", [[self csvTableName] backtickQuotedString]] useLowMemoryBlockingStreaming:[self exportUsingLowMemoryBlockingStreaming]]; } @@ -184,12 +183,12 @@ NSDictionary *tableDetails = nil; // Determine whether the supplied table is actually a table or a view via the CREATE TABLE command, and get the table details - MCPResult *queryResult = [connection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE %@", [[self csvTableName] backtickQuotedString]]]; + SPMySQLResult *queryResult = [connection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE %@", [[self csvTableName] backtickQuotedString]]]; [queryResult setReturnDataAsStrings:YES]; - if ([queryResult numOfRows]) { - id object = [[[NSDictionary alloc] initWithDictionary:[queryResult fetchRowAsDictionary]] objectForKey:@"Create View"]; + if ([queryResult numberOfRows]) { + id object = [[queryResult getRowAsDictionary] objectForKey:@"Create View"]; tableDetails = [[NSDictionary alloc] initWithDictionary:(object) ? [[self csvTableData] informationForView:[self csvTableName]] : [[self csvTableData] informationForTable:[self csvTableName]]]; } @@ -238,11 +237,11 @@ else { // If still requested to read the field names, get the field names if ([self csvOutputFieldNames]) { - csvRow = [streamingResult fetchFieldNames]; + csvRow = [streamingResult fieldNames]; [self setCsvOutputFieldNames:NO]; } else { - csvRow = [streamingResult fetchNextRowAsArray]; + csvRow = [streamingResult getRowAsArray]; if (!csvRow) break; } @@ -266,7 +265,7 @@ csvCell = NSArrayObjectAtIndex(csvRow, i); // For NULL objects supplied from a queryResult, add an unenclosed null string as per prefs - if ([csvCell isKindOfClass:[NSNull class]]) { + if ([csvCell isNSNull]) { [csvString appendString:[self csvNULLString]]; if (i < (csvCellCount - 1)) [csvString appendString:[self csvFieldSeparatorString]]; @@ -285,7 +284,7 @@ [csvCellString setString:[NSString stringWithString:dataConversionString]]; [dataConversionString release]; } - else if ([csvCell isKindOfClass:[MCPGeometryData class]]) { + else if ([csvCell isKindOfClass:[SPMySQLGeometryData class]]) { [csvCellString setString:[csvCell wktString]]; } else { diff --git a/Source/SPCSVParser.m b/Source/SPCSVParser.m index e012e323..431c89a8 100644 --- a/Source/SPCSVParser.m +++ b/Source/SPCSVParser.m @@ -284,7 +284,7 @@ // Skip empty rows if ([csvRowArray count] == 0 || ([csvRowArray count] == 1 - && ([[csvRowArray objectAtIndex:0] isMemberOfClass:[NSNull class]] + && ([csvRowArray objectAtIndex:0] == [NSNull null] || ![[csvRowArray objectAtIndex:0] length]))) { @@ -659,4 +659,4 @@ [super dealloc]; } -@end
\ No newline at end of file +@end diff --git a/Source/SPCategoryAdditions.h b/Source/SPCategoryAdditions.h index 347dd957..2243d4f5 100644 --- a/Source/SPCategoryAdditions.h +++ b/Source/SPCategoryAdditions.h @@ -31,6 +31,7 @@ #import "SPArrayAdditions.h" #import "SPStringAdditions.h" +#import "SPObjectAdditions.h" #import "SPTextViewAdditions.h" #import "SPWindowAdditions.h" #import "SPDataAdditions.h" diff --git a/Source/SPColorAdditions.m b/Source/SPColorAdditions.m index b9353921..aee0458a 100644 --- a/Source/SPColorAdditions.m +++ b/Source/SPColorAdditions.m @@ -71,19 +71,19 @@ unsigned int color = 0; scanner = [NSScanner scannerWithString:code]; if( ! [scanner scanHexInt:&color] ) return nil; - return [self colorWithCalibratedRed:( ( ( color >> 24 ) & 0xff ) / 255. ) green:( ( ( color >> 16 ) & 0xff ) / 255. ) blue:( ( ( color >> 8) & 0xff ) / 255. ) alpha:( ( color & 0xff ) / 255. )]; + return [self colorWithCalibratedRed:( ( ( color >> 24 ) & 0xff ) / 255.f ) green:( ( ( color >> 16 ) & 0xff ) / 255.f ) blue:( ( ( color >> 8) & 0xff ) / 255.f ) alpha:( ( color & 0xff ) / 255.f )]; } else if( [code length] == 6 ) { // decode colors like #ffee33 unsigned int color = 0; scanner = [NSScanner scannerWithString:code]; if( ! [scanner scanHexInt:&color] ) return nil; - return [self colorWithCalibratedRed:( ( ( color >> 16 ) & 0xff ) / 255. ) green:( ( ( color >> 8 ) & 0xff ) / 255. ) blue:( ( color & 0xff ) / 255. ) alpha:1.]; + return [self colorWithCalibratedRed:( ( ( color >> 16 ) & 0xff ) / 255.f ) green:( ( ( color >> 8 ) & 0xff ) / 255.f ) blue:( ( color & 0xff ) / 255.f ) alpha:1.f]; } else if( [code length] == 3 ) { // decode short-hand colors like #fe3 unsigned int color = 0; scanner = [NSScanner scannerWithString:code]; if( ! [scanner scanHexInt:&color] ) return nil; - return [self colorWithCalibratedRed:( ( ( ( ( color >> 8 ) & 0xf ) << 4 ) | ( ( color >> 8 ) & 0xf ) ) / 255. ) green:( ( ( ( ( color >> 4 ) & 0xf ) << 4 ) | ( ( color >> 4 ) & 0xf ) ) / 255. ) blue:( ( ( ( color & 0xf ) << 4 ) | ( color & 0xf ) ) / 255. ) alpha:1.]; + return [self colorWithCalibratedRed:( ( ( ( ( color >> 8 ) & 0xf ) << 4 ) | ( ( color >> 8 ) & 0xf ) ) / 255.f ) green:( ( ( ( ( color >> 4 ) & 0xf ) << 4 ) | ( ( color >> 4 ) & 0xf ) ) / 255.f ) blue:( ( ( ( color & 0xf ) << 4 ) | ( color & 0xf ) ) / 255.f ) alpha:1.f]; } return nil; diff --git a/Source/SPConnectionController.h b/Source/SPConnectionController.h index 4ecff7e5..a6b63b41 100644 --- a/Source/SPConnectionController.h +++ b/Source/SPConnectionController.h @@ -23,14 +23,13 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> #import "SPConnectionControllerDelegateProtocol.h" #ifndef SP_REFACTOR /* headers */ #import "SPFavoritesOutlineView.h" #endif -@class SPDatabaseDocument, SPSSHTunnel, SPKeychain +@class SPDatabaseDocument, SPSSHTunnel, SPKeychain, SPMySQLConnection #ifndef SP_REFACTOR /* class decl */ , BWAnchoredButtonBar, SPFavoriteNode #endif @@ -67,7 +66,7 @@ NSMutableArray *favorites; #endif SPSSHTunnel *sshTunnel; - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; #ifndef SP_REFACTOR /* ivars */ BOOL automaticFavoriteSelection; #endif @@ -207,7 +206,7 @@ - (void)addConnectionToDocument; // Interface interaction -- (IBAction)chooseKeyLocation:(id)sender; +- (IBAction)chooseKeyLocation:(NSButton *)sender; #ifndef SP_REFACTOR /* method decls */ - (IBAction)editFavorites:(id)sender; - (IBAction)showHelp:(id)sender; @@ -215,7 +214,7 @@ - (IBAction)updateKeyLocationFileVisibility:(id)sender; - (void)resizeTabViewToConnectionType:(NSUInteger)theType animating:(BOOL)animate; - (IBAction)sortFavorites:(id)sender; -- (IBAction)reverseSortFavorites:(id)sender; +- (IBAction)reverseSortFavorites:(NSMenuItem *)sender; #endif // Connection details interaction diff --git a/Source/SPConnectionController.m b/Source/SPConnectionController.m index 94af9056..acec49de 100644 --- a/Source/SPConnectionController.m +++ b/Source/SPConnectionController.m @@ -25,6 +25,7 @@ #import "SPConnectionController.h" #import "SPDatabaseDocument.h" +#import "SPMySQL.h" #ifndef SP_REFACTOR /* headers */ #import "SPAppController.h" @@ -437,7 +438,7 @@ return; } - if (newState == PROXY_STATE_IDLE) { + if (newState == SPMySQLProxyIdle) { #ifndef SP_REFACTOR [tableDocument setTitlebarStatus:NSLocalizedString(@"SSH Disconnected", @"SSH disconnected titlebar marker")]; #endif @@ -445,7 +446,7 @@ [self failConnectionWithTitle:NSLocalizedString(@"SSH connection failed!", @"SSH connection failed title") errorMessage:[theTunnel lastError] detail:[sshTunnel debugMessages]]; [self _restoreConnectionInterface]; } - else if (newState == PROXY_STATE_CONNECTED) { + else if (newState == SPMySQLProxyConnected) { #ifndef SP_REFACTOR [tableDocument setTitlebarStatus:NSLocalizedString(@"SSH Connected", @"SSH connected titlebar marker")]; #endif @@ -600,7 +601,7 @@ /** * Opens the SSH/SSL key selection window, ready to select a key file. */ -- (IBAction)chooseKeyLocation:(id)sender +- (IBAction)chooseKeyLocation:(NSButton *)sender { #ifndef SP_REFACTOR /* favorites */ [favoritesTable deselectAll:self]; @@ -930,7 +931,7 @@ /** * Reverses the favorites table view sorting based on the selected criteria. */ -- (void)reverseSortFavorites:(id)sender +- (void)reverseSortFavorites:(NSMenuItem *)sender { reverseFavoritesSort = (![sender state]); @@ -1388,22 +1389,26 @@ - (void)_initiateMySQLConnectionInBackground { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + mySQLConnection = [[SPMySQLConnection alloc] init]; + + // Set up shared details + [mySQLConnection setUsername:[self user]]; // Initialise to socket if appropriate. if ([self type] == SPSocketConnection) { - mySQLConnection = [[MCPConnection alloc] initToSocket:[self socket] withLogin:[self user]]; + [mySQLConnection setUseSocket:YES]; + [mySQLConnection setSocketPath:[self socket]]; - // Otherwise, initialise to host, using tunnel if appropriate + // Otherwise, initialise to host, using tunnel if appropriate } else { + [mySQLConnection setUseSocket:NO]; if ([self type] == SPSSHTunnelConnection) { - mySQLConnection = [[MCPConnection alloc] initToHost:@"127.0.0.1" - withLogin:[self user] - usingPort:[sshTunnel localPort]]; - [mySQLConnection setConnectionProxy:sshTunnel]; + [mySQLConnection setHost:@"127.0.0.1"]; + [mySQLConnection setPort:[sshTunnel localPort]]; + [mySQLConnection setProxy:sshTunnel]; } else { - mySQLConnection = [[MCPConnection alloc] initToHost:[self host] - withLogin:[self user] - usingPort:([[self port] length]?[[self port] integerValue]:3306)]; + [mySQLConnection setHost:[self host]]; + if ([[self port] length]) [mySQLConnection setPort:[[self port] integerValue]]; } } @@ -1414,24 +1419,30 @@ // Enable SSL if set if ([self useSSL]) { - [mySQLConnection setSSL:YES - usingKeyFilePath:[self sslKeyFileLocationEnabled] ? [self sslKeyFileLocation] : nil - certificatePath:[self sslCertificateFileLocationEnabled] ? [self sslCertificateFileLocation] : nil - certificateAuthorityCertificatePath:[self sslCACertFileLocationEnabled] ? [self sslCACertFileLocation] : nil]; + [mySQLConnection setUseSSL:YES]; + if ([self sslKeyFileLocationEnabled]) { + [mySQLConnection setSslKeyFilePath:[self sslKeyFileLocation]]; + } + if ([self sslCertificateFileLocationEnabled]) { + [mySQLConnection setSslCertificatePath:[self sslCertificateFileLocation]]; + } + if ([self sslCACertFileLocationEnabled]) { + [mySQLConnection setSslCACertificatePath:[self sslCACertFileLocation]]; + } } - // Connection delegate must be set before actual connection attempt is made [mySQLConnection setDelegate:tableDocument]; + #ifndef SP_REFACTOR /* set mysql connection settings from prefs */ // Set whether or not we should enable delegate logging according to the prefs [mySQLConnection setDelegateQueryLogging:[prefs boolForKey:SPConsoleEnableLogging]]; #endif // Set options from preferences - [mySQLConnection setConnectionTimeout:[[prefs objectForKey:SPConnectionTimeoutValue] integerValue]]; + [mySQLConnection setTimeout:[[prefs objectForKey:SPConnectionTimeoutValue] integerValue]]; [mySQLConnection setUseKeepAlive:[[prefs objectForKey:SPUseKeepAlive] boolValue]]; - [mySQLConnection setKeepAliveInterval:[[prefs objectForKey:SPKeepAliveInterval] doubleValue]]; + [mySQLConnection setKeepAliveInterval:[[prefs objectForKey:SPKeepAliveInterval] floatValue]]; // Connect [mySQLConnection connect]; @@ -1443,7 +1454,7 @@ [[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.2]]; // If the state is connection refused, attempt the MySQL connection again with the host using the hostfield value. - if ([sshTunnel state] == PROXY_STATE_FORWARDING_FAILED) { + if ([sshTunnel state] == SPMySQLProxyForwardingFailed) { if ([sshTunnel localPortFallback]) { [mySQLConnection setPort:[sshTunnel localPortFallback]]; [mySQLConnection connect]; @@ -1456,20 +1467,20 @@ if (![mySQLConnection isConnected]) { NSString *errorMessage = @""; - if (sshTunnel && [sshTunnel state] == PROXY_STATE_FORWARDING_FAILED) { - errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to host %@ because the port connection via SSH was refused.\n\nPlease ensure that your MySQL host is set up to allow TCP/IP connections (no --skip-networking) and is configured to allow connections from the host you are tunnelling via.\n\nYou may also want to check the port is correct and that you have the necessary privileges.\n\nChecking the error detail will show the SSH debug log which may provide more details.\n\nMySQL said: %@", @"message of panel when SSH port forwarding failed"), [self host], [mySQLConnection getLastErrorMessage]]; + if (sshTunnel && [sshTunnel state] == SPMySQLProxyForwardingFailed) { + errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to host %@ because the port connection via SSH was refused.\n\nPlease ensure that your MySQL host is set up to allow TCP/IP connections (no --skip-networking) and is configured to allow connections from the host you are tunnelling via.\n\nYou may also want to check the port is correct and that you have the necessary privileges.\n\nChecking the error detail will show the SSH debug log which may provide more details.\n\nMySQL said: %@", @"message of panel when SSH port forwarding failed"), [self host], [mySQLConnection lastErrorMessage]]; [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"SSH port forwarding failed", @"title when ssh tunnel port forwarding failed") errorMessage:errorMessage detail:[sshTunnel debugMessages]]; - } else if ([mySQLConnection getLastErrorID] == 1045) { // "Access denied" error - errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to host %@ because access was denied.\n\nDouble-check your username and password and ensure that access from your current location is permitted.\n\nMySQL said: %@", @"message of panel when connection to host failed due to access denied error"), [self host], [mySQLConnection getLastErrorMessage]]; + } else if ([mySQLConnection lastErrorID] == 1045) { // "Access denied" error + errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to host %@ because access was denied.\n\nDouble-check your username and password and ensure that access from your current location is permitted.\n\nMySQL said: %@", @"message of panel when connection to host failed due to access denied error"), [self host], [mySQLConnection lastErrorMessage]]; [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"Access denied!", @"connection failed due to access denied title") errorMessage:errorMessage detail:nil]; - } else if ([self type] == SPSocketConnection && (![self socket] || ![[self socket] length]) && ![mySQLConnection findSocketPath]) { - errorMessage = [NSString stringWithFormat:NSLocalizedString(@"The socket file could not be found in any common location. Please supply the correct socket location.\n\nMySQL said: %@", @"message of panel when connection to socket failed because optional socket could not be found"), [mySQLConnection getLastErrorMessage]]; + } else if ([self type] == SPSocketConnection && (![self socket] || ![[self socket] length]) && ![SPMySQLConnection findSocketPath]) { + errorMessage = [NSString stringWithFormat:NSLocalizedString(@"The socket file could not be found in any common location. Please supply the correct socket location.\n\nMySQL said: %@", @"message of panel when connection to socket failed because optional socket could not be found"), [mySQLConnection lastErrorMessage]]; [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"Socket not found!", @"socket not found title") errorMessage:errorMessage detail:nil]; } else if ([self type] == SPSocketConnection) { - errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect via the socket, or the request timed out.\n\nDouble-check that the socket path is correct and that you have the necessary privileges, and that the server is running.\n\nMySQL said: %@", @"message of panel when connection to host failed"), [mySQLConnection getLastErrorMessage]]; + errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect via the socket, or the request timed out.\n\nDouble-check that the socket path is correct and that you have the necessary privileges, and that the server is running.\n\nMySQL said: %@", @"message of panel when connection to host failed"), [mySQLConnection lastErrorMessage]]; [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"Socket connection failed!", @"socket connection failed title") errorMessage:errorMessage detail:nil]; } else { - errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to host %@, or the request timed out.\n\nBe sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently %ld seconds).\n\nMySQL said: %@", @"message of panel when connection to host failed"), [self host], (long)[[prefs objectForKey:SPConnectionTimeoutValue] integerValue], [mySQLConnection getLastErrorMessage]]; + errorMessage = [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to host %@, or the request timed out.\n\nBe sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently %ld seconds).\n\nMySQL said: %@", @"message of panel when connection to host failed"), [self host], (long)[[prefs objectForKey:SPConnectionTimeoutValue] integerValue], [mySQLConnection lastErrorMessage]]; [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"Connection failed!", @"connection failed title") errorMessage:errorMessage detail:nil]; } @@ -1489,8 +1500,8 @@ } if ([self database] && ![[self database] isEqualToString:@""]) { - if (![mySQLConnection selectDB:[self database]]) { - [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"Could not select database", @"message when database selection failed") errorMessage:[NSString stringWithFormat:NSLocalizedString(@"Connected to host, but unable to connect to database %@.\n\nBe sure that the database exists and that you have the necessary privileges.\n\nMySQL said: %@", @"message of panel when connection to db failed"), [self database], [mySQLConnection getLastErrorMessage]] detail:nil]; + if (![mySQLConnection selectDatabase:[self database]]) { + [[self onMainThread] failConnectionWithTitle:NSLocalizedString(@"Could not select database", @"message when database selection failed") errorMessage:[NSString stringWithFormat:NSLocalizedString(@"Connected to host, but unable to connect to database %@.\n\nBe sure that the database exists and that you have the necessary privileges.\n\nMySQL said: %@", @"message of panel when connection to db failed"), [self database], [mySQLConnection lastErrorMessage]] detail:nil]; // Tidy up isConnecting = NO; diff --git a/Source/SPConnectionDelegate.h b/Source/SPConnectionDelegate.h index 777b032a..04bee877 100644 --- a/Source/SPConnectionDelegate.h +++ b/Source/SPConnectionDelegate.h @@ -25,13 +25,13 @@ #import "SPDatabaseDocument.h" -#import <MCPKit/MCPConnectionDelegate.h> +#import "SPMySQLConnectionDelegate.h" -@interface SPDatabaseDocument (SPConnectionDelegate) <MCPConnectionDelegate> +@interface SPDatabaseDocument (SPConnectionDelegate) <SPMySQLConnectionDelegate> - (void) closeAndDisconnect; -- (NSString *)keychainPasswordForConnection:(MCPConnection *)connection; -- (NSString *)keychainPasswordForSSHConnection:(MCPConnection *)connection; +- (NSString *)keychainPasswordForConnection:(SPMySQLConnection *)connection; +- (NSString *)keychainPasswordForSSHConnection:(SPMySQLConnection *)connection; @end diff --git a/Source/SPConnectionDelegate.m b/Source/SPConnectionDelegate.m index 58482d1c..2936ba82 100644 --- a/Source/SPConnectionDelegate.m +++ b/Source/SPConnectionDelegate.m @@ -28,11 +28,12 @@ #import "SPQueryController.h" #import "SPKeychain.h" #import "SPAlertSheets.h" +#import "SPMySQLConstants.h" @implementation SPDatabaseDocument (SPConnectionDelegate) #pragma mark - -#pragma mark MCPKit connection delegate methods +#pragma mark SPMySQLConnection delegate methods /** * Invoked when the framework is about to perform a query. @@ -60,18 +61,9 @@ } /** - * Invoked when the framework is in the process of reconnecting to the server and needs to know - * which database to select. - */ -- (NSString *)onReconnectShouldSelectDatabase:(id)connection -{ - return selectedDatabase; -} - -/** * Invoked when the current connection needs a password from the Keychain. */ -- (NSString *)keychainPasswordForConnection:(MCPConnection *)connection +- (NSString *)keychainPasswordForConnection:(SPMySQLConnection *)connection { // If no keychain item is available, return an empty password @@ -89,8 +81,10 @@ /** * Invoked when the current connection needs a ssh password from the Keychain. + * This isn't actually part of the SPMySQLConnection delegate protocol, but is here + * due to its similarity to the previous method. */ -- (NSString *)keychainPasswordForSSHConnection:(MCPConnection *)connection +- (NSString *)keychainPasswordForSSHConnection:(SPMySQLConnection *)connection { // If no keychain item is available, return an empty password @@ -123,9 +117,9 @@ /** * Invoked when the connection fails and the framework needs to know how to proceed. */ -- (MCPConnectionCheck)connectionLost:(id)connection +- (SPMySQLConnectionLostDecision)connectionLost:(id)connection { - NSInteger connectionErrorCode = MCPConnectionCheckDisconnect; + NSInteger connectionErrorCode = SPMySQLConnectionLostDisconnect; // Only display the reconnect dialog if the window is visible if ([self parentWindow] && [[self parentWindow] isVisible]) { @@ -144,7 +138,7 @@ [connectionErrorDialog orderOut:nil]; // If 'disconnect' was selected, trigger a window close. - if (connectionErrorCode == MCPConnectionCheckDisconnect) { + if (connectionErrorCode == SPMySQLConnectionLostDisconnect) { [self performSelectorOnMainThread:@selector(closeAndDisconnect) withObject:nil waitUntilDone:YES]; } } @@ -179,7 +173,7 @@ _isConnected = NO; if ([[[self parentTabViewItem] tabView] numberOfTabViewItems] == 1) { [theParentWindow orderOut:self]; - [theParentWindow setAlphaValue:0.0]; + [theParentWindow setAlphaValue:0.0f]; [theParentWindow performSelector:@selector(close) withObject:nil afterDelay:1.0]; } else { [[[self parentTabViewItem] tabView] performSelector:@selector(removeTabViewItem:) withObject:[self parentTabViewItem] afterDelay:0.5]; diff --git a/Source/SPCopyTable.m b/Source/SPCopyTable.m index 78773412..b5137935 100644 --- a/Source/SPCopyTable.m +++ b/Source/SPCopyTable.m @@ -22,11 +22,6 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#import <MCPKit/MCPKit.h> -#ifndef SP_REFACTOR /* headers */ -#import "MCPGeometryData.h" -#endif - #import "SPCopyTable.h" #import "SPTableContent.h" #import "SPTableTriggers.h" @@ -41,6 +36,7 @@ #import "SPBundleEditorController.h" #import "SPAppController.h" #import "SPTablesList.h" +#import "SPMySQL.h" NSInteger SPEditMenuCopy = 2001; NSInteger SPEditMenuCopyWithColumns = 2002; @@ -157,7 +153,7 @@ static const NSInteger kBlobAsImageFile = 4; // Loop through the rows, adding their descriptive contents NSUInteger rowIndex = [selectedRows firstIndex]; NSString *nullString = [prefs objectForKey:SPNullValue]; - Class mcpGeometryData = [MCPGeometryData class]; + Class spmysqlGeometryData = [SPMySQLGeometryData class]; NSUInteger rowCounter = 0; if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && tmpBlobFileDirectory && [tmpBlobFileDirectory length]) { @@ -210,7 +206,7 @@ static const NSInteger kBlobAsImageFile = 4; [result appendString:@"BLOB\t"]; } } - else if ([cellData isKindOfClass:mcpGeometryData]) { + else if ([cellData isKindOfClass:spmysqlGeometryData]) { if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && tmpBlobFileDirectory && [tmpBlobFileDirectory length]) { NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.pdf", tmpBlobFileDirectory, rowCounter, c]; SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[cellData coordinates]]; @@ -295,7 +291,7 @@ static const NSInteger kBlobAsImageFile = 4; // Loop through the rows, adding their descriptive contents NSUInteger rowIndex = [selectedRows firstIndex]; NSString *nullString = [prefs objectForKey:SPNullValue]; - Class mcpGeometryData = [MCPGeometryData class]; + Class spmysqlGeometryData = [SPMySQLGeometryData class]; NSUInteger rowCounter = 0; @@ -349,7 +345,7 @@ static const NSInteger kBlobAsImageFile = 4; [result appendString:@"\"BLOB\","]; } } - else if ([cellData isKindOfClass:mcpGeometryData]) { + else if ([cellData isKindOfClass:spmysqlGeometryData]) { if((withBlobHandling == kBlobAsFile || withBlobHandling == kBlobAsImageFile) && tmpBlobFileDirectory && [tmpBlobFileDirectory length]) { NSString *fp = [NSString stringWithFormat:@"%@/%ld_%ld.pdf", tmpBlobFileDirectory, rowCounter, c]; SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[cellData coordinates]]; @@ -511,15 +507,15 @@ static const NSInteger kBlobAsImageFile = 4; case 1: case 2: if ([cellData isKindOfClass:nsDataClass]) { - [value appendFormat:@"X'%@', ", [mySQLConnection prepareBinaryData:cellData]]; + [value appendString:[mySQLConnection escapeAndQuoteData:cellData]]; } else { - [value appendFormat:@"'%@', ", [mySQLConnection prepareString:[cellData description]]]; + [value appendString:[mySQLConnection escapeAndQuoteString:[cellData description]]]; } break; // GEOMETRY case 3: - [value appendFormat:@"X'%@', ", [mySQLConnection prepareBinaryData:[cellData data]]]; + [value appendString:[mySQLConnection escapeAndQuoteData:[cellData data]]]; break; // Unhandled cases - abort default: @@ -617,7 +613,7 @@ static const NSInteger kBlobAsImageFile = 4; NSUInteger rowIndex = [selectedRows firstIndex]; NSString *nullString = [prefs objectForKey:SPNullValue]; Class nsDataClass = [NSData class]; - Class mcpGeometryData = [MCPGeometryData class]; + Class spmysqlGeometryData = [SPMySQLGeometryData class]; NSStringEncoding connectionEncoding = [mySQLConnection stringEncoding]; while ( rowIndex != NSNotFound ) { @@ -639,7 +635,7 @@ static const NSInteger kBlobAsImageFile = 4; [displayString release]; } } - else if ([cellData isKindOfClass:mcpGeometryData]) { + else if ([cellData isKindOfClass:spmysqlGeometryData]) { [result appendFormat:@"%@\t", [cellData wktString]]; } else [result appendFormat:@"%@\t", [cellData description]]; @@ -705,7 +701,7 @@ static const NSInteger kBlobAsImageFile = 4; // Determine the available size NSScrollView *parentScrollView = (NSScrollView*)[[self superview] superview]; - CGFloat visibleTableWidth = [parentScrollView bounds].size.width - [NSScroller scrollerWidth] - [columnDefinitions count] * 3.5; + CGFloat visibleTableWidth = [parentScrollView bounds].size.width - [NSScroller scrollerWidth] - [columnDefinitions count] * 3.5f; for (NSDictionary *columnDefinition in columnDefinitions) { if ([[NSThread currentThread] isCancelled]) return nil; @@ -735,7 +731,7 @@ static const NSInteger kBlobAsImageFile = 4; for (NSString *columnIdentifier in columnIdentifiers) { columnWidth = [[columnWidths objectForKey:columnIdentifier] integerValue]; if (columnWidth > SP_MAX_CELL_WIDTH_MULTICOLUMN) { - columnWidth -= ceil((double)(columnWidth - SP_MAX_CELL_WIDTH_MULTICOLUMN) / availableWidthToReduce * widthToReduce); + columnWidth -= ceilf((double)(columnWidth - SP_MAX_CELL_WIDTH_MULTICOLUMN) / availableWidthToReduce * widthToReduce); [columnWidths setObject:[NSNumber numberWithUnsignedInteger:columnWidth] forKey:columnIdentifier]; } } @@ -764,13 +760,13 @@ static const NSInteger kBlobAsImageFile = 4; #endif NSUInteger columnIndex = (NSUInteger)[[columnDefinition objectForKey:@"datacolumnindex"] integerValue]; NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:tableFont forKey:NSFontAttributeName]; - Class mcpGeometryData = [MCPGeometryData class]; + Class spmysqlGeometryData = [SPMySQLGeometryData class]; // Check the number of rows available to check, sampling every n rows if ([tableStorage count] < rowsToCheck) rowStep = 1; else - rowStep = floor([tableStorage count] / rowsToCheck); + rowStep = floorf([tableStorage count] / rowsToCheck); rowsToCheck = [tableStorage count]; @@ -784,8 +780,8 @@ static const NSInteger kBlobAsImageFile = 4; // Retrieve the cell's content contentString = [tableStorage cellDataAtRow:i column:columnIndex]; - // Get WKT string out of the MCPGeometryData for calculation - if ([contentString isKindOfClass:mcpGeometryData]) + // Get WKT string out of the SPMySQLGeometryData for calculation + if ([contentString isKindOfClass:spmysqlGeometryData]) contentString = [contentString wktString]; // Replace NULLs with their placeholder string diff --git a/Source/SPCustomQuery.h b/Source/SPCustomQuery.h index aa78a250..1e330682 100644 --- a/Source/SPCustomQuery.h +++ b/Source/SPCustomQuery.h @@ -23,7 +23,6 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> #import <WebKit/WebKit.h> #import "SPCopyTable.h" @@ -47,9 +46,9 @@ #define SP_HISTORY_CLEAR_MENUITEM_TAG 300002 #ifndef SP_REFACTOR -@class SPCopyTable, SPQueryFavoriteManager, SPDataStorage, BWSplitView, SPFieldEditorController; +@class SPCopyTable, SPQueryFavoriteManager, SPDataStorage, BWSplitView, SPFieldEditorController, SPMySQLConnection, SPMySQLFastStreamingResult; #else -@class SPCopyTable, SPQueryFavoriteManager, SPDataStorage, NSSplitView, SPFieldEditorController; +@class SPCopyTable, SPQueryFavoriteManager, SPDataStorage, NSSplitView, SPFieldEditorController, SPMySQLConnection, SPMySQLFastStreamingResult; #endif @interface SPCustomQuery : NSObject @@ -129,7 +128,7 @@ SPQueryFavoriteManager *favoritesManager; NSUserDefaults *prefs; - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; NSString *usedQuery; NSRange currentQueryRange; @@ -221,7 +220,7 @@ - (IBAction)copyQueryHistory:(id)sender; - (IBAction)clearQueryHistory:(id)sender; - (IBAction)showCompletionList:(id)sender; -- (IBAction)toggleQueryInfoPaneCollapse:(id)sender; +- (IBAction)toggleQueryInfoPaneCollapse:(NSButton *)sender; // Query actions - (void)performQueries:(NSArray *)queries withCallback:(SEL)customQueryCallbackMethod; @@ -239,7 +238,7 @@ // Accessors - (NSArray *)currentResult; - (NSArray *)currentDataResultWithNULLs:(BOOL)includeNULLs; -- (void)processResultIntoDataStorage:(MCPStreamingResult *)theResult; +- (void)processResultIntoDataStorage:(SPMySQLFastStreamingResult *)theResult; // Retrieving and setting table state - (void) updateTableView; @@ -271,7 +270,7 @@ - (void)tableSortCallback; // Other -- (void)setConnection:(MCPConnection *)theConnection; +- (void)setConnection:(SPMySQLConnection *)theConnection; - (void)doPerformQueryService:(NSString *)query; - (void)doPerformLoadQueryService:(NSString *)query; - (void)selectCurrentQuery; diff --git a/Source/SPCustomQuery.m b/Source/SPCustomQuery.m index 61cac5f6..da15da11 100644 --- a/Source/SPCustomQuery.m +++ b/Source/SPCustomQuery.m @@ -25,6 +25,7 @@ #import "SPCustomQuery.h" #import "SPSQLParser.h" +#import "SPMySQL.h" #ifndef SP_REFACTOR /* headers */ #import "SPGrowlController.h" #endif @@ -47,6 +48,7 @@ #import "SPGeometryDataView.h" #import "SPAppController.h" #import "SPBundleHTMLOutputController.h" +#include <pthread.h> #ifndef SP_REFACTOR /* headers */ #import <BWToolkitFramework/BWToolkitFramework.h> @@ -540,7 +542,7 @@ /** * Toggle whether the query info pane is visible. */ -- (IBAction)toggleQueryInfoPaneCollapse:(id)sender +- (IBAction)toggleQueryInfoPaneCollapse:(NSButton *)sender { [queryInfoPaneSplitView toggleCollapse:sender]; @@ -585,12 +587,12 @@ - (void)performQueriesTask:(NSDictionary *)taskArguments { - NSAutoreleasePool *queryRunningPool = [[NSAutoreleasePool alloc] init]; - NSArray *queries = [taskArguments objectForKey:@"queries"]; - MCPStreamingResult *streamingResult = nil; - NSMutableString *errors = [NSMutableString string]; - SEL callbackMethod = NULL; - NSString *taskButtonString; + NSAutoreleasePool *queryRunningPool = [[NSAutoreleasePool alloc] init]; + NSArray *queries = [taskArguments objectForKey:@"queries"]; + SPMySQLFastStreamingResult *streamingResult = nil; + NSMutableString *errors = [NSMutableString string]; + SEL callbackMethod = NULL; + NSString *taskButtonString; NSUInteger i, totalQueriesRun = 0, totalAffectedRows = 0; double executionTime = 0; @@ -627,7 +629,7 @@ } // Disable automatic query retries on failure for the custom queries - [mySQLConnection setAllowQueryRetries:NO]; + [mySQLConnection setRetryQueriesOnConnectionFailure:NO]; NSUInteger queryCount = [queries count]; NSMutableArray *tempQueries = [NSMutableArray arrayWithCapacity:queryCount]; @@ -659,16 +661,16 @@ // Run the query, timing execution (note this also includes network and overhead) streamingResult = [[mySQLConnection streamingQueryString:query] retain]; - executionTime += [mySQLConnection lastQueryExecutionTime]; + executionTime += [streamingResult queryExecutionTime]; totalQueriesRun++; // If this is the last query, retrieve and store the result; otherwise, // discard the result without fully loading. - if (totalQueriesRun == queryCount || [mySQLConnection queryCancelled]) { + if (totalQueriesRun == queryCount || [mySQLConnection lastQueryWasCancelled]) { // Retrieve and cache the column definitions for the result array if (cqColumnDefinition) [cqColumnDefinition release]; - cqColumnDefinition = [[streamingResult fetchResultFieldsStructure] retain]; + cqColumnDefinition = [[streamingResult fieldDefinitions] retain]; if(!reloadingExistingResult) { [[self onMainThread] updateTableView]; @@ -695,24 +697,24 @@ } // Record any affected rows - if ( [mySQLConnection affectedRows] != (my_ulonglong)~0 ) - totalAffectedRows += (NSUInteger)[mySQLConnection affectedRows]; - else if ( [streamingResult numOfRows] ) - totalAffectedRows += (NSUInteger)[streamingResult numOfRows]; + if ( [mySQLConnection rowsAffectedByLastQuery] != (unsigned long long)~0 ) + totalAffectedRows += (NSUInteger)[mySQLConnection rowsAffectedByLastQuery]; + else if ( [streamingResult numberOfRows] ) + totalAffectedRows += (NSUInteger)[streamingResult numberOfRows]; [streamingResult release]; // Store any error messages - if ([mySQLConnection queryErrored] || [mySQLConnection queryCancelled]) { + if ([mySQLConnection queryErrored] || [mySQLConnection lastQueryWasCancelled]) { NSString *errorString; - if ([mySQLConnection queryCancelled]) { - if ([mySQLConnection queryCancellationUsedReconnect]) + if ([mySQLConnection lastQueryWasCancelled]) { + if ([mySQLConnection lastQueryWasCancelledUsingReconnect]) errorString = NSLocalizedString(@"Query cancelled. Please note that to cancel the query the connection had to be reset; transactions and connection variables were reset.", @"Query cancel by resetting connection error"); else errorString = NSLocalizedString(@"Query cancelled.", @"Query cancelled error"); } else { - errorString = [mySQLConnection getLastErrorMessage]; + errorString = [mySQLConnection lastErrorMessage]; } // If the query errored, append error to the error log for display at the end @@ -729,7 +731,7 @@ [[errorText onMainThread] setString:errors]; // ask the user to continue after detecting an error - if (![mySQLConnection queryCancelled]) { + if (![mySQLConnection lastQueryWasCancelled]) { [tableDocumentInstance setTaskIndicatorShouldAnimate:NO]; SPBeginWaitingAlertSheet(@"title", @@ -738,7 +740,7 @@ @selector(sheetDidEnd:returnCode:contextInfo:), @"runAllContinueStopSheet", NSLocalizedString(@"MySQL Error", @"mysql error message"), - [mySQLConnection getLastErrorMessage], + [mySQLConnection lastErrorMessage], &runAllContinueStopSheetReturnCode ); [tableDocumentInstance setTaskIndicatorShouldAnimate:YES]; @@ -771,7 +773,7 @@ databaseWasChanged = YES; } // If the query was cancelled, end all queries. - if ([mySQLConnection queryCancelled]) break; + if ([mySQLConnection lastQueryWasCancelled]) break; } // Reload table list if at least one query began with drop, alter, rename, or create @@ -800,7 +802,7 @@ if ( !queryCount ) { streamingResult = [mySQLConnection streamingQueryString:@""]; [streamingResult cancelResultLoad]; - [errors setString:[mySQLConnection getLastErrorMessage]]; + [errors setString:[mySQLConnection lastErrorMessage]]; } // add query to history @@ -817,7 +819,7 @@ // Set up the status string NSString *statusString = nil; NSString *statusErrorString = [errors length]?NSLocalizedString(@"Errors", @"Errors title"):NSLocalizedString(@"No errors", @"No errors title"); - if ( [mySQLConnection queryCancelled] ) { + if ( [mySQLConnection lastQueryWasCancelled] ) { if (totalQueriesRun > 1) { statusString = [NSString stringWithFormat:NSLocalizedString(@"%@; Cancelled in query %ld, after %@", @"text showing multiple queries were cancelled"), statusErrorString, @@ -862,7 +864,7 @@ [[affectedRowsText onMainThread] setStringValue:statusString]; // Restore automatic query retries - [mySQLConnection setAllowQueryRetries:YES]; + [mySQLConnection setRetryQueriesOnConnectionFailure:YES]; #ifndef SP_REFACTOR /* [tableDocumentInstance setQueryMode:] */ [tableDocumentInstance setQueryMode:SPInterfaceQueryMode]; @@ -937,9 +939,8 @@ /** * Processes a supplied streaming result set, loading it into the data array. */ -- (void)processResultIntoDataStorage:(MCPStreamingResult *)theResult +- (void)processResultIntoDataStorage:(SPMySQLFastStreamingResult *)theResult { - NSArray *tempRow; NSAutoreleasePool *dataLoadingPool; // Remove all items from the table @@ -951,7 +952,7 @@ // Set the column count on the data store before setting up anything else - // ensures that SPDataStorage is set up for timer-driven data loads - [resultData setColumnCount:[theResult numOfFields]]; + [resultData setColumnCount:[theResult numberOfFields]]; // Set up the table updates timer [[self onMainThread] initQueryLoadTimer]; @@ -960,10 +961,10 @@ dataLoadingPool = [[NSAutoreleasePool alloc] init]; // Loop through the result rows as they become available - while ((tempRow = [theResult fetchNextRowAsArray])) { + for (NSArray *eachRow in theResult) { pthread_mutex_lock(&resultDataLock); - SPDataStorageAddRow(resultData, tempRow); + SPDataStorageAddRow(resultData, eachRow); resultDataCount++; pthread_mutex_unlock(&resultDataLock); @@ -1289,7 +1290,7 @@ NSInteger firstErrorOccuredInQuery = [[errorDetails objectForKey:@"firstErrorQueryNumber"] integerValue]; // If errors occur, display them - if ( [mySQLConnection queryCancelled] || ([errorsString length] && !queryIsTableSorter)) { + if ( [mySQLConnection lastQueryWasCancelled] || ([errorsString length] && !queryIsTableSorter)) { // set the error text [errorText setString:[errorsString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; @@ -1300,7 +1301,7 @@ NSRange errorLineNumberRange = [errorsString rangeOfRegex:@"([0-9]+)[^0-9]*$" options:RKLNoOptions inRange:NSMakeRange(0, [errorsString length]) capture:1L error:nil]; // if error ID 1064 and a line number was found - if([mySQLConnection getLastErrorID] == 1064 && errorLineNumberRange.length) + if([mySQLConnection lastErrorID] == 1064 && errorLineNumberRange.length) { // Get the line number NSUInteger errorAtLine = [[errorsString substringWithRange:errorLineNumberRange] integerValue]; @@ -1508,7 +1509,7 @@ /** * Sets the connection (received from SPDatabaseDocument) and makes things that have to be done only once */ -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { mySQLConnection = theConnection; currentQueryRanges = nil; @@ -1764,7 +1765,7 @@ [tableDocumentInstance startTaskWithDescription:NSLocalizedString(@"Checking field data for editing...", @"checking field data for editing task description")]; // Actual check whether field can be identified bijectively - MCPResult *tempResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@.%@ %@", + SPMySQLResult *tempResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@.%@ %@", [[columnDefinition objectForKey:@"db"] backtickQuotedString], [tableForColumn backtickQuotedString], fieldIDQueryStr]]; @@ -1774,7 +1775,7 @@ return [NSArray arrayWithObjects:[NSNumber numberWithInteger:-1], @"", nil]; } - NSArray *tempRow = [tempResult fetchRowAsArray]; + NSArray *tempRow = [tempResult getRowAsArray]; if([tempRow count] && [[tempRow objectAtIndex:0] integerValue] > 1) { // try to identify the cell by using blob data @@ -1794,7 +1795,7 @@ return [NSArray arrayWithObjects:[NSNumber numberWithInteger:-1], @"", nil]; } - tempRow = [tempResult fetchRowAsArray]; + tempRow = [tempResult getRowAsArray]; if([tempRow count] && [[tempRow objectAtIndex:0] integerValue] < 1) { [tableDocumentInstance endTask]; @@ -1817,7 +1818,6 @@ - (NSString *)argumentForRow:(NSUInteger)rowIndex ofTable:(NSString *)tableForColumn andDatabase:(NSString *)database includeBlobs:(BOOL)includeBlobs { NSArray *dataRow; - NSDictionary *theRow; id field; NSMutableArray *argumentParts = [NSMutableArray array]; @@ -1832,17 +1832,14 @@ dataRow = [resultData rowContentsAtIndex:rowIndex]; // Get the primary key if there is one, using any columns present within it - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@.%@", + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@.%@", [database backtickQuotedString], [tableForColumn backtickQuotedString]]]; [theResult setReturnDataAsStrings:YES]; - if ([theResult numOfRows]) [theResult dataSeek:0]; NSMutableArray *primaryColumnsInSpecifiedTable = [NSMutableArray array]; - NSUInteger i; - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { - theRow = [theResult fetchRowAsDictionary]; - if ( [[theRow objectForKey:@"Key"] isEqualToString:@"PRI"] ) { + for (NSDictionary *eachRow in theResult) { + if ( [[eachRow objectForKey:@"Key"] isEqualToString:@"PRI"] ) { for (field in columnsInSpecifiedTable) { - if([[field objectForKey:@"org_name"] isEqualToString:[theRow objectForKey:@"Field"]]) { + if([[field objectForKey:@"org_name"] isEqualToString:[eachRow objectForKey:@"Field"]]) { [primaryColumnsInSpecifiedTable addObject:field]; } } @@ -1855,7 +1852,7 @@ // Build up the argument for (field in columnsToQuery) { id aValue = [dataRow objectAtIndex:[[field objectForKey:@"datacolumnindex"] integerValue]]; - if ([aValue isKindOfClass:[NSNull class]] || [aValue isNSNull]) { + if ([aValue isNSNull]) { [argumentParts addObject:[NSString stringWithFormat:@"%@ IS NULL", [[field objectForKey:@"org_name"] backtickQuotedString]]]; } else { NSString *fieldTypeGrouping = [field objectForKey:@"typegrouping"]; @@ -1875,14 +1872,14 @@ [argumentParts addObject:[NSString stringWithFormat:@"%@=b'%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [aValue description]]]; } else if ([fieldTypeGrouping isEqualToString:@"geometry"]) { - [argumentParts addObject:[NSString stringWithFormat:@"%@=X'%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection prepareBinaryData:[aValue data]]]]; + [argumentParts addObject:[NSString stringWithFormat:@"%@=%@", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection escapeAndQuoteData:[aValue data]]]]; } // BLOB/TEXT data else if ([aValue isKindOfClass:[NSData class]]) { - [argumentParts addObject:[NSString stringWithFormat:@"%@=X'%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection prepareBinaryData:aValue]]]; + [argumentParts addObject:[NSString stringWithFormat:@"%@=%@", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection escapeAndQuoteData:aValue]]]; } else { - [argumentParts addObject:[NSString stringWithFormat:@"%@='%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection prepareString:aValue]]]; + [argumentParts addObject:[NSString stringWithFormat:@"%@=%@", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection escapeAndQuoteString:aValue]]]; } } } @@ -1919,11 +1916,11 @@ NSString *newObject = nil; if ( [anObject isKindOfClass:[NSCalendarDate class]] ) { - newObject = [NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[anObject description]]]; + newObject = [mySQLConnection escapeAndQuoteString:[anObject description]]; } else if ( [anObject isKindOfClass:[NSNumber class]] ) { newObject = [anObject stringValue]; } else if ( [anObject isKindOfClass:[NSData class]] ) { - newObject = [NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:anObject]]; + newObject = [mySQLConnection escapeAndQuoteData:anObject]; } else { if ( [[anObject description] isEqualToString:@"CURRENT_TIMESTAMP"] ) { newObject = @"CURRENT_TIMESTAMP"; @@ -1940,7 +1937,7 @@ && [[anObject description] isEqualToString:@"NOW()"]) { newObject = @"NOW()"; } else { - newObject = [NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[anObject description]]]; + newObject = [mySQLConnection escapeAndQuoteString:[anObject description]]; } } @@ -1952,13 +1949,13 @@ // Check for errors while UPDATE if ([mySQLConnection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), NSLocalizedString(@"Cancel", @"cancel button"), nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't write field.\nMySQL said: %@", @"message of panel when error while updating field to db"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't write field.\nMySQL said: %@", @"message of panel when error while updating field to db"), [mySQLConnection lastErrorMessage]]); return; } // This shouldn't happen – for safety reasons - if ( ![mySQLConnection affectedRows] ) { + if ( ![mySQLConnection rowsAffectedByLastQuery] ) { #ifndef SP_REFACTOR if ( [prefs boolForKey:SPShowNoAffectedRowsError] ) { SPBeginAlertSheet(NSLocalizedString(@"Warning", @"warning"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, @@ -2335,7 +2332,7 @@ return nil; } } - else if ([theValue isKindOfClass:[MCPGeometryData class]]) { + else if ([theValue isKindOfClass:[SPMySQLGeometryData class]]) { SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[theValue coordinates]]; image = [v thumbnailImage]; if(image) { @@ -3070,7 +3067,7 @@ if(![searchString length]) return @""; NSRange aRange; - MCPResult *theResult = nil; + SPMySQLResult *theResult = nil; NSDictionary *tableDetails; NSMutableString *theHelp = [NSMutableString string]; @@ -3089,14 +3086,16 @@ return SP_HELP_NOT_AVAILABLE; } // nothing found? - if(![theResult numOfRows]) { + if(![theResult numberOfRows]) { + // try to search via: HELP 'searchString%' theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"HELP '%@%%'", [searchString stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"]]]; + // really nothing found? - if(![theResult numOfRows]) + if(![theResult numberOfRows]) return @""; } - tableDetails = [[NSDictionary alloc] initWithDictionary:[theResult fetchRowAsDictionary]]; + tableDetails = [[NSDictionary alloc] initWithDictionary:[theResult getRowAsDictionary]]; if ([tableDetails objectForKey:@"description"]) { // one single help topic found if ([tableDetails objectForKey:@"name"]) { @@ -3171,9 +3170,9 @@ } } else { // list all found topics - NSUInteger i; - NSUInteger r = (NSUInteger)[theResult numOfRows]; - if (r) [theResult dataSeek:0]; + NSUInteger r = (NSUInteger)[theResult numberOfRows]; + if (r) [theResult seekToRow:0]; + // check if HELP 'contents' is called if(![searchString isEqualToString:SP_HELP_TOC_SEARCH_STRING]) [theHelp appendFormat:@"<br><i>%@ “%@”</i><br>", NSLocalizedString(@"Help topics for", @"help topics for"), searchString]; @@ -3182,9 +3181,9 @@ // iterate through all found rows and print them as HTML ul/li list [theHelp appendString:@"<ul>"]; - for ( i = 0 ; i < r ; i++ ) { - NSArray *anArray = [theResult fetchRowAsArray]; - NSString *topic = [anArray objectAtIndex:[anArray count]-2]; + [theResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; + for (NSArray *eachRow in theResult) { + NSString *topic = [eachRow objectAtIndex:[eachRow count]-2]; [theHelp appendFormat:@"<li><a title='%@ “%@”' href='%@' class='internallink'>%@</a></li>", NSLocalizedString(@"Show MySQL help for", @"show mysql help for"), topic, topic, topic]; } @@ -4008,7 +4007,7 @@ value = [prefs objectForKey:SPNullValue]; } - if ([value isKindOfClass:[MCPGeometryData class]]) { + if ([value isKindOfClass:[SPMySQLGeometryData class]]) { value = [value wktString]; } diff --git a/Source/SPDBActionCommons.h b/Source/SPDBActionCommons.h index 6ff6e11c..7ae7ec79 100644 --- a/Source/SPDBActionCommons.h +++ b/Source/SPDBActionCommons.h @@ -22,18 +22,18 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +@class SPMySQLConnection; @interface SPDBActionCommons : NSObject { - MCPConnection *connection; + SPMySQLConnection *connection; NSWindow *messageWindow; } /** - * @property connection References the MCPKit connection to MySQL; it has to be set. + * @property connection References the SPMySQL.framework MySQL connection; it has to be set. */ -@property (retain) MCPConnection *connection; +@property (retain) SPMySQLConnection *connection; /** * @property messageWindow The NSWindow instance to send message sheets to. diff --git a/Source/SPDataImport.h b/Source/SPDataImport.h index 1b668be9..6bad573d 100644 --- a/Source/SPDataImport.h +++ b/Source/SPDataImport.h @@ -23,7 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +@class SPMySQLConnection; typedef enum { SPFieldMapperInProgress = 1, @@ -77,7 +77,7 @@ typedef enum { IBOutlet id singleProgressTitle; IBOutlet id singleProgressText; - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; NSMutableArray *nibObjectsToRelease; @@ -138,7 +138,7 @@ typedef enum { - (NSString *)mappedUpdateSetStatementStringForRowArray:(NSArray *)csvRowArray; // Additional methods -- (void)setConnection:(MCPConnection *)theConnection; +- (void)setConnection:(SPMySQLConnection *)theConnection; - (void)showErrorSheetWithMessage:(NSString*)message; // Import delegate notifications diff --git a/Source/SPDataImport.m b/Source/SPDataImport.m index 7f90eea7..e0917858 100644 --- a/Source/SPDataImport.m +++ b/Source/SPDataImport.m @@ -39,8 +39,8 @@ #import "SPFieldMapperController.h" #import "SPFileHandle.h" #import "SPEncodingPopupAccessory.h" +#import "SPMySQL.h" -#import <MCPKit/MCPKit.h> #import <UniversalDetector/UniversalDetector.h> #define SP_FILE_READ_ERROR_STRING NSLocalizedString(@"File read error", @"File read error title (Import Dialog)") @@ -424,9 +424,9 @@ [fileEncodingDetector analyzeData:[detectorFileHandle readDataOfLength:2500000]]; sqlEncoding = [fileEncodingDetector encoding]; [fileEncodingDetector release]; - if ([MCPConnection mySQLEncodingForStringEncoding:sqlEncoding]) { + if ([SPMySQLConnection mySQLCharsetForStringEncoding:sqlEncoding]) { connectionEncodingToRestore = [mySQLConnection encoding]; - [mySQLConnection queryString:[NSString stringWithFormat:@"SET NAMES '%@'", [MCPConnection mySQLEncodingForStringEncoding:sqlEncoding]]]; + [mySQLConnection queryString:[NSString stringWithFormat:@"SET NAMES '%@'", [SPMySQLConnection mySQLCharsetForStringEncoding:sqlEncoding]]]; } } @@ -564,11 +564,11 @@ if (![query length]) continue; // Run the query - [mySQLConnection queryString:query usingEncoding:sqlEncoding streamingResult:NO]; + [mySQLConnection queryString:query usingEncoding:sqlEncoding withResultType:SPMySQLResultAsResult]; // Check for any errors - if ([mySQLConnection queryErrored] && ![[mySQLConnection getLastErrorMessage] isEqualToString:@"Query was empty"]) { - [errors appendFormat:NSLocalizedString(@"[ERROR in query %ld] %@\n", @"error text when multiple custom query failed"), (long)(queriesPerformed+1), [mySQLConnection getLastErrorMessage]]; + if ([mySQLConnection queryErrored] && ![[mySQLConnection lastErrorMessage] isEqualToString:@"Query was empty"]) { + [errors appendFormat:NSLocalizedString(@"[ERROR in query %ld] %@\n", @"error text when multiple custom query failed"), (long)(queriesPerformed+1), [mySQLConnection lastErrorMessage]]; // If not set to ignore errors, ask what to do. Use NSAlert rather than // SPBeginWaitingAlertSheet as there is already a modal sheet in progress. @@ -580,7 +580,7 @@ defaultButton:NSLocalizedString(@"Continue", @"continue button") alternateButton:NSLocalizedString(@"Ignore All Errors", @"ignore errors button") otherButton:NSLocalizedString(@"Stop", @"stop button") - informativeTextWithFormat:NSLocalizedString(@"[ERROR in query %ld] %@\n", @"error text when multiple custom query failed"), (long)(queriesPerformed+1), [mySQLConnection getLastErrorMessage] + informativeTextWithFormat:NSLocalizedString(@"[ERROR in query %ld] %@\n", @"error text when multiple custom query failed"), (long)(queriesPerformed+1), [mySQLConnection lastErrorMessage] ]; [sqlErrorAlert setAlertStyle:NSWarningAlertStyle]; sqlImportErrorSheetReturnCode = [sqlErrorAlert runModal]; @@ -632,11 +632,11 @@ if ([query length] && !progressCancelled) { // Run the query - [mySQLConnection queryString:query usingEncoding:sqlEncoding streamingResult:NO]; + [mySQLConnection queryString:query usingEncoding:sqlEncoding withResultType:SPMySQLResultAsResult]; // Check for any errors - if ([mySQLConnection queryErrored] && ![[mySQLConnection getLastErrorMessage] isEqualToString:@"Query was empty"]) { - [errors appendFormat:NSLocalizedString(@"[ERROR in query %ld] %@\n", @"error text when multiple custom query failed"), (long)(queriesPerformed+1), [mySQLConnection getLastErrorMessage]]; + if ([mySQLConnection queryErrored] && ![[mySQLConnection lastErrorMessage] isEqualToString:@"Query was empty"]) { + [errors appendFormat:NSLocalizedString(@"[ERROR in query %ld] %@\n", @"error text when multiple custom query failed"), (long)(queriesPerformed+1), [mySQLConnection lastErrorMessage]]; } // Increment the processed queries count @@ -1067,10 +1067,10 @@ [tableDocumentInstance showConsole:nil]; [errors appendFormat: NSLocalizedString(@"[ERROR in row %ld] %@\n", @"error text when reading of csv file gave errors"), - (long)(rowsImported+1),[mySQLConnection getLastErrorMessage]]; + (long)(rowsImported+1),[mySQLConnection lastErrorMessage]]; } - if ( insertRemainingRowsAfterUpdate && ![mySQLConnection affectedRows]) { + if ( insertRemainingRowsAfterUpdate && ![mySQLConnection rowsAffectedByLastQuery]) { query = [[NSMutableString alloc] initWithString:insertRemainingBaseString]; [query appendString:[self mappedValueStringForRowArray:[parsedRows objectAtIndex:i]]]; @@ -1084,7 +1084,7 @@ if ([mySQLConnection queryErrored]) { [errors appendFormat: NSLocalizedString(@"[ERROR in row %ld] %@\n", @"error text when reading of csv file gave errors"), - (long)(rowsImported+1),[mySQLConnection getLastErrorMessage]]; + (long)(rowsImported+1),[mySQLConnection lastErrorMessage]]; } } @@ -1120,7 +1120,7 @@ if ([mySQLConnection queryErrored]) { [errors appendFormat: NSLocalizedString(@"[ERROR in row %ld] %@\n", @"error text when reading of csv file gave errors"), - (long)(rowsImported+1),[mySQLConnection getLastErrorMessage]]; + (long)(rowsImported+1),[mySQLConnection lastErrorMessage]]; } rowsImported++; if (fileIsCompressed) { @@ -1379,7 +1379,7 @@ if(fieldMappingArrayHasGlobalVariables && mapColumn >= numberOfImportDataColumns) { NSMutableString *globalVar = [NSMutableString string]; id insertItem = NSArrayObjectAtIndex(fieldMappingGlobalValueArray, mapColumn); - if([insertItem isKindOfClass:[NSNull class]]) { + if([insertItem isNSNull]) { [globalVar setString:@"NULL"]; } else if([insertItem isSPNotLoaded]) { [globalVar setString:@"NULL"]; @@ -1417,7 +1417,7 @@ if (cellData == [NSNull null]) { [setString appendString:@"NULL"]; } else { - [setString appendFormat:@"'%@'", [mySQLConnection prepareString:cellData]]; + [setString appendString:[mySQLConnection escapeAndQuoteString:cellData]]; } } } @@ -1431,7 +1431,7 @@ if(fieldMappingArrayHasGlobalVariables && mapColumn >= numberOfImportDataColumns) { NSMutableString *globalVar = [NSMutableString string]; id insertItem = NSArrayObjectAtIndex(fieldMappingGlobalValueArray, mapColumn); - if([insertItem isKindOfClass:[NSNull class]]) { + if([insertItem isNSNull]) { [globalVar setString:@"NULL"]; } else if([insertItem isSPNotLoaded]) { [globalVar setString:@"NULL"]; @@ -1469,7 +1469,8 @@ if (cellData == [NSNull null]) { [whereString appendString:@" IS NULL"]; } else { - [whereString appendFormat:@"='%@'", [mySQLConnection prepareString:cellData]]; + [whereString appendString:@"="]; + [whereString appendString:[mySQLConnection escapeAndQuoteString:cellData]]; } } } @@ -1505,7 +1506,7 @@ if(fieldMappingArrayHasGlobalVariables && mapColumn >= numberOfImportDataColumns) { NSMutableString *globalVar = [NSMutableString string]; id insertItem = NSArrayObjectAtIndex(fieldMappingGlobalValueArray, mapColumn); - if([insertItem isKindOfClass:[NSNull class]]) { + if([insertItem isNSNull]) { [globalVar setString:@"NULL"]; } else if([insertItem isSPNotLoaded]) { [globalVar setString:@"NULL"]; @@ -1549,9 +1550,10 @@ if([geometryFields count] && [geometryFieldsMapIndex containsIndex:i]) { [valueString appendString:[(NSString*)cellData getGeomFromTextString]]; } else if([bitFields count] && [bitFieldsMapIndex containsIndex:i]) { - [valueString appendFormat:@"b'%@'", [mySQLConnection prepareString:cellData]]; + [valueString appendString:@"b"]; + [valueString appendString:[mySQLConnection escapeAndQuoteString:cellData]]; } else { - [valueString appendFormat:@"'%@'", [mySQLConnection prepareString:cellData]]; + [valueString appendString:[mySQLConnection escapeAndQuoteString:cellData]]; } } } @@ -1636,7 +1638,7 @@ /** * Sets the connection (received from SPDatabaseDocument) and makes things that have to be done only once. */ -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { NSButtonCell *switchButton = [[NSButtonCell alloc] init]; diff --git a/Source/SPDatabaseCopy.m b/Source/SPDatabaseCopy.m index c2371f3d..61412f76 100644 --- a/Source/SPDatabaseCopy.m +++ b/Source/SPDatabaseCopy.m @@ -25,6 +25,7 @@ #import "SPDBActionCommons.h" #import "SPDatabaseCopy.h" #import "SPTableCopy.h" +#import "SPMySQL.h" @implementation SPDatabaseCopy @@ -58,7 +59,7 @@ if (sourceExists && !targetExists) { // Retrieve the list of tables/views/funcs/triggers from the source database - tables = [connection listTablesFromDB:sourceDatabaseName]; + tables = [connection tablesFromDatabase:sourceDatabaseName]; } else { return NO; diff --git a/Source/SPDatabaseData.h b/Source/SPDatabaseData.h index b0c988eb..e315ca6a 100644 --- a/Source/SPDatabaseData.h +++ b/Source/SPDatabaseData.h @@ -23,9 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPServerSupport; +@class SPServerSupport, SPMySQLConnection; /** * @class SPDatabaseData SPDatabaseData.h @@ -45,14 +43,14 @@ NSMutableArray *characterSetEncodings; NSMutableDictionary *cachedCollationsByEncoding; - MCPConnection *connection; + SPMySQLConnection *connection; SPServerSupport *serverSupport; } /** * @property connection The current database connection */ -@property (readwrite, assign) MCPConnection *connection; +@property (readwrite, assign) SPMySQLConnection *connection; /** * @property serverSupport The connection's associated SPServerSupport instance diff --git a/Source/SPDatabaseData.m b/Source/SPDatabaseData.m index 2aa809b1..2e827fa9 100644 --- a/Source/SPDatabaseData.m +++ b/Source/SPDatabaseData.m @@ -26,10 +26,11 @@ #import "SPDatabaseData.h" #import "SPServerSupport.h" #import "SPDatabaseCharacterSets.h" +#import "SPMySQL.h" @interface SPDatabaseData (PrivateAPI) -- (NSMutableArray *)_getDatabaseDataForQuery:(NSString *)query; +- (NSArray *)_getDatabaseDataForQuery:(NSString *)query; NSInteger _sortMySQL4CharsetEntry(NSDictionary *itemOne, NSDictionary *itemTwo, void *context); @@ -162,12 +163,12 @@ NSInteger _sortMySQL4CharsetEntry(NSDictionary *itemOne, NSDictionary *itemTwo, [storageEngines addObject:[NSDictionary dictionaryWithObject:@"MyISAM" forKey:@"Engine"]]; // Check if InnoDB support is enabled - MCPResult *result = [connection queryString:@"SHOW VARIABLES LIKE 'have_innodb'"]; + SPMySQLResult *result = [connection queryString:@"SHOW VARIABLES LIKE 'have_innodb'"]; [result setReturnDataAsStrings:YES]; - if ([result numOfRows] == 1) { - if ([[[result fetchRowAsDictionary] objectForKey:@"Value"] isEqualToString:@"YES"]) { + if ([result numberOfRows] == 1) { + if ([[[result getRowAsDictionary] objectForKey:@"Value"] isEqualToString:@"YES"]) { [storageEngines addObject:[NSDictionary dictionaryWithObject:@"InnoDB" forKey:@"Engine"]]; } } @@ -201,9 +202,9 @@ NSInteger _sortMySQL4CharsetEntry(NSDictionary *itemOne, NSDictionary *itemTwo, if ([serverSupport supportsInformationSchemaEngines]) { // Check the information_schema.engines table is accessible - MCPResult *result = [connection queryString:@"SHOW TABLES IN information_schema LIKE 'ENGINES'"]; + SPMySQLResult *result = [connection queryString:@"SHOW TABLES IN information_schema LIKE 'ENGINES'"]; - if ([result numOfRows] == 1) { + if ([result numberOfRows] == 1) { // Table is accessible so get available storage engines // Note, that the case of the column names specified in this query are important. @@ -212,7 +213,7 @@ NSInteger _sortMySQL4CharsetEntry(NSDictionary *itemOne, NSDictionary *itemTwo, } else { // Get storage engines - NSMutableArray *engines = [self _getDatabaseDataForQuery:@"SHOW STORAGE ENGINES"]; + NSArray *engines = [self _getDatabaseDataForQuery:@"SHOW STORAGE ENGINES"]; // We only want to include engines that are supported for (NSDictionary *engine in engines) @@ -308,22 +309,13 @@ NSInteger _sortMySQL4CharsetEntry(NSDictionary *itemOne, NSDictionary *itemTwo, * Executes the supplied query against the current connection and returns the result as an array of * NSDictionarys, one for each row. */ -- (NSMutableArray *)_getDatabaseDataForQuery:(NSString *)query +- (NSArray *)_getDatabaseDataForQuery:(NSString *)query { - NSMutableArray *array = [NSMutableArray array]; + SPMySQLResult *result = [connection queryString:query]; - MCPResult *result = [connection queryString:query]; + if ([connection queryErrored]) return [NSArray array]; - if (![connection queryErrored]) { - [result dataSeek:0]; - - for (NSUInteger i = 0; i < [result numOfRows]; i++) - { - [array addObject:[result fetchRowAsDictionary]]; - } - } - - return array; + return [result getAllRows]; } /** diff --git a/Source/SPDatabaseDocument.h b/Source/SPDatabaseDocument.h index b56991f5..2a03e589 100644 --- a/Source/SPDatabaseDocument.h +++ b/Source/SPDatabaseDocument.h @@ -25,7 +25,6 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> #ifndef SP_REFACTOR /* headers */ #import <WebKit/WebKit.h> #endif @@ -34,7 +33,7 @@ #ifndef SP_REFACTOR /* class forward decls */ SPProcessListController, SPServerVariablesController, SPUserManager, SPWindowController, #endif -SPDatabaseData, SPTablesList, SPTableStructure, SPTableContent, SPTableData, SPServerSupport, SPCustomQuery; +SPDatabaseData, SPTablesList, SPTableStructure, SPTableContent, SPTableData, SPServerSupport, SPCustomQuery, SPMySQLConnection; #import "SPConnectionControllerDelegateProtocol.h" @@ -102,7 +101,7 @@ SPDatabaseData, SPTablesList, SPTableStructure, SPTableContent, SPTableData, SPS IBOutlet id addDatabaseButton; IBOutlet id databaseCopyNameField; - IBOutlet id copyDatabaseDataButton; + IBOutlet NSButton *copyDatabaseDataButton; IBOutlet id copyDatabaseMessageField; IBOutlet id copyDatabaseButton; @@ -146,14 +145,14 @@ SPDatabaseData, SPTablesList, SPTableStructure, SPTableContent, SPTableData, SPS IBOutlet id inputTextWindowSecureTextField; NSInteger passwordSheetReturnCode; + // Master connection + SPMySQLConnection *mySQLConnection; + // Controllers SPConnectionController *connectionController; #ifndef SP_REFACTOR /* ivars */ SPProcessListController *processListController; SPServerVariablesController *serverVariablesController; -#endif - MCPConnection *mySQLConnection; -#ifndef SP_REFACTOR /* ivars */ NSInteger currentTabIndex; #endif @@ -222,7 +221,7 @@ SPDatabaseData, SPTablesList, SPTableStructure, SPTableContent, SPTableData, SPS #ifndef SP_REFACTOR /* ivars */ NSThread *printThread; - id statusValues; + NSArray *statusValues; NSInteger saveDocPrefSheetStatus; @@ -280,8 +279,8 @@ SPDatabaseData, SPTablesList, SPTableStructure, SPTableContent, SPTableData, SPS // Connection callback and methods #endif -- (void)setConnection:(MCPConnection *)theConnection; -- (MCPConnection *)getConnection; +- (void)setConnection:(SPMySQLConnection *)theConnection; +- (SPMySQLConnection *)getConnection; - (void)setKeychainID:(NSString *)theID; // Database methods diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m index 53d9b5c6..fef580ba 100644 --- a/Source/SPDatabaseDocument.m +++ b/Source/SPDatabaseDocument.m @@ -35,6 +35,8 @@ enum { #import "SPDatabaseDocument.h" #import "SPConnectionController.h" +#import "SPMySQL.h" + #import "SPTablesList.h" #import "SPTableStructure.h" #ifndef SP_REFACTOR /* headers */ @@ -393,7 +395,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; #pragma mark - #pragma mark Connection callback and methods -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { _isConnected = YES; mySQLConnection = [theConnection retain]; @@ -570,7 +572,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; * * @return The document's connection */ -- (MCPConnection *) getConnection +- (SPMySQLConnection *) getConnection { return mySQLConnection; } @@ -604,28 +606,22 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; [[chooseDatabaseButton menu] addItem:[NSMenuItem separatorItem]]; #endif - MCPResult *queryResult = [mySQLConnection listDBs]; - - if ([queryResult numOfRows]) [queryResult dataSeek:0]; - if (allDatabases) [allDatabases release]; if (allSystemDatabases) [allSystemDatabases release]; - allDatabases = [[NSMutableArray alloc] initWithCapacity:(NSUInteger)[queryResult numOfRows]]; + NSArray *theDatabaseList = [mySQLConnection databases]; + allDatabases = [[NSMutableArray alloc] initWithCapacity:[theDatabaseList count]]; allSystemDatabases = [[NSMutableArray alloc] initWithCapacity:2]; - for (NSUInteger i = 0 ; i < [queryResult numOfRows] ; i++) - { - NSString *database = NSArrayObjectAtIndex([queryResult fetchRowAsArray], 0); + for (NSString *databaseName in theDatabaseList) { - // If the database is either information_schema or mysql then it is classed as a system table - // 5.5.3+ performance_schema - if ([database isEqualToString:@"information_schema"] || [database isEqualToString:@"mysql"] || [database isEqualToString:@"performance_schema"]) { - [allSystemDatabases addObject:database]; - } - else { - [allDatabases addObject:database]; + // If the database is either information_schema or mysql then it is classed as a + // system table; similarly, for 5.5.3+, performance_schema + if ([databaseName isEqualToString:@"information_schema"] || [databaseName isEqualToString:@"mysql"] || [databaseName isEqualToString:@"performance_schema"]) { + [allSystemDatabases addObject:databaseName]; + } else { + [allDatabases addObject:databaseName]; } } @@ -984,15 +980,13 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; [[NSNotificationCenter defaultCenter] sequelProPostNotificationOnMainThreadWithName:@"SMySQLQueryWillBePerformed" object:self]; #endif - MCPResult *theResult = [mySQLConnection queryString:@"SELECT DATABASE()"]; + SPMySQLResult *theResult = [mySQLConnection queryString:@"SELECT DATABASE()"]; + [theResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; if (![mySQLConnection queryErrored]) { - NSInteger i; - NSInteger r = (NSInteger)[theResult numOfRows]; - if (r) [theResult dataSeek:0]; - for ( i = 0 ; i < r ; i++ ) { - dbName = NSArrayObjectAtIndex([theResult fetchRowAsArray], 0); + for (NSArray *eachRow in theResult) { + dbName = NSArrayObjectAtIndex(eachRow, 0); } - if(![dbName isKindOfClass:[NSNull class]]) { + if(![dbName isNSNull]) { if(![dbName isEqualToString:selectedDatabase]) { if (selectedDatabase) [selectedDatabase release], selectedDatabase = nil; selectedDatabase = [[NSString alloc] initWithString:dbName]; @@ -1557,7 +1551,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; */ - (void)detectDatabaseEncoding { - MCPResult *charSetResult; + SPMySQLResult *charSetResult; NSString *mysqlEncoding = nil; _supportsEncoding = YES; @@ -1566,11 +1560,11 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if ([serverSupport supportsCharacterSetDatabaseVar]) { charSetResult = [mySQLConnection queryString:@"SHOW VARIABLES LIKE 'character_set_database'"]; [charSetResult setReturnDataAsStrings:YES]; - mysqlEncoding = [[charSetResult fetchRowAsDictionary] objectForKey:@"Value"]; + mysqlEncoding = [[charSetResult getRowAsDictionary] objectForKey:@"Value"]; } // MySQL 4.0 or older -> only default character set possible, cannot choose others using "set names xy" else { - mysqlEncoding = [[[mySQLConnection queryString:@"SHOW VARIABLES LIKE 'character_set'"] fetchRowAsDictionary] objectForKey:@"Value"]; + mysqlEncoding = [[[mySQLConnection queryString:@"SHOW VARIABLES LIKE 'character_set'"] getRowAsDictionary] objectForKey:@"Value"]; } [selectedDatabaseEncoding release]; @@ -1656,13 +1650,13 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; return; } - MCPResult *theResult = [mySQLConnection queryString:query]; + SPMySQLResult *theResult = [mySQLConnection queryString:query]; [theResult setReturnDataAsStrings:YES]; // Check for errors, only displaying if the connection hasn't been terminated if ([mySQLConnection queryErrored]) { if ([mySQLConnection isConnected]) { - NSRunAlertPanel(@"Error", [NSString stringWithFormat:NSLocalizedString(@"An error occured while creating table syntax.\n\n: %@", @"Error shown when unable to show create table syntax"),[mySQLConnection getLastErrorMessage]], @"OK", nil, nil); + NSRunAlertPanel(@"Error", [NSString stringWithFormat:NSLocalizedString(@"An error occured while creating table syntax.\n\n: %@", @"Error shown when unable to show create table syntax"), [mySQLConnection lastErrorMessage]], @"OK", nil, nil); } return; @@ -1670,9 +1664,9 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; NSString *tableSyntax; if (type == SPTableTypeProc) - tableSyntax = [NSString stringWithFormat:@"DELIMITER ;;\n%@;;\nDELIMITER ", [[theResult fetchRowAsArray] objectAtIndex:colOffs]]; + tableSyntax = [NSString stringWithFormat:@"DELIMITER ;;\n%@;;\nDELIMITER ", [[theResult getRowAsArray] objectAtIndex:colOffs]]; else - tableSyntax = [[theResult fetchRowAsArray] objectAtIndex:colOffs]; + tableSyntax = [[theResult getRowAsArray] objectAtIndex:colOffs]; // A NULL value indicates that the user does not have permission to view the syntax if ([tableSyntax isNSNull]) { @@ -1755,7 +1749,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([selectedItems count] == 0) return; - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"CHECK TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"CHECK TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; NSString *what = ([selectedItems count]>1) ? NSLocalizedString(@"selected items", @"selected items") : [NSString stringWithFormat:@"%@ '%@'", NSLocalizedString(@"table", @"table"), [self table]]; @@ -1768,7 +1762,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to check the %@.\n\nMySQL said:%@",@"an error occurred while trying to check the %@.\n\nMySQL said:%@"), what, [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to check the %@.\n\nMySQL said:%@",@"an error occurred while trying to check the %@.\n\nMySQL said:%@"), what, [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:parentWindow modalDelegate:self didEndSelector:NULL @@ -1778,10 +1772,10 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; return; } - NSDictionary *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; + NSArray *resultStatuses = [theResult getAllRows]; BOOL statusOK = YES; - for(id res in result) { - if(![[res objectForKey:@"Msg_type"] isEqualToString:@"status"]) { + for (NSDictionary *eachRow in theResult) { + if (![[eachRow objectForKey:@"Msg_type"] isEqualToString:@"status"]) { statusOK = NO; break; } @@ -1789,7 +1783,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; // Process result if([selectedItems count] == 1) { - NSDictionary *lastresult = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject]; + NSDictionary *lastresult = [resultStatuses lastObject]; message = ([[lastresult objectForKey:@"Msg_type"] isEqualToString:@"status"]) ? NSLocalizedString(@"Check table successfully passed.",@"check table successfully passed message") : NSLocalizedString(@"Check table failed.", @"check table failed message"); @@ -1811,7 +1805,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } else { message = NSLocalizedString(@"MySQL said:",@"mysql said message"); if (statusValues) [statusValues release], statusValues = nil; - statusValues = [result retain]; + statusValues = [resultStatuses retain]; NSAlert *alert = [[NSAlert new] autorelease]; [alert setInformativeText:message]; [alert setMessageText:NSLocalizedString(@"Error while checking selected items", @"error while checking selected items message")]; @@ -1831,7 +1825,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([selectedItems count] == 0) return; - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"ANALYZE TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"ANALYZE TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; NSString *what = ([selectedItems count]>1) ? NSLocalizedString(@"selected items", @"selected items") : [NSString stringWithFormat:@"%@ '%@'", NSLocalizedString(@"table", @"table"), [self table]]; @@ -1844,7 +1838,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while analyzing the %@.\n\nMySQL said:%@",@"an error occurred while analyzing the %@.\n\nMySQL said:%@"), what, [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while analyzing the %@.\n\nMySQL said:%@",@"an error occurred while analyzing the %@.\n\nMySQL said:%@"), what, [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:parentWindow modalDelegate:self didEndSelector:NULL @@ -1854,18 +1848,18 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; return; } - NSDictionary *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; + NSArray *resultStatuses = [theResult getAllRows]; BOOL statusOK = YES; - for(id res in result) { - if(![[res objectForKey:@"Msg_type"] isEqualToString:@"status"]) { + for (NSDictionary *eachRow in resultStatuses) { + if(![[eachRow objectForKey:@"Msg_type"] isEqualToString:@"status"]) { statusOK = NO; break; } } // Process result - if([selectedItems count] == 1) { - NSDictionary *lastresult = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject]; + if ([selectedItems count] == 1) { + NSDictionary *lastresult = [resultStatuses lastObject]; message = ([[lastresult objectForKey:@"Msg_type"] isEqualToString:@"status"]) ? NSLocalizedString(@"Successfully analyzed table.",@"analyze table successfully passed message") : NSLocalizedString(@"Analyze table failed.", @"analyze table failed message"); @@ -1887,7 +1881,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } else { message = NSLocalizedString(@"MySQL said:",@"mysql said message"); if (statusValues) [statusValues release], statusValues = nil; - statusValues = [result retain]; + statusValues = [resultStatuses retain]; NSAlert *alert = [[NSAlert new] autorelease]; [alert setInformativeText:message]; [alert setMessageText:NSLocalizedString(@"Error while analyzing selected items", @"error while analyzing selected items message")]; @@ -1907,7 +1901,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([selectedItems count] == 0) return; - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"OPTIMIZE TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"OPTIMIZE TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; NSString *what = ([selectedItems count]>1) ? NSLocalizedString(@"selected items", @"selected items") : [NSString stringWithFormat:@"%@ '%@'", NSLocalizedString(@"table", @"table"), [self table]]; @@ -1920,7 +1914,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while optimzing the %@.\n\nMySQL said:%@",@"an error occurred while trying to optimze the %@.\n\nMySQL said:%@"), what, [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while optimzing the %@.\n\nMySQL said:%@",@"an error occurred while trying to optimze the %@.\n\nMySQL said:%@"), what, [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:parentWindow modalDelegate:self didEndSelector:NULL @@ -1930,18 +1924,18 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; return; } - NSDictionary *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; + NSArray *resultStatuses = [theResult getAllRows]; BOOL statusOK = YES; - for(id res in result) { - if(![[res objectForKey:@"Msg_type"] isEqualToString:@"status"]) { + for (NSDictionary *eachRow in resultStatuses) { + if (![[eachRow objectForKey:@"Msg_type"] isEqualToString:@"status"]) { statusOK = NO; break; } } // Process result - if([selectedItems count] == 1) { - NSDictionary *lastresult = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject]; + if ([selectedItems count] == 1) { + NSDictionary *lastresult = [resultStatuses lastObject]; message = ([[lastresult objectForKey:@"Msg_type"] isEqualToString:@"status"]) ? NSLocalizedString(@"Successfully optimized table.",@"optimize table successfully passed message") : NSLocalizedString(@"Optimize table failed.", @"optimize table failed message"); @@ -1963,7 +1957,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } else { message = NSLocalizedString(@"MySQL said:",@"mysql said message"); if (statusValues) [statusValues release], statusValues = nil; - statusValues = [result retain]; + statusValues = [resultStatuses retain]; NSAlert *alert = [[NSAlert new] autorelease]; [alert setInformativeText:message]; [alert setMessageText:NSLocalizedString(@"Error while optimizing selected items", @"error while optimizing selected items message")]; @@ -1982,7 +1976,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([selectedItems count] == 0) return; - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"REPAIR TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"REPAIR TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; NSString *what = ([selectedItems count]>1) ? NSLocalizedString(@"selected items", @"selected items") : [NSString stringWithFormat:@"%@ '%@'", NSLocalizedString(@"table", @"table"), [self table]]; @@ -1995,7 +1989,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while repairing the %@.\n\nMySQL said:%@",@"an error occurred while trying to repair the %@.\n\nMySQL said:%@"), what, [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while repairing the %@.\n\nMySQL said:%@",@"an error occurred while trying to repair the %@.\n\nMySQL said:%@"), what, [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:parentWindow modalDelegate:self didEndSelector:NULL @@ -2005,18 +1999,18 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; return; } - NSDictionary *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; + NSArray *resultStatuses = [theResult getAllRows]; BOOL statusOK = YES; - for(id res in result) { - if(![[res objectForKey:@"Msg_type"] isEqualToString:@"status"]) { + for (NSDictionary *eachRow in resultStatuses) { + if (![[eachRow objectForKey:@"Msg_type"] isEqualToString:@"status"]) { statusOK = NO; break; } } // Process result - if([selectedItems count] == 1) { - NSDictionary *lastresult = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject]; + if ([selectedItems count] == 1) { + NSDictionary *lastresult = [resultStatuses lastObject]; message = ([[lastresult objectForKey:@"Msg_type"] isEqualToString:@"status"]) ? NSLocalizedString(@"Successfully repaired table.",@"repair table successfully passed message") : NSLocalizedString(@"Repair table failed.", @"repair table failed message"); @@ -2025,7 +2019,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; message = NSLocalizedString(@"Successfully repaired all selected items.",@"successfully repaired all selected items message"); } - if(message) { + if (message) { [[NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Repair %@", @"REPAIR one or more tables - result title"), what] defaultButton:@"OK" alternateButton:nil @@ -2038,7 +2032,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } else { message = NSLocalizedString(@"MySQL said:",@"mysql said message"); if (statusValues) [statusValues release], statusValues = nil; - statusValues = [result retain]; + statusValues = [resultStatuses retain]; NSAlert *alert = [[NSAlert new] autorelease]; [alert setInformativeText:message]; [alert setMessageText:NSLocalizedString(@"Error while repairing selected items", @"error while repairing selected items message")]; @@ -2057,7 +2051,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([selectedItems count] == 0) return; - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"FLUSH TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"FLUSH TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; NSString *what = ([selectedItems count]>1) ? NSLocalizedString(@"selected items", @"selected items") : [NSString stringWithFormat:@"%@ '%@'", NSLocalizedString(@"table", @"table"), [self table]]; @@ -2070,7 +2064,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while flushing the %@.\n\nMySQL said:%@",@"an error occurred while trying to flush the %@.\n\nMySQL said:%@"), what, [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while flushing the %@.\n\nMySQL said:%@",@"an error occurred while trying to flush the %@.\n\nMySQL said:%@"), what, [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:parentWindow modalDelegate:self didEndSelector:NULL @@ -2080,18 +2074,18 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; return; } - NSDictionary *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; + NSArray *resultStatuses = [theResult getAllRows]; BOOL statusOK = YES; - for(id res in result) { - if(![[res objectForKey:@"Msg_type"] isEqualToString:@"status"]) { + for (NSDictionary *eachRow in resultStatuses) { + if (![[eachRow objectForKey:@"Msg_type"] isEqualToString:@"status"]) { statusOK = NO; break; } } // Process result - if([selectedItems count] == 1) { - NSDictionary *lastresult = [[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject]; + if ([selectedItems count] == 1) { + NSDictionary *lastresult = [resultStatuses lastObject]; message = ([[lastresult objectForKey:@"Msg_type"] isEqualToString:@"status"]) ? NSLocalizedString(@"Successfully flushed table.",@"flush table successfully passed message") : NSLocalizedString(@"Flush table failed.", @"flush table failed message"); @@ -2100,7 +2094,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; message = NSLocalizedString(@"Successfully flushed all selected items.",@"successfully flushed all selected items message"); } - if(message) { + if (message) { [[NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Flush %@", @"FLUSH one or more tables - result title"), what] defaultButton:@"OK" alternateButton:nil @@ -2113,7 +2107,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } else { message = NSLocalizedString(@"MySQL said:",@"mysql said message"); if (statusValues) [statusValues release], statusValues = nil; - statusValues = [result retain]; + statusValues = [resultStatuses retain]; NSAlert *alert = [[NSAlert new] autorelease]; [alert setInformativeText:message]; [alert setMessageText:NSLocalizedString(@"Error while flushing selected items", @"error while flushing selected items message")]; @@ -2132,7 +2126,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([selectedItems count] == 0) return; - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"CHECKSUM TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"CHECKSUM TABLE %@", [selectedItems componentsJoinedAndBacktickQuoted]]]; NSString *what = ([selectedItems count]>1) ? NSLocalizedString(@"selected items", @"selected items") : [NSString stringWithFormat:@"%@ '%@'", NSLocalizedString(@"table", @"table"), [self table]]; @@ -2144,7 +2138,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while performing the checksum on %@.\n\nMySQL said:%@",@"an error occurred while performing the checksum on the %@.\n\nMySQL said:%@"), what, [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while performing the checksum on %@.\n\nMySQL said:%@",@"an error occurred while performing the checksum on the %@.\n\nMySQL said:%@"), what, [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:parentWindow modalDelegate:self didEndSelector:NULL @@ -2155,8 +2149,9 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } // Process result - if([selectedItems count] == 1) { - message = [[[theResult fetch2DResultAsType:MCPTypeDictionary] lastObject] objectForKey:@"Checksum"]; + NSArray *resultStatuses = [theResult getAllRows]; + if ([selectedItems count] == 1) { + message = [[resultStatuses lastObject] objectForKey:@"Checksum"]; [[NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Checksum %@",@"checksum %@ message"), what] defaultButton:@"OK" alternateButton:nil @@ -2167,9 +2162,8 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; didEndSelector:NULL contextInfo:NULL]; } else { - NSDictionary *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; if (statusValues) [statusValues release], statusValues = nil; - statusValues = [result retain]; + statusValues = [resultStatuses retain]; NSAlert *alert = [[NSAlert new] autorelease]; [alert setInformativeText:[NSString stringWithFormat:NSLocalizedString(@"Checksums of %@",@"Checksums of %@ message"), what]]; [alert setMessageText:NSLocalizedString(@"Table checksum",@"table checksum message")]; @@ -2297,9 +2291,9 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } // Before displaying the user manager make sure the current user has access to the mysql.user table. - MCPResult *result = [mySQLConnection queryString:@"SELECT * FROM `mysql`.`user` ORDER BY `user`"]; + SPMySQLResult *result = [mySQLConnection queryString:@"SELECT * FROM `mysql`.`user` ORDER BY `user`"]; - if ([mySQLConnection queryErrored] && ([result numOfRows] == 0)) { + if ([mySQLConnection queryErrored] && ([result numberOfRows] == 0)) { NSAlert *alert = [NSAlert alertWithMessageText:NSLocalizedString(@"Unable to get list of users", @"unable to get list of users message") defaultButton:NSLocalizedString(@"OK", @"OK button") @@ -2357,7 +2351,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; SPBeginAlertSheet(NSLocalizedString(@"Flushed Privileges", @"title of panel when successfully flushed privs"), NSLocalizedString(@"OK", @"OK button"), nil, nil, parentWindow, self, nil, nil, NSLocalizedString(@"Successfully flushed privileges.", @"message of panel when successfully flushed privs")); } else { //error while flushing privileges - SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, parentWindow, self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Couldn't flush privileges.\nMySQL said: %@", @"message of panel when flushing privs failed"), [mySQLConnection getLastErrorMessage]]); + SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, parentWindow, self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Couldn't flush privileges.\nMySQL said: %@", @"message of panel when flushing privs failed"), [mySQLConnection lastErrorMessage]]); } } @@ -5088,7 +5082,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } // Get create syntax - MCPResult *queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE %@ %@", + SPMySQLResult *queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE %@ %@", itemTypeStr, [item backtickQuotedString] ]]; @@ -5096,15 +5090,15 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if (changeEncoding) [mySQLConnection restoreStoredEncoding]; - if ( ![queryResult numOfRows] ) { + if ( ![queryResult numberOfRows] ) { //error while getting table structure SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't get create syntax.\nMySQL said: %@", @"message of panel when table information cannot be retrieved"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't get create syntax.\nMySQL said: %@", @"message of panel when table information cannot be retrieved"), [mySQLConnection lastErrorMessage]]); status = @"1"; } else { - NSString *syntaxString = [[queryResult fetchRowAsArray] objectAtIndex:queryCol]; + NSString *syntaxString = [[queryResult getRowAsArray] objectAtIndex:queryCol]; // A NULL value indicates that the user does not have permission to view the syntax if ([syntaxString isNSNull]) { @@ -5179,21 +5173,21 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; SPFileHandle *fh = [SPFileHandle fileHandleForWritingAtPath:resultFileName]; if(!fh) NSLog(@"Couldn't create file handle to %@", resultFileName); - MCPStreamingResult *theResult = [mySQLConnection streamingQueryString:query]; + SPMySQLResult *theResult = [mySQLConnection streamingQueryString:query]; [theResult setReturnDataAsStrings:YES]; if ([mySQLConnection queryErrored]) { - [fh writeData:[[NSString stringWithFormat:@"MySQL said: %@", [mySQLConnection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; + [fh writeData:[[NSString stringWithFormat:@"MySQL said: %@", [mySQLConnection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; status = @"1"; } else { // write header if(writeAsCsv) - [fh writeData:[[[theResult fetchFieldNames] componentsJoinedAsCSV] dataUsingEncoding:NSUTF8StringEncoding]]; + [fh writeData:[[[theResult fieldNames] componentsJoinedAsCSV] dataUsingEncoding:NSUTF8StringEncoding]]; else - [fh writeData:[[[theResult fetchFieldNames] componentsJoinedByString:@"\t"] dataUsingEncoding:NSUTF8StringEncoding]]; + [fh writeData:[[[theResult fieldNames] componentsJoinedByString:@"\t"] dataUsingEncoding:NSUTF8StringEncoding]]; [fh writeData:[[NSString stringWithString:@"\n"] dataUsingEncoding:NSUTF8StringEncoding]]; - NSArray *columnDefinition = [theResult fetchResultFieldsStructure]; + NSArray *columnDefinition = [theResult fieldDefinitions]; // Write table meta data NSMutableString *tableMetaData = [NSMutableString string]; @@ -5221,10 +5215,10 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; NSUInteger i, j; NSArray *theRow; NSMutableString *result = [NSMutableString string]; - if(writeAsCsv) { - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { + if (writeAsCsv) { + for ( i = 0 ; i < [theResult numberOfRows] ; i++ ) { [result setString:@""]; - theRow = [theResult fetchNextRowAsArray]; + theRow = [theResult getRowAsArray]; for( j = 0 ; j < [theRow count] ; j++ ) { NSEvent* event = [NSApp currentEvent]; @@ -5238,9 +5232,9 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([result length]) [result appendString:@","]; id cell = NSArrayObjectAtIndex(theRow, j); - if([cell isKindOfClass:[NSNull class]]) + if([cell isNSNull]) [result appendString:@"\"NULL\""]; - else if([cell isKindOfClass:[MCPGeometryData class]]) + else if([cell isKindOfClass:[SPMySQLGeometryData class]]) [result appendFormat:@"\"%@\"", [cell wktString]]; else if([cell isKindOfClass:[NSData class]]) { NSString *displayString = [[NSString alloc] initWithData:cell encoding:[mySQLConnection stringEncoding]]; @@ -5261,9 +5255,9 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; } } else { - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { + for ( i = 0 ; i < [theResult numberOfRows] ; i++ ) { [result setString:@""]; - theRow = [theResult fetchNextRowAsArray]; + theRow = [theResult getRowAsArray]; for( j = 0 ; j < [theRow count] ; j++ ) { NSEvent* event = [NSApp currentEvent]; @@ -5277,9 +5271,9 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if([result length]) [result appendString:@"\t"]; id cell = NSArrayObjectAtIndex(theRow, j); - if([cell isKindOfClass:[NSNull class]]) + if([cell isNSNull]) [result appendString:@"NULL"]; - else if([cell isKindOfClass:[MCPGeometryData class]]) + else if([cell isKindOfClass:[SPMySQLGeometryData class]]) [result appendFormat:@"%@", [cell wktString]]; else if([cell isKindOfClass:[NSData class]]) { NSString *displayString = [[NSString alloc] initWithData:cell encoding:[mySQLConnection stringEncoding]]; @@ -5817,13 +5811,13 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; if ([mySQLConnection queryErrored]) { // An error occurred - SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, parentWindow, self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Couldn't create database.\nMySQL said: %@", @"message of panel when creation of db failed"), [mySQLConnection getLastErrorMessage]]); + SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, parentWindow, self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Couldn't create database.\nMySQL said: %@", @"message of panel when creation of db failed"), [mySQLConnection lastErrorMessage]]); return; } // Error while selecting the new database (is this even possible?) - if (![mySQLConnection selectDB:[databaseNameField stringValue]] ) { + if (![mySQLConnection selectDatabase:[databaseNameField stringValue]] ) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, parentWindow, self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to database %@.\nBe sure that you have the necessary privileges.", @"message of panel when connection to db failed after selecting from popupbutton"), [databaseNameField stringValue]]); [self setDatabases:self]; @@ -5871,7 +5865,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; [self performSelector:@selector(showErrorSheetWith:) withObject:[NSArray arrayWithObjects:NSLocalizedString(@"Error", @"error"), [NSString stringWithFormat:NSLocalizedString(@"Couldn't delete the database.\nMySQL said: %@", @"message of panel when deleting db failed"), - [mySQLConnection getLastErrorMessage]], + [mySQLConnection lastErrorMessage]], nil] afterDelay:0.3]; @@ -5882,6 +5876,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; // do to threading we have to delete it from 'allDatabases' directly // before calling navigator [allDatabases removeObject:[self database]]; + // This only deletes the db and refreshes the navigator since nothing is changed // that's why we can run this on main thread [mySQLConnection queryDbStructureWithUserInfo:nil]; @@ -5935,7 +5930,7 @@ static NSString *SPCreateSyntx = @"SPCreateSyntax"; // Attempt to select the specified database, and abort on failure #ifndef SP_REFACTOR /* patch */ if ([chooseDatabaseButton indexOfItemWithTitle:targetDatabaseName] == NSNotFound - || ![mySQLConnection selectDB:targetDatabaseName]) + || ![mySQLConnection selectDatabase:targetDatabaseName]) #else if ( ![mySQLConnection selectDB:targetDatabaseName] ) #endif diff --git a/Source/SPDatabaseInfo.m b/Source/SPDatabaseInfo.m index 3c70aec9..fc487718 100644 --- a/Source/SPDatabaseInfo.m +++ b/Source/SPDatabaseInfo.m @@ -24,6 +24,7 @@ #import "SPDBActionCommons.h" #import "SPDatabaseInfo.h" +#import "SPMySQL.h" @implementation SPDatabaseInfo @@ -36,40 +37,12 @@ - (NSArray *)listDBs { - return [self listDBsLike:nil]; + return [connection databases]; } - (NSArray *)listDBsLike:(NSString *)dbsName { - NSString *listDBStatement = nil; - - if ((dbsName == nil) || ([dbsName isEqualToString:@""])) { - listDBStatement = [NSString stringWithFormat:@"SHOW DATABASES"]; - } - else { - listDBStatement = [NSString stringWithFormat:@"SHOW DATABASES LIKE %@", [dbsName backtickQuotedString]]; - } - - MCPResult *theResult = [connection queryString:listDBStatement]; - - if ([connection queryErrored]) return NO; - - NSMutableArray *names = [NSMutableArray array]; - NSMutableString *name; - - if ([theResult numOfRows] > 1) { - - NSUInteger i; - - for (i = 0 ; i < [theResult numOfRows]; i++) - { - name = [[theResult fetchRowAsArray] objectAtIndex:0]; - - [names addObject:name]; - } - } - - return names; + return [connection databasesLike:dbsName]; } @end diff --git a/Source/SPDatabaseRename.m b/Source/SPDatabaseRename.m index b7aa3f73..1877e955 100644 --- a/Source/SPDatabaseRename.m +++ b/Source/SPDatabaseRename.m @@ -26,6 +26,7 @@ #import "SPDatabaseRename.h" #import "SPTableCopy.h" #import "SPDatabaseInfo.h" +#import "SPMySQL.h" @implementation SPDatabaseRename @@ -59,7 +60,7 @@ if (sourceExists && !targetExists) { // Retrieve the list of tables/views/funcs/triggers from the source database - tables = [connection listTablesFromDB:sourceDatabaseName]; + tables = [connection tablesFromDatabase:sourceDatabaseName]; } else { return NO; @@ -78,7 +79,7 @@ [dbActionTableCopy release]; - tables = [connection listTablesFromDB:sourceDatabaseName]; + tables = [connection tablesFromDatabase:sourceDatabaseName]; if ([tables count] == 0) { [self dropDatabase:sourceDatabaseName]; diff --git a/Source/SPDatabaseViewController.m b/Source/SPDatabaseViewController.m index 19716a22..41e95a38 100644 --- a/Source/SPDatabaseViewController.m +++ b/Source/SPDatabaseViewController.m @@ -32,6 +32,7 @@ #import "SPTableData.h" #import "SPTablesList.h" #import "SPTableTriggers.h" +#import "SPMySQL.h" #ifdef SP_REFACTOR /* headers */ #import "SPTableStructure.h" #endif diff --git a/Source/SPEditorPreferencePane.m b/Source/SPEditorPreferencePane.m index f2802180..3c948e74 100644 --- a/Source/SPEditorPreferencePane.m +++ b/Source/SPEditorPreferencePane.m @@ -281,14 +281,14 @@ static NSString *SPCustomColorSchemeNameLC = @"user-defined"; [[NSColorPanel sharedColorPanel] close]; [prefs setObject:SPDefaultColorSchemeName forKey:SPCustomQueryEditorThemeName]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.000 green:0.455 blue:0.000 alpha:1.000]] forKey:SPCustomQueryEditorCommentColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.769 green:0.102 blue:0.086 alpha:1.000]] forKey:SPCustomQueryEditorQuoteColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.200 green:0.250 blue:1.000 alpha:1.000]] forKey:SPCustomQueryEditorSQLKeywordColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.000 green:0.000 blue:0.658 alpha:1.000]] forKey:SPCustomQueryEditorBacktickColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.506 green:0.263 blue:0.000 alpha:1.000]] forKey:SPCustomQueryEditorNumericColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.500 green:0.500 blue:0.500 alpha:1.000]] forKey:SPCustomQueryEditorVariableColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.950 green:0.950 blue:0.950 alpha:1.000]] forKey:SPCustomQueryEditorHighlightQueryColor]; - [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.7098 green:0.8352 blue:1.000 alpha:1.000]] forKey:SPCustomQueryEditorSelectionColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.000f green:0.455f blue:0.000f alpha:1.000f]] forKey:SPCustomQueryEditorCommentColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.769f green:0.102f blue:0.086f alpha:1.000f]] forKey:SPCustomQueryEditorQuoteColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.200f green:0.250f blue:1.000f alpha:1.000f]] forKey:SPCustomQueryEditorSQLKeywordColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.000f green:0.000f blue:0.658f alpha:1.000f]] forKey:SPCustomQueryEditorBacktickColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.506f green:0.263f blue:0.000f alpha:1.000f]] forKey:SPCustomQueryEditorNumericColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.500f green:0.500f blue:0.500f alpha:1.000f]] forKey:SPCustomQueryEditorVariableColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.950f green:0.950f blue:0.950f alpha:1.000f]] forKey:SPCustomQueryEditorHighlightQueryColor]; + [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor colorWithDeviceRed:0.7098f green:0.8352f blue:1.000f alpha:1.000f]] forKey:SPCustomQueryEditorSelectionColor]; [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor blackColor]] forKey:SPCustomQueryEditorTextColor]; [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor blackColor]] forKey:SPCustomQueryEditorCaretColor]; [prefs setObject:[NSArchiver archivedDataWithRootObject:[NSColor whiteColor]] forKey:SPCustomQueryEditorBackgroundColor]; diff --git a/Source/SPExportController.h b/Source/SPExportController.h index 7a4fcb3c..9c084334 100644 --- a/Source/SPExportController.h +++ b/Source/SPExportController.h @@ -23,7 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -@class MCPConnection, BWAnchoredButtonBar; +@class SPMySQLConnection, BWAnchoredButtonBar; /** * @class SPExportController SPExportController.h @@ -162,7 +162,7 @@ /** * Database connection */ - MCPConnection *connection; + SPMySQLConnection *connection; /** * Concurrent operation queue @@ -238,7 +238,7 @@ /** * @property connection Database connection */ -@property(readwrite, assign) MCPConnection *connection; +@property(readwrite, assign) SPMySQLConnection *connection; - (void)exportTables:(NSArray *)table asFormat:(SPExportType)format usingSource:(SPExportSource)source; - (void)openExportErrorsSheetWithString:(NSString *)errors; @@ -258,10 +258,10 @@ - (IBAction)exportCustomQueryResultAsFormat:(id)sender; - (IBAction)toggleXMLOutputFormat:(id)sender; -- (IBAction)toggleSQLIncludeStructure:(id)sender; -- (IBAction)toggleSQLIncludeContent:(id)sender; -- (IBAction)toggleSQLIncludeDropSyntax:(id)sender; -- (IBAction)toggleNewFilePerTable:(id)sender; +- (IBAction)toggleSQLIncludeStructure:(NSButton *)sender; +- (IBAction)toggleSQLIncludeContent:(NSButton *)sender; +- (IBAction)toggleSQLIncludeDropSyntax:(NSButton *)sender; +- (IBAction)toggleNewFilePerTable:(NSButton *)sender; - (void)savePanelDidEnd:(NSSavePanel *)panel returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; diff --git a/Source/SPExportController.m b/Source/SPExportController.m index 5b61d178..95076ef2 100644 --- a/Source/SPExportController.m +++ b/Source/SPExportController.m @@ -23,8 +23,6 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - #import "SPExportController.h" #import "SPExportInitializer.h" #import "SPTablesList.h" @@ -36,6 +34,7 @@ #import "SPExportFilenameUtilities.h" #import "SPExportFileNameTokenObject.h" #import "SPDatabaseDocument.h" +#import "SPMySQL.h" // Constants static const NSUInteger SPExportUIPadding = 20; @@ -574,7 +573,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled"; /** * Toggles the export button when choosing to include or table structures in an SQL export. */ -- (IBAction)toggleSQLIncludeStructure:(id)sender +- (IBAction)toggleSQLIncludeStructure:(NSButton *)sender { if (![sender state]) { @@ -593,7 +592,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled"; /** * Toggles the export button when choosing to include or exclude table contents in an SQL export. */ -- (IBAction)toggleSQLIncludeContent:(id)sender +- (IBAction)toggleSQLIncludeContent:(NSButton *)sender { [[exportTableList tableColumnWithIdentifier:SPTableViewContentColumnID] setHidden:(![sender state])]; @@ -603,7 +602,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled"; /** * Toggles the export button when choosing to include or exclude table drop syntax in an SQL export. */ -- (IBAction)toggleSQLIncludeDropSyntax:(id)sender +- (IBAction)toggleSQLIncludeDropSyntax:(NSButton *)sender { [[exportTableList tableColumnWithIdentifier:SPTableViewDropColumnID] setHidden:(![sender state])]; @@ -613,7 +612,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled"; /** * Toggles whether XML and CSV files should be combined into a single file. */ -- (IBAction)toggleNewFilePerTable:(id)sender +- (IBAction)toggleNewFilePerTable:(NSButton *)sender { [self _updateExportFormatInformation]; } @@ -795,12 +794,12 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled"; // to set the export's link case sensitivity setting if (isDot && serverLowerCaseTableNameValue == NSNotFound) { - MCPResult *caseResult = [connection queryString:@"SHOW VARIABLES LIKE 'lower_case_table_names'"]; + SPMySQLResult *caseResult = [connection queryString:@"SHOW VARIABLES LIKE 'lower_case_table_names'"]; [caseResult setReturnDataAsStrings:YES]; - if ([caseResult numOfRows] == 1) { - serverLowerCaseTableNameValue = [[[caseResult fetchRowAsDictionary] objectForKey:@"Value"] integerValue]; + if ([caseResult numberOfRows] == 1) { + serverLowerCaseTableNameValue = [[[caseResult getRowAsDictionary] objectForKey:@"Value"] integerValue]; } else { serverLowerCaseTableNameValue = 0; diff --git a/Source/SPExportFileUtilities.m b/Source/SPExportFileUtilities.m index b5f30470..986c1a23 100644 --- a/Source/SPExportFileUtilities.m +++ b/Source/SPExportFileUtilities.m @@ -29,6 +29,7 @@ #import "SPExportFile.h" #import "SPDatabaseDocument.h" #import "SPCustomQuery.h" +#import "SPMySQL.h" typedef enum { diff --git a/Source/SPExportInitializer.m b/Source/SPExportInitializer.m index 15ab192d..b2f250c4 100644 --- a/Source/SPExportInitializer.m +++ b/Source/SPExportInitializer.m @@ -23,8 +23,6 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - #import "SPExportInitializer.h" #import "SPTableData.h" #import "SPDatabaseDocument.h" @@ -44,6 +42,7 @@ #import "SPExportFileUtilities.h" #import "SPExportFilenameUtilities.h" #import "SPExportFileNameTokenObject.h" +#import "SPMySQL.h" @implementation SPExportController (SPExportInitializer) diff --git a/Source/SPExporter.h b/Source/SPExporter.h index abc880a0..e58c8d65 100644 --- a/Source/SPExporter.h +++ b/Source/SPExporter.h @@ -48,11 +48,11 @@ * explicity called. */ -@class MCPConnection, SPExportFile; +@class SPMySQLConnection, SPExportFile; @interface SPExporter : NSOperation { - MCPConnection *connection; + SPMySQLConnection *connection; double exportProgressValue; double exportMaxProgress; @@ -74,7 +74,7 @@ /** * @property connection The MySQL connection to use */ -@property(readwrite, retain) MCPConnection *connection; +@property(readwrite, retain) SPMySQLConnection *connection; /** * @property exportProgressValue The export's current progress value diff --git a/Source/SPExtendedTableInfo.h b/Source/SPExtendedTableInfo.h index 3821be2d..72087f67 100644 --- a/Source/SPExtendedTableInfo.h +++ b/Source/SPExtendedTableInfo.h @@ -23,9 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPTableData, SPDatabaseData, SPTablesList; +@class SPTableData, SPDatabaseData, SPTablesList, SPMySQLConnection; @interface SPExtendedTableInfo : NSObject { @@ -57,10 +55,10 @@ NSString *selectedTable; - MCPConnection *connection; + SPMySQLConnection *connection; } -@property (readwrite, retain) MCPConnection *connection; +@property (readwrite, retain) SPMySQLConnection *connection; // IBAction methods - (IBAction)reloadTable:(id)sender; diff --git a/Source/SPExtendedTableInfo.m b/Source/SPExtendedTableInfo.m index a1e59110..d2afe969 100644 --- a/Source/SPExtendedTableInfo.m +++ b/Source/SPExtendedTableInfo.m @@ -33,6 +33,7 @@ #import "SPAlertSheets.h" #import "SPTableStructure.h" #import "SPServerSupport.h" +#import "SPMySQL.h" @interface SPExtendedTableInfo (PrivateAPI) @@ -102,7 +103,8 @@ // Alter table's storage type [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ %@ = %@", [selectedTable backtickQuotedString], [[tableDocumentInstance serverSupport] engineTypeQueryName], newType]]; - if ([connection getLastErrorID] == 0) { + if (![connection queryErrored]) { + // Reload the table's data [tableDocumentInstance loadTable:selectedTable ofType:[tableDocumentInstance tableType]]; } @@ -111,7 +113,7 @@ SPBeginAlertSheet(NSLocalizedString(@"Error changing table type", @"error changing table type message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table type to '%@'.\n\nMySQL said: %@", @"error changing table type informative message"), newType, [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table type to '%@'.\n\nMySQL said: %@", @"error changing table type informative message"), newType, [connection lastErrorMessage]]); } } @@ -129,7 +131,7 @@ // Alter table's character set encoding [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ CHARACTER SET = %@", [selectedTable backtickQuotedString], newEncoding]]; - if ([connection getLastErrorID] == 0) { + if (![connection queryErrored]) { // Reload the table's data [self reloadTable:self]; } @@ -138,7 +140,7 @@ SPBeginAlertSheet(NSLocalizedString(@"Error changing table encoding", @"error changing table encoding message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table encoding to '%@'.\n\nMySQL said: %@", @"error changing table encoding informative message"), newEncoding, [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table encoding to '%@'.\n\nMySQL said: %@", @"error changing table encoding informative message"), newEncoding, [connection lastErrorMessage]]); } } @@ -156,7 +158,7 @@ // Alter table's character set collation [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ COLLATE = %@", [selectedTable backtickQuotedString], newCollation]]; - if ([connection getLastErrorID] == 0) { + if (![connection queryErrored]) { // Reload the table's data [self reloadTable:self]; } @@ -165,7 +167,7 @@ SPBeginAlertSheet(NSLocalizedString(@"Error changing table collation", @"error changing table collation message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table collation to '%@'.\n\nMySQL said: %@", @"error changing table collation informative message"), newCollation, [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table collation to '%@'.\n\nMySQL said: %@", @"error changing table collation informative message"), newCollation, [connection lastErrorMessage]]); } } @@ -373,7 +375,7 @@ [tableCreateSyntaxTextView setEditable:NO]; // Validate Reset AUTO_INCREMENT button - if ([statusFields objectForKey:@"Auto_increment"] && ![[statusFields objectForKey:@"Auto_increment"] isKindOfClass:[NSNull class]]) { + if ([statusFields objectForKey:@"Auto_increment"] && ![[statusFields objectForKey:@"Auto_increment"] isNSNull]) { [resetAutoIncrementResetButton setHidden:NO]; } } @@ -429,7 +431,7 @@ NSFont *oldFont = [tableCreateSyntaxTextView font]; BOOL editableStatus = [tableCreateSyntaxTextView isEditable]; [tableCreateSyntaxTextView setEditable:YES]; - [tableCreateSyntaxTextView setFont:[NSFont fontWithName:[oldFont fontName] size:10.0]]; + [tableCreateSyntaxTextView setFont:[NSFont fontWithName:[oldFont fontName] size:10.0f]]; // Convert tableCreateSyntaxTextView to HTML NSData *HTMLData = [[tableCreateSyntaxTextView textStorage] dataFromRange:NSMakeRange(0, [[tableCreateSyntaxTextView string] length]) @@ -468,16 +470,16 @@ if (![currentComment isEqualToString:newComment]) { // Alter table's comment - [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ COMMENT = '%@'", [selectedTable backtickQuotedString], [connection prepareString:newComment]]]; + [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ COMMENT = %@", [selectedTable backtickQuotedString], [connection escapeAndQuoteString:newComment]]]; - if ([connection getLastErrorID] == 0) { + if (![connection queryErrored]) { // Reload the table's data [self reloadTable:self]; } else { SPBeginAlertSheet(NSLocalizedString(@"Error changing table comment", @"error changing table comment message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table's comment to '%@'.\n\nMySQL said: %@", @"error changing table comment informative message"), newComment, [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the table's comment to '%@'.\n\nMySQL said: %@", @"error changing table comment informative message"), newComment, [connection lastErrorMessage]]); } } } @@ -559,7 +561,7 @@ { NSString *value = [infoDict objectForKey:key]; - if ([value isKindOfClass:[NSNull class]]) { + if ([value isNSNull]) { value = @""; } else { diff --git a/Source/SPFavoritesController.m b/Source/SPFavoritesController.m index 2c48823d..222dd119 100644 --- a/Source/SPFavoritesController.m +++ b/Source/SPFavoritesController.m @@ -44,7 +44,8 @@ static SPFavoritesController *sharedFavoritesController = nil; { @synchronized(self) { return [[self sharedFavoritesController] retain]; - } + } + return nil; } - (id)init diff --git a/Source/SPFieldEditorController.h b/Source/SPFieldEditorController.h index 29d4c445..4e978646 100644 --- a/Source/SPFieldEditorController.h +++ b/Source/SPFieldEditorController.h @@ -22,7 +22,6 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> /** * @class SPFieldEditorController SPFieldEditorController.h diff --git a/Source/SPFieldEditorController.m b/Source/SPFieldEditorController.m index 2df24c24..549c994e 100644 --- a/Source/SPFieldEditorController.m +++ b/Source/SPFieldEditorController.m @@ -35,6 +35,7 @@ #include <objc/objc-runtime.h> #import "SPCustomQuery.h" #import "SPTableContent.h" +#import "SPMySQLGeometryData.h" @interface SPFieldEditorController (SPFieldEditorControllerDelegate) @@ -351,7 +352,7 @@ [editTextView setHidden:YES]; [editTextScrollView setHidden:YES]; [editSheetSegmentControl setSelectedSegment:2]; - } else if ([sheetEditData isKindOfClass:[MCPGeometryData class]]) { + } else if ([sheetEditData isKindOfClass:[SPMySQLGeometryData class]]) { SPGeometryDataView *v = [[[SPGeometryDataView alloc] initWithCoordinates:[sheetEditData coordinates] targetDimension:2000.0f] autorelease]; image = [v thumbnailImage]; stringValue = [[sheetEditData wktString] retain]; @@ -547,7 +548,7 @@ NSSavePanel *panel = [NSSavePanel savePanel]; NSString *fileDefault = @""; - if([editSheetSegmentControl selectedSegment] == 1 && [sheetEditData isKindOfClass:[MCPGeometryData class]]) { + if([editSheetSegmentControl selectedSegment] == 1 && [sheetEditData isKindOfClass:[SPMySQLGeometryData class]]) { [panel setAllowedFileTypes:[NSArray arrayWithObject:@"pdf"]]; [panel setAllowsOtherFileTypes:NO]; } else { @@ -716,7 +717,7 @@ [sheetEditData writeToURL:fileURL atomically:YES]; } - else if ( [sheetEditData isKindOfClass:[MCPGeometryData class]] ) { + else if ( [sheetEditData isKindOfClass:[SPMySQLGeometryData class]] ) { if ( [editSheetSegmentControl selectedSegment] == 0 || editImage == nil ) { diff --git a/Source/SPFieldMapperController.h b/Source/SPFieldMapperController.h index 860eef81..6fb31b8e 100644 --- a/Source/SPFieldMapperController.h +++ b/Source/SPFieldMapperController.h @@ -22,14 +22,11 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +@class SPTextView, SPTableView, SPTablesList, SPMySQLConnection; -@class SPTextView, SPTableView, SPTablesList; - -#ifndef SP_REFACTOR @interface SPFieldMapperController : NSWindowController -#else -@interface SPFieldMapperController : NSWindowController <NSTokenFieldCellDelegate> +#ifdef SP_REFACTOR +<NSTokenFieldCellDelegate> #endif { IBOutlet SPTableView *fieldMapperTableView; @@ -41,8 +38,8 @@ IBOutlet id rowUpButton; IBOutlet id rowDownButton; IBOutlet id recordCountLabel; - IBOutlet id importFieldNamesHeaderSwitch; - IBOutlet id addRemainingDataSwitch; + IBOutlet NSButton *importFieldNamesHeaderSwitch; + IBOutlet NSButton *addRemainingDataSwitch; IBOutlet id importButton; IBOutlet id advancedBox; IBOutlet NSPopUpButton *alignByPopup; @@ -65,20 +62,20 @@ IBOutlet NSButton *addGlobalValueButton; IBOutlet NSButton *removeGlobalValueButton; IBOutlet NSButton *insertNULLValueButton; - IBOutlet id replaceAfterSavingCheckBox; + IBOutlet NSButton *replaceAfterSavingCheckBox; IBOutlet NSPopUpButton *insertPullDownButton; IBOutlet NSMenu *recentGlobalValueMenu; - IBOutlet id ignoreCheckBox; - IBOutlet id ignoreUpdateCheckBox; - IBOutlet id delayedCheckBox; - IBOutlet id delayedReplaceCheckBox; - IBOutlet id onupdateCheckBox; - IBOutlet id lowPriorityCheckBox; - IBOutlet id lowPriorityReplaceCheckBox; - IBOutlet id lowPriorityUpdateCheckBox; - IBOutlet id highPriorityCheckBox; - IBOutlet id skipexistingRowsCheckBox; + IBOutlet NSButton *ignoreCheckBox; + IBOutlet NSButton *ignoreUpdateCheckBox; + IBOutlet NSButton *delayedCheckBox; + IBOutlet NSButton *delayedReplaceCheckBox; + IBOutlet NSButton *onupdateCheckBox; + IBOutlet NSButton *lowPriorityCheckBox; + IBOutlet NSButton *lowPriorityReplaceCheckBox; + IBOutlet NSButton *lowPriorityUpdateCheckBox; + IBOutlet NSButton *highPriorityCheckBox; + IBOutlet NSButton *skipexistingRowsCheckBox; IBOutlet SPTextView *onupdateTextView; IBOutlet id gobackButton; @@ -131,7 +128,7 @@ NSString *primaryKeyField; NSNumber *lastDisabledCSVFieldcolumn; - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; NSString *sourcePath; @@ -146,7 +143,7 @@ - (id)initWithDelegate:(id)managerDelegate; -- (void)setConnection:(MCPConnection *)theConnection; +- (void)setConnection:(SPMySQLConnection *)theConnection; - (void)setImportDataArray:(id)theFieldMappingImportArray hasHeader:(BOOL)hasHeader isPreview:(BOOL)isPreview; // Getter methods diff --git a/Source/SPFieldMapperController.m b/Source/SPFieldMapperController.m index 6a558321..b406f134 100644 --- a/Source/SPFieldMapperController.m +++ b/Source/SPFieldMapperController.m @@ -31,6 +31,7 @@ #import "SPCategoryAdditions.h" #import "RegexKitLite.h" #import "SPDatabaseData.h" +#import "SPMySQL.h" #define SP_NUMBER_OF_RECORDS_STRING NSLocalizedString(@"%ld of %@%lu records", @"Label showing the index of the selected CSV row") @@ -231,7 +232,7 @@ static NSString *SPTableViewSqlColumnID = @"sql"; #pragma mark - #pragma mark Setter methods -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { mySQLConnection = theConnection; [mySQLConnection retain]; @@ -422,7 +423,7 @@ static NSString *SPTableViewSqlColumnID = @"sql"; defaultButton:NSLocalizedString(@"OK", @"OK button") alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to add the new column '%@' by\n\n%@.\n\nMySQL said: %@", @"error adding new column informative message"), [fieldMappingTableColumnNames objectAtIndex:currentIndex], createString, [mySQLConnection getLastErrorMessage]]]; + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to add the new column '%@' by\n\n%@.\n\nMySQL said: %@", @"error adding new column informative message"), [fieldMappingTableColumnNames objectAtIndex:currentIndex], createString, [mySQLConnection lastErrorMessage]]]; [alert setAlertStyle:NSCriticalAlertStyle]; [alert beginSheetModalForWindow:[self window] modalDelegate:self didEndSelector:nil contextInfo:nil]; @@ -472,7 +473,7 @@ static NSString *SPTableViewSqlColumnID = @"sql"; defaultButton:NSLocalizedString(@"OK", @"OK button") alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to add the new table '%@' by\n\n%@.\n\nMySQL said: %@", @"error adding new table informative message"), [newTableNameTextField stringValue], createString, [mySQLConnection getLastErrorMessage]]]; + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to add the new table '%@' by\n\n%@.\n\nMySQL said: %@", @"error adding new table informative message"), [newTableNameTextField stringValue], createString, [mySQLConnection lastErrorMessage]]]; [alert setAlertStyle:NSCriticalAlertStyle]; [alert beginSheetModalForWindow:[self window] modalDelegate:self didEndSelector:nil contextInfo:nil]; @@ -1189,7 +1190,7 @@ static NSString *SPTableViewSqlColumnID = @"sql"; [globalValuesSheet makeFirstResponder:globalValuesTableView]; // Replace the current map pair with the last selected global value - if([replaceAfterSavingCheckBox state] == NSOnState && [globalValuesTableView numberOfSelectedRows] == 1) { + if ([replaceAfterSavingCheckBox state] == NSOnState && [globalValuesTableView numberOfSelectedRows] == 1) { [fieldMappingArray replaceObjectAtIndex:[fieldMapperTableView selectedRow] withObject:[NSNumber numberWithInteger:[globalValuesTableView selectedRow]+numberOfImportColumns]]; @@ -1405,7 +1406,7 @@ static NSString *SPTableViewSqlColumnID = @"sql"; CGFloat dist = 1e6f; for(j=0; j < [fileHeaderNames count]; j++) { id fileHeaderName = NSArrayObjectAtIndex(fileHeaderNames,j); - if([fileHeaderName isKindOfClass:[NSNull class]] || [fileHeaderName isSPNotLoaded]) continue; + if([fileHeaderName isNSNull] || [fileHeaderName isSPNotLoaded]) continue; NSString *headerName = [(NSString*)fileHeaderName lowercaseString]; NSString *tableHeadName = [NSArrayObjectAtIndex(tableHeaderNames,i) lowercaseString]; dist = [tableHeadName levenshteinDistanceWithWord:headerName]; @@ -1484,7 +1485,7 @@ static NSString *SPTableViewSqlColumnID = @"sql"; fieldMappingArray = [[NSMutableArray alloc] init]; for (i = 0; i < [fieldMappingTableColumnNames count]; i++) { if (i < [NSArrayObjectAtIndex(fieldMappingImportArray, fieldMappingCurrentRow) count] - && ![NSArrayObjectAtIndex(NSArrayObjectAtIndex(fieldMappingImportArray, fieldMappingCurrentRow), i) isKindOfClass:[NSNull class]]) { + && NSArrayObjectAtIndex(NSArrayObjectAtIndex(fieldMappingImportArray, fieldMappingCurrentRow), i) != [NSNull null]) { value = i; } else { value = 0; diff --git a/Source/SPGeometryDataView.m b/Source/SPGeometryDataView.m index d68bb57b..3150bc19 100644 --- a/Source/SPGeometryDataView.m +++ b/Source/SPGeometryDataView.m @@ -43,7 +43,7 @@ */ - (id)initWithCoordinates:(NSDictionary*)coord { - return [self initWithCoordinates:coord targetDimension:400.0]; + return [self initWithCoordinates:coord targetDimension:400.0f]; } /** @@ -56,7 +56,7 @@ - (id)initWithCoordinates:(NSDictionary*)coord targetDimension:(CGFloat)targetDimension { - margin_offset = 10.0; + margin_offset = 10.0f; type = [coord objectForKey:@"type"]; coordinates = [coord objectForKey:@"coordinates"]; @@ -72,7 +72,7 @@ if(maxDim != 0) zoom_factor = targetDimension/maxDim; else - zoom_factor = 1.0; + zoom_factor = 1.0f; width*=zoom_factor; height*=zoom_factor; @@ -85,14 +85,14 @@ lineColor = [NSColor blackColor]; borderLineColor = [NSColor grayColor]; - backgroundColor = [NSColor colorWithCalibratedRed:1 green:1 blue:1 alpha:0.96]; + backgroundColor = [NSColor colorWithCalibratedRed:1 green:1 blue:1 alpha:0.96f]; pointFillColor = [NSColor redColor]; pointStrokeColor = [NSColor grayColor]; - polygonFillColor1 = [NSColor colorWithCalibratedRed:0.0 green:1.0 blue:0.0 alpha:0.1]; - polygonFillColor2 = [NSColor colorWithCalibratedRed:0.0 green:1.0 blue:1.0 alpha:0.1]; - polygonFillColor3 = [NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.1]; + polygonFillColor1 = [NSColor colorWithCalibratedRed:0.0f green:1.0f blue:0.0f alpha:0.1f]; + polygonFillColor2 = [NSColor colorWithCalibratedRed:0.0f green:1.0f blue:1.0f alpha:0.1f]; + polygonFillColor3 = [NSColor colorWithCalibratedRed:1.0f green:0.0f blue:0.0f alpha:0.1f]; - lineWidth = 1.0; + lineWidth = 1.0f; return self; } @@ -109,7 +109,7 @@ // Draw a rect as border path = [NSBezierPath bezierPathWithRect:[self bounds]]; - [path setLineWidth:0.1]; + [path setLineWidth:0.1f]; [backgroundColor set]; [path fill]; [borderLineColor set]; diff --git a/Source/SPIndexesController.h b/Source/SPIndexesController.h index 7fae2082..e014a4a7 100644 --- a/Source/SPIndexesController.h +++ b/Source/SPIndexesController.h @@ -24,9 +24,9 @@ // More info at <http://code.google.com/p/sequel-pro/> #ifndef SP_REFACTOR -@class SPDatabaseDocument, SPTablesList, SPTableData, SPTableStructure, MCPConnection, BWAnchoredButtonBar, SPTableView; +@class SPDatabaseDocument, SPTablesList, SPTableData, SPTableStructure, SPMySQLConnection, BWAnchoredButtonBar, SPTableView; #else -@class SPDatabaseDocument, SPTablesList, SPTableData, SPTableStructure, MCPConnection, SPTableView; +@class SPDatabaseDocument, SPTablesList, SPTableData, SPTableStructure, SPMySQLConnection, SPTableView; #endif @interface SPIndexesController : NSWindowController @@ -77,7 +77,7 @@ NSUserDefaults *prefs; #endif - MCPConnection *connection; + SPMySQLConnection *connection; #ifndef SP_REFACTOR /* ivars */ BOOL showAdvancedView; @@ -105,7 +105,7 @@ /** * @property connection The MySQL connection to use */ -@property (readwrite, assign) MCPConnection *connection; +@property (readwrite, assign) SPMySQLConnection *connection; - (IBAction)addIndex:(id)sender; - (IBAction)removeIndex:(id)sender; diff --git a/Source/SPIndexesController.m b/Source/SPIndexesController.m index 26e4b196..99d359f7 100644 --- a/Source/SPIndexesController.m +++ b/Source/SPIndexesController.m @@ -28,7 +28,7 @@ #import "SPServerSupport.h" #import "SPTableContent.h" #import "SPTableData.h" -#import <MCPKit/MCPKit.h> +#import "SPMySQL.h" #import "SPDatabaseDocument.h" #import "SPTablesList.h" #import "SPTableView.h" @@ -862,9 +862,9 @@ static const NSString *SPNewIndexKeyBlockSize = @"IndexKeyBlockSize"; [tempIndexedColumns release]; // Check for errors, but only if the query wasn't cancelled - if ([connection queryErrored] && ![connection queryCancelled]) { + if ([connection queryErrored] && ![connection lastQueryWasCancelled]) { SPBeginAlertSheet(NSLocalizedString(@"Unable to add index", @"add index error message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [dbDocument parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occured while trying to add the index.\n\nMySQL said: %@", @"add index error informative message"), [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occured while trying to add the index.\n\nMySQL said: %@", @"add index error informative message"), [connection lastErrorMessage]]); } else { [tableData resetAllData]; @@ -918,11 +918,11 @@ static const NSString *SPNewIndexKeyBlockSize = @"IndexKeyBlockSize"; [connection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ DROP FOREIGN KEY %@", [table backtickQuotedString], [constraintName backtickQuotedString]]]; // Check for errors, but only if the query wasn't cancelled - if ([connection queryErrored] && ![connection queryCancelled]) { + if ([connection queryErrored] && ![connection lastQueryWasCancelled]) { NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary]; [errorDictionary setObject:NSLocalizedString(@"Unable to delete relation", @"error deleting relation message") forKey:@"title"]; - [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to delete the relation '%@'.\n\nMySQL said: %@", @"error deleting relation informative message"), constraintName, [connection getLastErrorMessage]] forKey:@"message"]; + [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to delete the relation '%@'.\n\nMySQL said: %@", @"error deleting relation informative message"), constraintName, [connection lastErrorMessage]] forKey:@"message"]; [(SPTableStructure*)[tableStructure onMainThread] showErrorSheetWith:errorDictionary]; } @@ -937,11 +937,11 @@ static const NSString *SPNewIndexKeyBlockSize = @"IndexKeyBlockSize"; } // Check for errors, but only if the query wasn't cancelled - if ([connection queryErrored] && ![connection queryCancelled]) { + if ([connection queryErrored] && ![connection lastQueryWasCancelled]) { NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary]; [errorDictionary setObject:NSLocalizedString(@"Unable to delete index", @"error deleting index message") forKey:@"title"]; - [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occured while trying to delete the index.\n\nMySQL said: %@", @"error deleting index informative message"), [connection getLastErrorMessage]] forKey:@"message"]; + [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occured while trying to delete the index.\n\nMySQL said: %@", @"error deleting index informative message"), [connection lastErrorMessage]] forKey:@"message"]; [(SPTableStructure*)[tableStructure onMainThread] showErrorSheetWith:errorDictionary]; } diff --git a/Source/SPLogger.m b/Source/SPLogger.m index b1e16bba..40bcaa69 100644 --- a/Source/SPLogger.m +++ b/Source/SPLogger.m @@ -79,6 +79,7 @@ int _isSPLeaksLog(struct direct *entry); @synchronized(self) { return [[self logger] retain]; } + return nil; } - (id)init diff --git a/Source/SPNarrowDownCompletion.m b/Source/SPNarrowDownCompletion.m index 6506c5da..5e7b5320 100644 --- a/Source/SPNarrowDownCompletion.m +++ b/Source/SPNarrowDownCompletion.m @@ -323,12 +323,12 @@ if(caretPos.y >= 0 && caretPos.y < [self frame].size.height) { - caretPos.y += [self frame].size.height + ([tableFont pointSize]*1.5); + caretPos.y += [self frame].size.height + ([tableFont pointSize]*1.5f); isAbove = YES; } if(caretPos.y < 0 && (mainScreen.size.height-[self frame].size.height) < (caretPos.y*-1)) { - caretPos.y += [self frame].size.height + ([tableFont pointSize]*1.5); + caretPos.y += [self frame].size.height + ([tableFont pointSize]*1.5f); isAbove = YES; } @@ -341,7 +341,7 @@ [self setLevel:NSNormalWindowLevel]; [self setHidesOnDeactivate:YES]; [self setHasShadow:YES]; - [self setAlphaValue:0.9]; + [self setAlphaValue:0.9f]; NSScrollView* scrollView = [[[NSScrollView alloc] initWithFrame:NSZeroRect] autorelease]; [scrollView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; @@ -727,10 +727,10 @@ if(caretPos.y >= 0 && (isAbove || caretPos.y < newHeight)) { isAbove = YES; - old.y = caretPos.y + newHeight + ([tableFont pointSize]*1.5); + old.y = caretPos.y + newHeight + ([tableFont pointSize]*1.5f); } if(caretPos.y < 0 && (isAbove || ([self rectOfMainScreen].size.height-newHeight) < (caretPos.y*-1))) - old.y = caretPos.y + newHeight + ([tableFont pointSize]*1.5); + old.y = caretPos.y + newHeight + ([tableFont pointSize]*1.5f); // newHeight is currently the new height for theTableView, but we need to resize the whole window // so here we use the difference in height to find the new height for the window @@ -979,7 +979,7 @@ // Restore the text selection location, and clearly mark the autosuggested text [theView setSelectedRange:NSMakeRange(currentSelectionPosition, 0)]; - NSMutableAttributedStringAddAttributeValueRange([theView textStorage], NSForegroundColorAttributeName, [[theView otherTextColor] colorWithAlphaComponent:0.3], NSMakeRange(currentSelectionPosition, [toInsert length])); + NSMutableAttributedStringAddAttributeValueRange([theView textStorage], NSForegroundColorAttributeName, [[theView otherTextColor] colorWithAlphaComponent:0.3f], NSMakeRange(currentSelectionPosition, [toInsert length])); NSMutableAttributedStringAddAttributeValueRange([theView textStorage], kSPAutoCompletePlaceholderName, kSPAutoCompletePlaceholderVal, NSMakeRange(currentSelectionPosition, [toInsert length])); [self checkSpaceForAllowedCharacter]; diff --git a/Source/SPNavigatorController.h b/Source/SPNavigatorController.h index 20b3a796..f294b000 100644 --- a/Source/SPNavigatorController.h +++ b/Source/SPNavigatorController.h @@ -22,12 +22,12 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +@class SPNavigatorOutlineView; @interface SPNavigatorController : NSWindowController { #ifndef SP_REFACTOR /* ivars */ - IBOutlet id outlineSchema2; + IBOutlet SPNavigatorOutlineView *outlineSchema2; IBOutlet id navigatorWindow; IBOutlet id infoTable; IBOutlet id searchField; @@ -70,6 +70,7 @@ - (IBAction)outlineViewAction:(id)sender; - (IBAction)reloadAllStructures:(id)sender; - (IBAction)filterTree:(id)sender; +- (void)reloadAfterFiltering; - (IBAction)syncButtonAction:(id)sender; - (void)updateEntriesForConnection:(id)object; diff --git a/Source/SPNavigatorController.m b/Source/SPNavigatorController.m index 30b47006..63c3ed51 100644 --- a/Source/SPNavigatorController.m +++ b/Source/SPNavigatorController.m @@ -33,6 +33,7 @@ #import "SPTooltip.h" #import "SPAppController.h" #import "SPDatabaseViewController.h" +#import "SPMySQL.h" #import <objc/message.h> #endif @@ -68,9 +69,7 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte @synchronized(self) { return [[self sharedNavigatorController] retain]; } -#ifdef SP_REFACTOR - return nil; // only here to stop clang's "can reach end of non-void function" -#endif + return nil; } - (id)init @@ -117,9 +116,8 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte [functionIcon release]; [fieldIcon release]; #endif -#ifdef SP_REFACTOR /* patch */ + [super dealloc]; -#endif } /** * The following base protocol methods are implemented to ensure the singleton status of this class. @@ -799,7 +797,7 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte [expandStatus2 removeObjectForKey:[[parentObject allKeysForObject:item] objectAtIndex:0]]; } -- (id)outlineView:(id)outlineView child:(NSInteger)index ofItem:(id)item +- (id)outlineView:(id)outlineView child:(NSInteger)childIndex ofItem:(id)item { if (item == nil) { @@ -822,7 +820,7 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte // No parent return the child by using the normal sort routine if(!parentObject || ![parentObject isKindOfClass:NSDictionaryClass]) - return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],index)]; + return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],childIndex)]; // Get the parent key name for storing id parentKeys = [parentObject allKeysForObject:item]; @@ -832,26 +830,26 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte // For safety reasons if(!itemRef) - return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],index)]; + return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],childIndex)]; // Not yet cached so do it if(![cachedSortedKeys objectForKey:itemRef]) [cachedSortedKeys setObject:[allKeys sortedArrayUsingFunction:compareStrings context:nil] forKey:itemRef]; - return [item objectForKey:NSArrayObjectAtIndex([cachedSortedKeys objectForKey:itemRef],index)]; + return [item objectForKey:NSArrayObjectAtIndex([cachedSortedKeys objectForKey:itemRef],childIndex)]; } // If something failed return the child by using the normal way - return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],index)]; + return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],childIndex)]; } else { - return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],index)]; + return [item objectForKey:NSArrayObjectAtIndex([allKeys sortedArrayUsingFunction:compareStrings context:nil],childIndex)]; } } else if ([item isKindOfClass:[NSArray class]]) { - return NSArrayObjectAtIndex(item,index); + return NSArrayObjectAtIndex(item,childIndex); } return nil; @@ -1016,9 +1014,9 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte if(!parentObject) return 0; if([outlineView levelForItem:item] == 3 && [outlineView isExpandable:[outlineView itemAtRow:[outlineView rowForItem:item]-1]]) - return 5.0; + return 5.0f; - return 18.0; + return 18.0f; } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldExpandItem:(id)item @@ -1163,7 +1161,7 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { // Use first row as dummy to increase the distance between content and header - return (row == 0) ? 5.0 : 16.0; + return (row == 0) ? 5.0f : 16.0f; } - (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex @@ -1213,11 +1211,11 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte #pragma mark - #pragma mark others -- (NSString*)tableInfoLabelForIndex:(NSInteger)index ofType:(NSInteger)type +- (NSString*)tableInfoLabelForIndex:(NSInteger)anIndex ofType:(NSInteger)type { if(type == 0 || type == 1) // TABLE / VIEW - switch(index) { + switch(anIndex) { case 0: return NSLocalizedString(@"Type", @"type label (Navigator)"); case 1: @@ -1239,7 +1237,7 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte } if(type == 2) // PROCEDURE - switch(index) { + switch(anIndex) { case 0: return @"DTD Identifier"; case 1: @@ -1252,7 +1250,7 @@ static NSComparisonResult compareStrings(NSString *s1, NSString *s2, void* conte return @"Definer"; } if(type == 3) // FUNCTION - switch(index) { + switch(anIndex) { case 0: return NSLocalizedString(@"Return Type", @"return type label (Navigator)"); case 1: diff --git a/Source/SPNotLoaded.m b/Source/SPNotLoaded.m index 335ccbfa..99a5a1d0 100644 --- a/Source/SPNotLoaded.m +++ b/Source/SPNotLoaded.m @@ -45,9 +45,7 @@ static SPNotLoaded *notLoaded = nil; @synchronized(self) { return [[self notLoaded] retain]; } -#ifdef SP_REFACTOR - return nil; // only here to stop clang's "can reach end of non-void function" -#endif + return nil; } - (id) init diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPNull.h b/Source/SPObjectAdditions.h index 500e0cf8..215354b5 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPNull.h +++ b/Source/SPObjectAdditions.h @@ -1,13 +1,11 @@ // // $Id$ // -// MCPNull.h -// MCPKit +// SPObjectAdditions.h +// sequel-pro // -// Created by Serge Cohen (serge.cohen@m4x.org) on 02/06/2002. -// Copyright (c) 2001 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 +// Created by Rowan Beentje (rowan.beent.je) on February 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -23,13 +21,11 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// More info at <http://mysql-cocoa.sourceforge.net/> // More info at <http://code.google.com/p/sequel-pro/> -#import <Foundation/Foundation.h> - -@interface NSObject (MCPNSNullTest) +@interface NSObject (SPObjectAdditions) +// Detect whether an object is a NSNull instance - (BOOL)isNSNull; @end diff --git a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel+MCPEntreprise.h b/Source/SPObjectAdditions.m index 15aa9ed3..de762f59 100644 --- a/Frameworks/MCPKit/MCPEntrepriseKit/MCPModel+MCPEntreprise.h +++ b/Source/SPObjectAdditions.m @@ -1,13 +1,11 @@ // // $Id$ // -// MCPModel+MCPEntreprise.h -// MCPKit +// SPObjectAdditions.m +// sequel-pro // -// Created by Serge Cohen (serge.cohen@m4x.org) on 01/11/04. -// Copyright (c) 2004 Serge Cohen. All rights reserved. -// -// Forked by the Sequel Pro team (sequelpro.com), April 2009 +// Created by Rowan Beentje (rowan.beent.je) on February 22, 2012 +// Copyright (c) 2012 Rowan Beentje. All rights reserved. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,11 +23,18 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import "MCPModel.h" +@implementation NSObject (SPObjectAdditions) -@interface MCPModel (MCPEntreprise) +/** + * Detect whether an object is a NSNull instance + */ +- (BOOL)isNSNull +{ + id const null = [NSNull null]; -- (void) registerAsClassDescriptionServer; -- (void) registerDescriptionForClass:(NSNotification *) notification; + // [NSNull null] is documented as being a singleton class so a pointer equality + // check is possible - and much faster than checking class membership. + return (self == null); +} @end diff --git a/Source/SPProcessListController.h b/Source/SPProcessListController.h index df5f48a6..fbbdc906 100644 --- a/Source/SPProcessListController.h +++ b/Source/SPProcessListController.h @@ -23,11 +23,11 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +@class SPMySQLConnection; @interface SPProcessListController : NSWindowController { - MCPConnection *connection; + SPMySQLConnection *connection; BOOL showFullProcessList, processListThreadRunning; @@ -49,7 +49,7 @@ IBOutlet NSMenuItem *autoRefreshIntervalMenuItem; } -@property (readwrite, assign) MCPConnection *connection; +@property (readwrite, assign) SPMySQLConnection *connection; - (IBAction)copy:(id)sender; - (IBAction)closeSheet:(id)sender; @@ -57,9 +57,9 @@ - (IBAction)saveServerProcesses:(id)sender; - (IBAction)killProcessQuery:(id)sender; - (IBAction)killProcessConnection:(id)sender; -- (IBAction)toggleShowProcessID:(id)sender; -- (IBAction)toggeleShowFullProcessList:(id)sender; -- (IBAction)toggleProcessListAutoRefresh:(id)sender; +- (IBAction)toggleShowProcessID:(NSMenuItem *)sender; +- (IBAction)toggeleShowFullProcessList:(NSMenuItem *)sender; +- (IBAction)toggleProcessListAutoRefresh:(NSButton *)sender; - (IBAction)setAutoRefreshInterval:(id)sender; - (IBAction)setCustomAutoRefreshInterval:(id)sender; diff --git a/Source/SPProcessListController.m b/Source/SPProcessListController.m index 825b598d..18263bb4 100644 --- a/Source/SPProcessListController.m +++ b/Source/SPProcessListController.m @@ -27,6 +27,7 @@ #import "SPDatabaseDocument.h" #import "SPAlertSheets.h" #import "SPAppController.h" +#import "SPMySQL.h" static const NSString *SPTableViewIDColumnIdentifier = @"Id"; @@ -97,7 +98,7 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; // Also, if available restore the table's column widths NSNumber *columnWidth = [[prefs objectForKey:SPProcessListTableColumnWidths] objectForKey:[[column headerCell] stringValue]]; - if (columnWidth) [column setWidth:[columnWidth doubleValue]]; + if (columnWidth) [column setWidth:[columnWidth floatValue]]; } // Register as an observer for the when the UseMonospacedFonts preference changes @@ -284,7 +285,7 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; /** * Toggles the display of the process ID table column. */ -- (IBAction)toggleShowProcessID:(id)sender +- (IBAction)toggleShowProcessID:(NSMenuItem *)sender { [[processListTableView tableColumnWithIdentifier:SPTableViewIDColumnIdentifier] setHidden:([sender state])]; } @@ -292,7 +293,7 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; /** * Toggles the display of the FULL process list. */ -- (IBAction)toggeleShowFullProcessList:(id)sender +- (IBAction)toggeleShowFullProcessList:(NSMenuItem *)sender { showFullProcessList = (!showFullProcessList); @@ -302,7 +303,7 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; /** * Toggles whether or not auto refresh is enabled. */ -- (IBAction)toggleProcessListAutoRefresh:(id)sender +- (IBAction)toggleProcessListAutoRefresh:(NSButton *)sender { BOOL enable = [sender state]; @@ -687,18 +688,16 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; // Get processes if ([connection isConnected]) { - MCPResult *processList = (showFullProcessList) ? [connection queryString:@"SHOW FULL PROCESSLIST"] : [connection listProcesses]; + SPMySQLResult *processList = (showFullProcessList) ? [connection queryString:@"SHOW FULL PROCESSLIST"] : [connection listProcesses]; [processList setReturnDataAsStrings:YES]; - - if ([processList numOfRows]) [processList dataSeek:0]; - + [processes removeAllObjects]; - for (i = 0; i < [processList numOfRows]; i++) + for (i = 0; i < [processList numberOfRows]; i++) { - //MCPKit currently returns numbers as NSString, which will break sorting of numbers in this case. - NSMutableDictionary *rowsFixed = [[processList fetchRowAsDictionary] mutableCopy]; + //SPMySQL.framewokr currently returns numbers as NSString, which will break sorting of numbers in this case. + NSMutableDictionary *rowsFixed = [[processList getRowAsDictionary] mutableCopy]; id idColumn = [rowsFixed objectForKey:@"Id"]; //Id is a signed int(11) - this is a signed 32 bit int value @@ -739,7 +738,7 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; // Check for errors if ([connection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Unable to kill query", @"error killing query message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occured while attempting to kill the query associated with connection %lu.\n\nMySQL said: %@", @"error killing query informative message"), (unsigned long)processId, [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occured while attempting to kill the query associated with connection %lu.\n\nMySQL said: %@", @"error killing query informative message"), (unsigned long)processId, [connection lastErrorMessage]]); } // Refresh the process list @@ -757,7 +756,7 @@ static const NSString *SPTableViewIDColumnIdentifier = @"Id"; // Check for errors if ([connection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Unable to kill connection", @"error killing connection message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occured while attempting to kill connection %lu.\n\nMySQL said: %@", @"error killing query informative message"), (unsigned long)processId, [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occured while attempting to kill connection %lu.\n\nMySQL said: %@", @"error killing query informative message"), (unsigned long)processId, [connection lastErrorMessage]]); } // Refresh the process list diff --git a/Source/SPQueryController.m b/Source/SPQueryController.m index 82a19091..6c425bc7 100644 --- a/Source/SPQueryController.m +++ b/Source/SPQueryController.m @@ -67,9 +67,7 @@ static SPQueryController *sharedQueryController = nil; return [[self sharedQueryController] retain]; } -#ifdef SP_REFACTOR - return nil; // only here to stop clang's 'can reach end of non-void function' -#endif + return nil; } - (id)init diff --git a/Source/SPSQLExporter.m b/Source/SPSQLExporter.m index 66411932..6090b709 100644 --- a/Source/SPSQLExporter.m +++ b/Source/SPSQLExporter.m @@ -23,8 +23,6 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - #import "SPSQLExporter.h" #import "SPTablesList.h" #import "SPFileHandle.h" @@ -32,6 +30,7 @@ #import "SPExportFile.h" #import "SPTableData.h" #import "RegexKitLite.h" +#import "SPMySQL.h" @interface SPSQLExporter () @@ -88,8 +87,8 @@ sqlTableDataInstance = [[[SPTableData alloc] init] autorelease]; [sqlTableDataInstance setConnection:connection]; - MCPResult *queryResult; - MCPStreamingResult *streamingResult; + SPMySQLResult *queryResult; + SPMySQLStreamingResult *streamingResult; NSArray *row; NSString *tableName; @@ -228,8 +227,8 @@ [queryResult setReturnDataAsStrings:YES]; - if ([queryResult numOfRows]) { - tableDetails = [[NSDictionary alloc] initWithDictionary:[queryResult fetchRowAsDictionary]]; + if ([queryResult numberOfRows]) { + tableDetails = [[NSDictionary alloc] initWithDictionary:[queryResult getRowAsDictionary]]; if ([tableDetails objectForKey:@"Create View"]) { [viewSyntaxes setValue:[[[[tableDetails objectForKey:@"Create View"] copy] autorelease] createViewSyntaxPrettifier] forKey:tableName]; @@ -245,9 +244,9 @@ } if ([connection queryErrored]) { - [errors appendFormat:@"%@\n", [connection getLastErrorMessage]]; + [errors appendFormat:@"%@\n", [connection lastErrorMessage]]; - [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n\n\n", [connection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; + [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n\n\n", [connection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; continue; } @@ -298,11 +297,11 @@ } // Retrieve the number of rows in the table for progress bar drawing - NSArray *rowArray = [[connection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [tableName backtickQuotedString]]] fetchRowAsArray]; + NSArray *rowArray = [[connection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [tableName backtickQuotedString]]] getRowAsArray]; if ([connection queryErrored] || ![rowArray count]) { - [errors appendFormat:@"%@\n", [connection getLastErrorMessage]]; - [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n\n\n", [connection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; + [errors appendFormat:@"%@\n", [connection lastErrorMessage]]; + [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n\n\n", [connection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; continue; } @@ -314,7 +313,7 @@ // Set up a result set in streaming mode streamingResult = [[connection streamingQueryString:[NSString stringWithFormat:@"SELECT * FROM %@", [tableName backtickQuotedString]] useLowMemoryBlockingStreaming:([self exportUsingLowMemoryBlockingStreaming])] retain]; - NSArray *fieldNames = [streamingResult fetchFieldNames]; + NSArray *fieldNames = [streamingResult fieldNames]; // Inform the delegate that we are about to start writing data for the current table [delegate performSelectorOnMainThread:@selector(sqlExportProcessWillBeginWritingData:) withObject:self waitUntilDone:NO]; @@ -338,7 +337,7 @@ // Inform the delegate that we are about to start writing the data to disk [delegate performSelectorOnMainThread:@selector(sqlExportProcessWillBeginWritingData:) withObject:self waitUntilDone:NO]; - while ((row = [streamingResult fetchNextRowAsArray])) + while ((row = [streamingResult getRowAsArray])) { // Check for cancellation flag if ([self isCancelled]) { @@ -380,7 +379,7 @@ id object = NSArrayObjectAtIndex(row, t); // Add NULL values directly to the output row - if ([object isMemberOfClass:[NSNull class]]) { + if (object == [NSNull null]) { [sqlString appendString:@"NULL"]; } // If the field is off type BIT, the values need a binary prefix of b'x'. @@ -391,7 +390,7 @@ else if ([object isKindOfClass:[NSData class]]) { if ([self sqlOutputEncodeBLOBasHex]) { - [sqlString appendFormat:@"X'%@'", [connection prepareBinaryData:object]]; + [sqlString appendString:[connection escapeAndQuoteData:object]]; } else { [sqlString appendString:@"'"]; @@ -411,8 +410,8 @@ } // GEOMETRY data types directly as hex data - else if ([object isKindOfClass:[MCPGeometryData class]]) { - [sqlString appendFormat:@"X'%@'", [connection prepareBinaryData:[object data]]]; + else if ([object isKindOfClass:[SPMySQLGeometryData class]]) { + [sqlString appendString:[connection escapeAndQuoteData:[object data]]]; } else { [cellValue setString:[object description]]; @@ -427,9 +426,7 @@ } // Otherwise add a quoted string with special characters escaped else { - [sqlString appendString:@"'"]; - [sqlString appendString:[connection prepareString:cellValue]]; - [sqlString appendString:@"'"]; + [sqlString appendString:[connection escapeAndQuoteString:cellValue]]; } } } @@ -488,10 +485,10 @@ } if ([connection queryErrored]) { - [errors appendFormat:@"%@\n", [connection getLastErrorMessage]]; + [errors appendFormat:@"%@\n", [connection lastErrorMessage]]; if ([self sqlOutputIncludeErrors]) { - [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection getLastErrorMessage]] + [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; } } @@ -501,12 +498,12 @@ [queryResult setReturnDataAsStrings:YES]; - if ([queryResult numOfRows]) { + if ([queryResult numberOfRows]) { [metaString setString:@"\n"]; [metaString appendString:@"DELIMITER ;;\n"]; - for (s = 0; s < [queryResult numOfRows]; s++) + for (s = 0; s < [queryResult numberOfRows]; s++) { // Check for cancellation flag if ([self isCancelled]) { @@ -516,7 +513,7 @@ return; } - NSDictionary *triggers = [[NSDictionary alloc] initWithDictionary:[queryResult fetchRowAsDictionary]]; + NSDictionary *triggers = [[NSDictionary alloc] initWithDictionary:[queryResult getRowAsDictionary]]; // Definer is user@host but we need to escape it to `user`@`host` NSArray *triggersDefiner = [[triggers objectForKey:@"Definer"] componentsSeparatedByString:@"@"]; @@ -541,10 +538,10 @@ } if ([connection queryErrored]) { - [errors appendFormat:@"%@\n", [connection getLastErrorMessage]]; + [errors appendFormat:@"%@\n", [connection lastErrorMessage]]; if ([self sqlOutputIncludeErrors]) { - [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection getLastErrorMessage]] + [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; } } @@ -598,7 +595,7 @@ [queryResult setReturnDataAsStrings:YES]; - if ([queryResult numOfRows]) { + if ([queryResult numberOfRows]) { [metaString setString:@"\n"]; [metaString appendFormat:@"--\n-- Dumping routines (%@) for database %@\n--\nDELIMITER ;;\n\n", procedureType, @@ -606,7 +603,7 @@ // Loop through the definitions, exporting if enabled - for (s = 0; s < [queryResult numOfRows]; s++) + for (s = 0; s < [queryResult numberOfRows]; s++) { // Check for cancellation flag if ([self isCancelled]) { @@ -616,7 +613,7 @@ return; } - NSDictionary *proceduresList = [[NSDictionary alloc] initWithDictionary:[queryResult fetchRowAsDictionary]]; + NSDictionary *proceduresList = [[NSDictionary alloc] initWithDictionary:[queryResult getRowAsDictionary]]; NSString *procedureName = [NSString stringWithFormat:@"%@", [proceduresList objectForKey:@"Name"]]; // Only proceed if the item is in the list of items @@ -668,20 +665,20 @@ [NSArrayObjectAtIndex(procedureDefiner, 1) backtickQuotedString] ]; - MCPResult *createProcedureResult = [connection queryString:[NSString stringWithFormat:@"/*!50003 SHOW CREATE %@ %@ */;;", procedureType, + SPMySQLResult *createProcedureResult = [connection queryString:[NSString stringWithFormat:@"/*!50003 SHOW CREATE %@ %@ */;;", procedureType, [procedureName backtickQuotedString]]]; [createProcedureResult setReturnDataAsStrings:YES]; if ([connection queryErrored]) { - [errors appendFormat:@"%@\n", [connection getLastErrorMessage]]; + [errors appendFormat:@"%@\n", [connection lastErrorMessage]]; if ([self sqlOutputIncludeErrors]) { - [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; + [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; } [proceduresList release]; continue; } - NSDictionary *procedureInfo = [[NSDictionary alloc] initWithDictionary:[createProcedureResult fetchRowAsDictionary]]; + NSDictionary *procedureInfo = [[NSDictionary alloc] initWithDictionary:[createProcedureResult getRowAsDictionary]]; [metaString appendFormat:@"/*!50003 SET SESSION SQL_MODE=\"%@\"*/;;\n", [procedureInfo objectForKey:@"sql_mode"]]; @@ -721,10 +718,10 @@ } if ([connection queryErrored]) { - [errors appendFormat:@"%@\n", [connection getLastErrorMessage]]; + [errors appendFormat:@"%@\n", [connection lastErrorMessage]]; if ([self sqlOutputIncludeErrors]) { - [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection getLastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; + [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"# Error: %@\n", [connection lastErrorMessage]] dataUsingEncoding:NSUTF8StringEncoding]]; } } @@ -813,7 +810,10 @@ for (j = 0; j < [[column objectForKey:@"values"] count]; j++) { - [fieldString appendFormat:@"'%@'%@", [connection prepareString:NSArrayObjectAtIndex([column objectForKey:@"values"], j)], ((j + 1) == [[column objectForKey:@"values"] count]) ? @"" : @","]; + [fieldString appendString:[connection escapeAndQuoteString:NSArrayObjectAtIndex([column objectForKey:@"values"], j)]]; + if ((j + 1) != [[column objectForKey:@"values"] count]) { + [fieldString appendString:@","]; + } } [fieldString appendString:@")"]; @@ -841,7 +841,7 @@ [fieldString appendString:@" DEFAULT CURRENT_TIMESTAMP"]; } else { - [fieldString appendFormat:@" DEFAULT '%@'", [connection prepareString:[column objectForKey:@"default"]]]; + [fieldString appendFormat:@" DEFAULT %@", [connection escapeAndQuoteString:[column objectForKey:@"default"]]]; } } diff --git a/Source/SPSSHTunnel.h b/Source/SPSSHTunnel.h index bf7fd8a4..231a41a6 100644 --- a/Source/SPSSHTunnel.h +++ b/Source/SPSSHTunnel.h @@ -23,9 +23,10 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +#import "SPMySQLConnectionProxy.h" +#import "SPMySQLConstants.h" -@interface SPSSHTunnel : NSObject <MCPConnectionProxy> +@interface SPSSHTunnel : NSObject <SPMySQLConnectionProxy> { id delegate; @@ -78,7 +79,7 @@ - (BOOL)setPasswordKeychainName:(NSString *)theName account:(NSString *)theAccount; - (BOOL)setPassword:(NSString *)thePassword; - (BOOL)setKeyFilePath:(NSString *)thePath; -- (NSInteger)state; +- (SPMySQLConnectionProxyState)state; - (NSString *)lastError; - (NSString *)debugMessages; - (NSUInteger)localPort; diff --git a/Source/SPSSHTunnel.m b/Source/SPSSHTunnel.m index 0c25c181..1d4870b2 100644 --- a/Source/SPSSHTunnel.m +++ b/Source/SPSSHTunnel.m @@ -27,6 +27,7 @@ #import "RegexKitLite.h" #import "SPKeychain.h" #import "SPAlertSheets.h" +#import "SPMySQL.h" #import <netinet/in.h> @@ -81,7 +82,7 @@ requestedPassphrase = nil; task = nil; localPort = 0; - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; requestedResponse = NO; passwordInKeychain = NO; @@ -163,12 +164,12 @@ /* * Get the state of the connection. */ -- (NSInteger)state +- (SPMySQLConnectionProxyState)state { // See if an auth dialog is up if (![answerAvailableLock tryLock]) { - return PROXY_STATE_WAITING_FOR_AUTH; + return SPMySQLProxyWaitingForAuth; } [answerAvailableLock unlock]; @@ -204,7 +205,7 @@ { localPort = 0; - if (connectionState != PROXY_STATE_IDLE) return; + if (connectionState != SPMySQLProxyIdle) return; [debugMessagesLock lock]; [debugMessages removeAllObjects]; [debugMessagesLock unlock]; @@ -218,18 +219,18 @@ */ - (void)launchTask:(id) dummy { - if (connectionState != PROXY_STATE_IDLE || task) return; + if (connectionState != SPMySQLProxyIdle || task) return; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSMutableArray *taskArguments; NSMutableDictionary *taskEnvironment; NSString *authenticationAppPath; - connectionState = PROXY_STATE_CONNECTING; + connectionState = SPMySQLProxyConnecting; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; // Enforce a parent window being present for dialogs if (!parentWindow) { - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:@"SSH Tunnel started without a parent window. A parent window must be present."]; @@ -279,7 +280,7 @@ // Abort if no local free port could be allocated if (!localPort || (useHostFallback && !localPortFallback)) { - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:NSLocalizedString(@"No local port could be allocated for the SSH Tunnel.", @"SSH tunnel could not be created because no local port could be allocated")]; @@ -379,8 +380,8 @@ object:nil]; // If the task closed unexpectedly, alert appropriately - if (connectionState != PROXY_STATE_IDLE) { - connectionState = PROXY_STATE_IDLE; + if (connectionState != SPMySQLProxyIdle) { + connectionState = SPMySQLProxyIdle; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:NSLocalizedString(@"The SSH Tunnel has unexpectedly closed.", @"SSH tunnel unexpectedly closed")]; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; @@ -400,7 +401,7 @@ */ - (void)disconnect { - if (connectionState == PROXY_STATE_IDLE) return; + if (connectionState == SPMySQLProxyIdle) return; // Before terminating the tunnel, check that it's actually running. This is to accommodate tunnels which // suddenly disappear as a result of network disconnections. @@ -434,17 +435,17 @@ if ([message rangeOfString:@"Entering interactive session."].location != NSNotFound || [message rangeOfString:@"mux_client_request_session: master session id: "].location != NSNotFound) { - connectionState = PROXY_STATE_CONNECTED; + connectionState = SPMySQLProxyConnected; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; } if ([message rangeOfString:@"Connection established"].location != NSNotFound) { - connectionState = PROXY_STATE_WAITING_FOR_AUTH; + connectionState = SPMySQLProxyWaitingForAuth; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; } if ([message rangeOfString:@"bind: Address already in use"].location != NSNotFound) { - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; [task terminate]; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:NSLocalizedString(@"The SSH Tunnel was unable to bind to the local port. This error may occur if you already have an SSH connection to the same server and are using a 'LocalForward' setting in your SSH configuration.\n\nWould you like to fall back to a standard connection to localhost in order to use the existing tunnel?", @"SSH tunnel unable to bind to local port message")]; @@ -452,26 +453,26 @@ } if ([message rangeOfString:@"closed by remote host." ].location != NSNotFound) { - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; [task terminate]; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:NSLocalizedString(@"The SSH Tunnel was closed 'by the remote host'. This may indicate a networking issue or a network timeout.", @"SSH tunnel was closed by remote host message")]; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; } if ([message rangeOfString:@"Permission denied (" ].location != NSNotFound || [message rangeOfString:@"No more authentication methods to try" ].location != NSNotFound) { - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; [task terminate]; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:NSLocalizedString(@"The SSH Tunnel could not authenticate with the remote host. Please check your password and ensure you still have access.", @"SSH tunnel authentication failed message")]; if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO]; } if ([message rangeOfString:@"connect failed: Connection refused" ].location != NSNotFound) { - connectionState = PROXY_STATE_FORWARDING_FAILED; + connectionState = SPMySQLProxyForwardingFailed; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithString:NSLocalizedString(@"The SSH Tunnel was established successfully, but could not forward data to the remote port as the remote port refused the connection.", @"SSH tunnel forwarding port connection refused message")]; } if ([message rangeOfString:@"Operation timed out" ].location != NSNotFound) { - connectionState = PROXY_STATE_IDLE; + connectionState = SPMySQLProxyIdle; [task terminate]; if (lastError) [lastError release]; lastError = [[NSString alloc] initWithFormat:NSLocalizedString(@"The SSH Tunnel was unable to connect to host %@, or the request timed out.\n\nBe sure that the address is correct and that you have the necessary privileges, or try increasing the connection timeout (currently %ld seconds).", @"SSH tunnel failed or timed out message"), sshHost, (long)[[[NSUserDefaults standardUserDefaults] objectForKey:SPConnectionTimeoutValue] integerValue]]; @@ -480,7 +481,7 @@ } } - if (connectionState != PROXY_STATE_IDLE) { + if (connectionState != SPMySQLProxyIdle) { [[standardError fileHandleForReading] waitForDataInBackgroundAndNotify]; } @@ -674,7 +675,7 @@ { delegate = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; - if (connectionState != PROXY_STATE_IDLE) [self disconnect]; + if (connectionState != SPMySQLProxyIdle) [self disconnect]; [sshHost release]; [sshLogin release]; [remoteHost release]; diff --git a/Source/SPServerVariablesController.h b/Source/SPServerVariablesController.h index 3e87609a..2f882df5 100644 --- a/Source/SPServerVariablesController.h +++ b/Source/SPServerVariablesController.h @@ -23,11 +23,11 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> +@class SPMySQLConnection; @interface SPServerVariablesController : NSWindowController { - MCPConnection *connection; + SPMySQLConnection *connection; NSMutableArray *variables, *variablesFiltered; @@ -37,7 +37,7 @@ IBOutlet NSSearchField *filterVariablesSearchField; } -@property (readwrite, assign) MCPConnection *connection; +@property (readwrite, assign) SPMySQLConnection *connection; - (IBAction)copy:(id)sender; - (IBAction)copyServerVariableName:(id)sender; diff --git a/Source/SPServerVariablesController.m b/Source/SPServerVariablesController.m index 5b9114d8..50f03e31 100644 --- a/Source/SPServerVariablesController.m +++ b/Source/SPServerVariablesController.m @@ -26,6 +26,7 @@ #import "SPServerVariablesController.h" #import "SPDatabaseDocument.h" #import "SPAppController.h" +#import "SPMySQL.h" @interface SPServerVariablesController (PrivateAPI) @@ -287,20 +288,13 @@ */ - (void)_getDatabaseServerVariables { - NSUInteger i = 0; // Get processes - MCPResult *serverVariables = [connection queryString:@"SHOW VARIABLES"]; + SPMySQLResult *serverVariables = [connection queryString:@"SHOW VARIABLES"]; [serverVariables setReturnDataAsStrings:YES]; - if ([serverVariables numOfRows]) [serverVariables dataSeek:0]; - [variables removeAllObjects]; - - for (i = 0; i < [serverVariables numOfRows]; i++) - { - [variables addObject:[serverVariables fetchRowAsDictionary]]; - } + [variables addObjectsFromArray:[serverVariables getAllRows]]; } /** diff --git a/Source/SPTableContent.h b/Source/SPTableContent.h index 90cfc40c..a95dbae3 100644 --- a/Source/SPTableContent.h +++ b/Source/SPTableContent.h @@ -25,9 +25,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPDatabaseDocument, SPCopyTable, SPTextAndLinkCell, SPHistoryController, SPTableInfo, SPDataStorage, SPTextView, SPFieldEditorController; +@class SPDatabaseDocument, SPCopyTable, SPTextAndLinkCell, SPHistoryController, SPTableInfo, SPDataStorage, SPTextView, SPFieldEditorController, SPMySQLConnection, SPMySQLFastStreamingResult; @class SPTableData, SPDatabaseDocument, SPTablesList, SPTableStructure, SPTableList, SPContentFilterManager; @interface SPTableContent : NSObject @@ -55,7 +53,7 @@ IBOutlet id removeButton; IBOutlet id reloadButton; #ifndef SP_REFACTOR - IBOutlet id multipleLineEditingButton; + IBOutlet NSButton *multipleLineEditingButton; IBOutlet id countText; IBOutlet id limitRowsField; IBOutlet id limitRowsButton; @@ -90,7 +88,7 @@ IBOutlet NSPanel *filterTableSetDefaultOperatorSheet; IBOutlet NSComboBox* filterTableSetDefaultOperatorValue; #endif - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; BOOL _mainNibLoaded; BOOL isWorking; @@ -182,7 +180,7 @@ // Pagination - (IBAction) navigatePaginationFromButton:(id)sender; #ifndef SP_REFACTOR -- (IBAction) togglePagination:(id)sender; +- (IBAction) togglePagination:(NSButton *)sender; #endif - (void) setPaginationViewVisibility:(BOOL)makeVisible; - (void) updatePaginationState; @@ -213,11 +211,11 @@ - (void) endDocumentTaskForTab:(NSNotification *)aNotification; // Additional methods -- (void)setConnection:(MCPConnection *)theConnection; +- (void)setConnection:(SPMySQLConnection *)theConnection; - (void)clickLinkArrow:(SPTextAndLinkCell *)theArrowCell; - (void)clickLinkArrowTask:(SPTextAndLinkCell *)theArrowCell; - (IBAction)setCompareTypes:(id)sender; -- (void)processResultIntoDataStorage:(MCPStreamingResult *)theResult approximateRowCount:(NSUInteger)targetRowCount; +- (void)processResultIntoDataStorage:(SPMySQLFastStreamingResult *)theResult approximateRowCount:(NSUInteger)targetRowCount; - (BOOL)saveRowToTable; - (void) addRowErrorSheetDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (NSString *)argumentForRow:(NSInteger)row; diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index a1ff0daa..7549a1f1 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -37,6 +37,7 @@ #import "SPQueryController.h" #import "SPQueryDocumentsController.h" #import "SPTextAndLinkCell.h" +#import "SPMySQL.h" #ifndef SP_REFACTOR #import "QLPreviewPanel.h" #endif @@ -53,6 +54,7 @@ #import "SPAppController.h" #import "SPBundleHTMLOutputController.h" #import "SPCustomQuery.h" +#import <pthread.h> @interface SPTableContent () @@ -745,7 +747,7 @@ NSMutableString *queryString; NSString *queryStringBeforeLimit = nil; NSString *filterString; - MCPStreamingResult *streamingResult; + SPMySQLFastStreamingResult *streamingResult; NSInteger rowsToLoad = [[tableDataInstance statusValueForKey:@"Rows"] integerValue]; #ifndef SP_REFACTOR @@ -817,7 +819,7 @@ // Ensure the number of columns are unchanged; if the column count has changed, abort the load // and queue a full table reload. BOOL fullTableReloadRequired = NO; - if (streamingResult && [dataColumns count] != [streamingResult numOfFields]) { + if (streamingResult && [dataColumns count] != [streamingResult numberOfFields]) { [tableDocumentInstance disableTaskCancellation]; [mySQLConnection cancelCurrentQuery]; [streamingResult cancelResultLoad]; @@ -831,7 +833,7 @@ if (streamingResult) [streamingResult release]; // If the result is empty, and a late page is selected, reset the page - if (!fullTableReloadRequired && [prefs boolForKey:SPLimitResults] && queryStringBeforeLimit && !tableRowsCount && ![mySQLConnection queryCancelled]) { + if (!fullTableReloadRequired && [prefs boolForKey:SPLimitResults] && queryStringBeforeLimit && !tableRowsCount && ![mySQLConnection lastQueryWasCancelled]) { contentPage = 1; previousTableRowsCount = tableRowsCount; queryString = [NSMutableString stringWithFormat:@"%@ LIMIT 0,%ld", queryStringBeforeLimit, (long)[prefs integerForKey:SPLimitResultsValue]]; @@ -843,7 +845,7 @@ } } - if ([mySQLConnection queryCancelled] || [mySQLConnection queryErrored]) + if ([mySQLConnection lastQueryWasCancelled] || [mySQLConnection queryErrored]) isInterruptedLoad = YES; else isInterruptedLoad = NO; @@ -869,7 +871,7 @@ // Retrieve and cache the column definitions for editing views if (cqColumnDefinition) [cqColumnDefinition release]; - cqColumnDefinition = [[streamingResult fetchResultFieldsStructure] retain]; + cqColumnDefinition = [[streamingResult fieldDefinitions] retain]; // Notify listenters that the query has finished @@ -879,16 +881,16 @@ [[NSNotificationCenter defaultCenter] sequelProPostNotificationOnMainThreadWithName:@"SMySQLQueryHasBeenPerformed" object:tableDocumentInstance]; #endif - if ([mySQLConnection queryErrored] && ![mySQLConnection queryCancelled]) { + if ([mySQLConnection queryErrored] && ![mySQLConnection lastQueryWasCancelled]) { #ifndef SP_REFACTOR if(activeFilter == 0) { #endif if(filterString) SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"The table data couldn't be loaded presumably due to used filter clause. \n\nMySQL said: %@", @"message of panel when loading of table failed and presumably due to used filter argument"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"The table data couldn't be loaded presumably due to used filter clause. \n\nMySQL said: %@", @"message of panel when loading of table failed and presumably due to used filter argument"), [mySQLConnection lastErrorMessage]]); else SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"The table data couldn't be loaded.\n\nMySQL said: %@", @"message of panel when loading of table failed"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"The table data couldn't be loaded.\n\nMySQL said: %@", @"message of panel when loading of table failed"), [mySQLConnection lastErrorMessage]]); } #ifndef SP_REFACTOR // Filter task came from filter table @@ -910,9 +912,8 @@ /** * Processes a supplied streaming result set, loading it into the data array. */ -- (void)processResultIntoDataStorage:(MCPStreamingResult *)theResult approximateRowCount:(NSUInteger)targetRowCount +- (void)processResultIntoDataStorage:(SPMySQLFastStreamingResult *)theResult approximateRowCount:(NSUInteger)targetRowCount { - NSArray *tempRow; NSUInteger i; NSUInteger dataColumnsCount = [dataColumns count]; BOOL *columnBlobStatuses = malloc(dataColumnsCount * sizeof(BOOL)); @@ -949,13 +950,13 @@ // Loop through the result rows as they become available tableRowsCount = 0; - while ((tempRow = [theResult fetchNextRowAsArray])) { + for (NSArray *eachRow in theResult) { pthread_mutex_lock(&tableValuesLock); if (tableRowsCount < previousTableRowsCount) { - SPDataStorageReplaceRow(tableValues, tableRowsCount, tempRow); + SPDataStorageReplaceRow(tableValues, tableRowsCount, eachRow); } else { - SPDataStorageAddRow(tableValues, tempRow); + SPDataStorageAddRow(tableValues, eachRow); } // Alter the values for hidden blob and text fields if appropriate @@ -1569,7 +1570,7 @@ * layer depending on the current state. */ #ifndef SP_REFACTOR -- (IBAction) togglePagination:(id)sender +- (IBAction) togglePagination:(NSButton *)sender { if ([sender state] == NSOnState) [self setPaginationViewVisibility:YES]; else [self setPaginationViewVisibility:NO]; @@ -1660,7 +1661,6 @@ - (NSString *)argumentForRow:(NSUInteger)rowIndex ofTable:(NSString *)tableForColumn andDatabase:(NSString *)database includeBlobs:(BOOL)includeBlobs { NSArray *dataRow; - NSDictionary *theRow; id field; NSMutableArray *argumentParts = [NSMutableArray array]; @@ -1675,17 +1675,14 @@ dataRow = [tableValues rowContentsAtIndex:rowIndex]; // Get the primary key if there is one, using any columns present within it - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@.%@", + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@.%@", [database backtickQuotedString], [tableForColumn backtickQuotedString]]]; [theResult setReturnDataAsStrings:YES]; - if ([theResult numOfRows]) [theResult dataSeek:0]; NSMutableArray *primaryColumnsInSpecifiedTable = [NSMutableArray array]; - NSUInteger i; - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { - theRow = [theResult fetchRowAsDictionary]; - if ( [[theRow objectForKey:@"Key"] isEqualToString:@"PRI"] ) { + for (NSDictionary *eachRow in theResult) { + if ( [[eachRow objectForKey:@"Key"] isEqualToString:@"PRI"] ) { for (field in columnsInSpecifiedTable) { - if([[field objectForKey:@"org_name"] isEqualToString:[theRow objectForKey:@"Field"]]) { + if([[field objectForKey:@"org_name"] isEqualToString:[eachRow objectForKey:@"Field"]]) { [primaryColumnsInSpecifiedTable addObject:field]; } } @@ -1698,7 +1695,7 @@ // Build up the argument for (field in columnsToQuery) { id aValue = [dataRow objectAtIndex:[[field objectForKey:@"datacolumnindex"] integerValue]]; - if ([aValue isKindOfClass:[NSNull class]] || [aValue isNSNull]) { + if ([aValue isNSNull]) { [argumentParts addObject:[NSString stringWithFormat:@"%@ IS NULL", [[field objectForKey:@"org_name"] backtickQuotedString]]]; } else { NSString *fieldTypeGrouping = [field objectForKey:@"typegrouping"]; @@ -1718,14 +1715,14 @@ [argumentParts addObject:[NSString stringWithFormat:@"%@=b'%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [aValue description]]]; } else if ([fieldTypeGrouping isEqualToString:@"geometry"]) { - [argumentParts addObject:[NSString stringWithFormat:@"%@=X'%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection prepareBinaryData:[aValue data]]]]; + [argumentParts addObject:[NSString stringWithFormat:@"%@=%@", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection escapeAndQuoteData:[aValue data]]]]; } // BLOB/TEXT data else if ([aValue isKindOfClass:[NSData class]]) { - [argumentParts addObject:[NSString stringWithFormat:@"%@=X'%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection prepareBinaryData:aValue]]]; + [argumentParts addObject:[NSString stringWithFormat:@"%@=%@", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection escapeAndQuoteData:aValue]]]; } else { - [argumentParts addObject:[NSString stringWithFormat:@"%@='%@'", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection prepareString:aValue]]]; + [argumentParts addObject:[NSString stringWithFormat:@"%@=%@", [[field objectForKey:@"org_name"] backtickQuotedString], [mySQLConnection escapeAndQuoteString:aValue]]]; } } } @@ -1790,7 +1787,7 @@ - (IBAction)duplicateRow:(id)sender { NSMutableArray *tempRow; - MCPResult *queryResult; + SPMySQLResult *queryResult; NSDictionary *row; NSArray *dbDataRow = nil; NSUInteger i; @@ -1819,7 +1816,7 @@ // If we have indexes, use argumentForRow queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@", [selectedTable backtickQuotedString], [self argumentForRow:[tableContentView selectedRow]]]]; - dbDataRow = [queryResult fetchRowAsArray]; + dbDataRow = [queryResult getRowAsArray]; } #endif @@ -1827,12 +1824,10 @@ queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@", [selectedTable backtickQuotedString]]]; [queryResult setReturnDataAsStrings:YES]; - - if ([queryResult numOfRows]) [queryResult dataSeek:0]; - - for (i = 0; i < [queryResult numOfRows]; i++) + + for (i = 0; i < [queryResult numberOfRows]; i++) { - row = [queryResult fetchRowAsDictionary]; + row = [queryResult getRowAsDictionary]; if ([[row objectForKey:@"Extra"] isEqualToString:@"auto_increment"]) { [tempRow replaceObjectAtIndex:i withObject:[NSNull null]]; @@ -1904,7 +1899,7 @@ contextInfo = @"removeallrows"; // If table has PRIMARY KEY ask for resetting the auto increment after deletion if given - if(![[tableDataInstance statusValueForKey:@"Auto_increment"] isKindOfClass:[NSNull class]]) { + if(![[tableDataInstance statusValueForKey:@"Auto_increment"] isNSNull]) { [alert setShowsSuppressionButton:YES]; #ifndef SP_REFACTOR [[alert suppressionButton] setState:([prefs boolForKey:SPResetAutoIncrementAfterDeletionOfAllRows]) ? NSOnState : NSOffState]; @@ -1980,7 +1975,7 @@ [self performSelector:@selector(showErrorSheetWith:) withObject:[NSArray arrayWithObjects:NSLocalizedString(@"Error", @"error"), [NSString stringWithFormat:NSLocalizedString(@"Couldn't delete rows.\n\nMySQL said: %@", @"message when deleteing all rows failed"), - [mySQLConnection getLastErrorMessage]], + [mySQLConnection lastErrorMessage]], nil] afterDelay:0.3]; } @@ -2029,18 +2024,17 @@ primaryKeyFieldNames = [tableDataInstance columnNames]; NSInteger numberOfRows = 0; + // Get the number of rows in the table - MCPResult *r; - r = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [selectedTable backtickQuotedString]]]; - if (![mySQLConnection queryErrored]) { - NSArray *a = [r fetchRowAsArray]; - if([a count]) - numberOfRows = [[a objectAtIndex:0] integerValue]; + NSString *returnedCount = [mySQLConnection getFirstFieldFromQuery:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [selectedTable backtickQuotedString]]]; + if (returnedCount) { + numberOfRows = [returnedCount integerValue]; } + // Check for uniqueness via LIMIT numberOfRows-1,numberOfRows for speed if(numberOfRows > 0) { [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT * FROM %@ GROUP BY %@ LIMIT %ld,%ld", [selectedTable backtickQuotedString], [primaryKeyFieldNames componentsJoinedAndBacktickQuoted], (long)(numberOfRows-1), (long)numberOfRows]]; - if([mySQLConnection affectedRows] == 0) + if ([mySQLConnection rowsAffectedByLastQuery] == 0) primaryKeyFieldNames = nil; } else { primaryKeyFieldNames = nil; @@ -2058,7 +2052,7 @@ [mySQLConnection queryString:[NSString stringWithFormat:@"DELETE FROM %@ WHERE %@", [selectedTable backtickQuotedString], wherePart]]; // Check for errors - if ( ![mySQLConnection affectedRows] || [mySQLConnection queryErrored]) { + if ( ![mySQLConnection rowsAffectedByLastQuery] || [mySQLConnection queryErrored]) { // If error delete that index from selectedRows for reloading table if // "ReloadAfterRemovingRow" is disbaled if(!reloadAfterRemovingRow) @@ -2086,9 +2080,9 @@ id keyValue = [tableValues cellDataAtRow:anIndex column:[[[tableDataInstance columnWithName:NSArrayObjectAtIndex(primaryKeyFieldNames,0)] objectForKey:@"datacolumnindex"] integerValue]]; if([keyValue isKindOfClass:[NSData class]]) - [deleteQuery appendFormat:@"X'%@'", [mySQLConnection prepareBinaryData:keyValue]]; + [deleteQuery appendString:[mySQLConnection escapeAndQuoteData:keyValue]]; else - [deleteQuery appendFormat:@"'%@'", [keyValue description]]; + [deleteQuery appendString:[mySQLConnection escapeAndQuoteString:[keyValue description]]]; // Split deletion query into 256k chunks if([deleteQuery length] > 256000) { @@ -2096,7 +2090,7 @@ [mySQLConnection queryString:deleteQuery]; // Remember affected rows for error checking - affectedRows += (NSInteger)[mySQLConnection affectedRows]; + affectedRows += (NSInteger)[mySQLConnection rowsAffectedByLastQuery]; // Reinit a new deletion query [deleteQuery setString:[NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ IN (", [selectedTable backtickQuotedString], [NSArrayObjectAtIndex(primaryKeyFieldNames,0) backtickQuotedString]]]; @@ -2115,7 +2109,7 @@ [mySQLConnection queryString:deleteQuery]; // Remember affected rows for error checking - affectedRows += (NSInteger)[mySQLConnection affectedRows]; + affectedRows += (NSInteger)[mySQLConnection rowsAffectedByLastQuery]; } errors = (affectedRows > 0) ? [selectedRows count] - affectedRows : [selectedRows count]; @@ -2139,7 +2133,7 @@ [mySQLConnection queryString:deleteQuery]; // Remember affected rows for error checking - affectedRows += (NSInteger)[mySQLConnection affectedRows]; + affectedRows += (NSInteger)[mySQLConnection rowsAffectedByLastQuery]; // Reinit a new deletion query [deleteQuery setString:[NSString stringWithFormat:@"DELETE FROM %@ WHERE ", [selectedTable backtickQuotedString]]]; @@ -2159,7 +2153,7 @@ [mySQLConnection queryString:deleteQuery]; // Remember affected rows for error checking - affectedRows += (NSInteger)[mySQLConnection affectedRows]; + affectedRows += (NSInteger)[mySQLConnection rowsAffectedByLastQuery]; } errors = (affectedRows > 0) ? [selectedRows count] - affectedRows : [selectedRows count]; @@ -2274,7 +2268,7 @@ else if([o isKindOfClass:[NSString class]]) { [tempRow addObject:[o description]]; } - else if([o isKindOfClass:[MCPGeometryData class]]) { + else if([o isKindOfClass:[SPMySQLGeometryData class]]) { SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[o coordinates]]; NSImage *image = [v thumbnailImage]; NSString *imageStr = @""; @@ -2370,7 +2364,7 @@ /** * Sets the connection (received from SPDatabaseDocument) and makes things that have to be done only once */ -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { mySQLConnection = theConnection; @@ -2697,20 +2691,20 @@ // Convert geometry values to their string values } else if ([fieldTypeGroup isEqualToString:@"geometry"]) { - fieldValue = ([rowObject isKindOfClass:[MCPGeometryData class]]) ? [[rowObject wktString] getGeomFromTextString] : [(NSString*)rowObject getGeomFromTextString]; + fieldValue = ([rowObject isKindOfClass:[SPMySQLGeometryData class]]) ? [[rowObject wktString] getGeomFromTextString] : [(NSString*)rowObject getGeomFromTextString]; // Convert the object to a string (here we can add special treatment for date-, number- and data-fields) } else { // I believe these class matches are not ever met at present. if ([rowObject isKindOfClass:[NSCalendarDate class]]) { - fieldValue = [NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[rowObject description]]]; + fieldValue = [mySQLConnection escapeAndQuoteString:[rowObject description]]; } else if ([rowObject isKindOfClass:[NSNumber class]]) { fieldValue = [rowObject stringValue]; // Convert data to its hex representation } else if ([rowObject isKindOfClass:[NSData class]]) { - fieldValue = [NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:rowObject]]; + fieldValue = [mySQLConnection escapeAndQuoteData:rowObject]; } else { if ([[rowObject description] isEqualToString:@"CURRENT_TIMESTAMP"]) { @@ -2720,7 +2714,7 @@ } else if ([fieldTypeGroup isEqualToString:@"date"] && [[rowObject description] isEqualToString:@"NOW()"]) { fieldValue = @"NOW()"; } else { - fieldValue = [NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[rowObject description]]]; + fieldValue = [mySQLConnection escapeAndQuoteString:[rowObject description]]; } } } @@ -2767,7 +2761,7 @@ #endif // If no rows have been changed, show error if appropriate. - if ( ![mySQLConnection affectedRows] && ![mySQLConnection queryErrored] ) { + if ( ![mySQLConnection rowsAffectedByLastQuery] && ![mySQLConnection queryErrored] ) { #ifndef SP_REFACTOR if ( [prefs boolForKey:SPShowNoAffectedRowsError] ) { SPBeginAlertSheet(NSLocalizedString(@"Warning", @"warning"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, @@ -2809,7 +2803,7 @@ // Set the insertId for fields with auto_increment for ( i = 0; i < [dataColumns count] ; i++ ) { if ([[NSArrayObjectAtIndex(dataColumns, i) objectForKey:@"autoincrement"] integerValue]) { - [tableValues replaceObjectInRow:currentlyEditingRow column:i withObject:[[NSNumber numberWithUnsignedLongLong:[mySQLConnection insertId]] description]]; + [tableValues replaceObjectInRow:currentlyEditingRow column:i withObject:[[NSNumber numberWithUnsignedLongLong:[mySQLConnection lastInsertID]] description]]; } } #ifndef SP_REFACTOR @@ -2837,7 +2831,7 @@ } else { SPBeginAlertSheet(NSLocalizedString(@"Couldn't write row", @"Couldn't write row error"), NSLocalizedString(@"Edit row", @"Edit row button"), NSLocalizedString(@"Discard changes", @"discard changes button"), nil, [tableDocumentInstance parentWindow], self, @selector(addRowErrorSheetDidEnd:returnCode:contextInfo:), nil, - [NSString stringWithFormat:NSLocalizedString(@"MySQL said:\n\n%@", @"message of panel when error while adding row to db"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"MySQL said:\n\n%@", @"message of panel when error while adding row to db"), [mySQLConnection lastErrorMessage]]); return NO; } } @@ -2942,8 +2936,7 @@ */ - (NSString *)argumentForRow:(NSInteger)row excludingLimits:(BOOL)excludeLimits { - MCPResult *theResult; - NSDictionary *theRow; + SPMySQLResult *theResult; id tempValue; NSMutableString *value = [NSMutableString string]; NSMutableString *argument = [NSMutableString string]; @@ -2963,11 +2956,9 @@ keys = [[NSMutableArray alloc] init]; theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@", [selectedTable backtickQuotedString]]]; [theResult setReturnDataAsStrings:YES]; - if ([theResult numOfRows]) [theResult dataSeek:0]; - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { - theRow = [theResult fetchRowAsDictionary]; - if ( [[theRow objectForKey:@"Key"] isEqualToString:@"PRI"] ) { - [keys addObject:[theRow objectForKey:@"Field"]]; + for (NSDictionary *eachRow in theResult) { + if ( [[eachRow objectForKey:@"Key"] isEqualToString:@"PRI"] ) { + [keys addObject:[eachRow objectForKey:@"Field"]]; } } } @@ -3015,17 +3006,17 @@ else { // If the field is of type BIT then it needs a binary prefix if ([[[tableDataInstance columnWithName:NSArrayObjectAtIndex(keys, i)] objectForKey:@"type"] isEqualToString:@"BIT"]) { - [value setString:[NSString stringWithFormat:@"b'%@'", [mySQLConnection prepareString:tempValue]]]; + [value setString:[NSString stringWithFormat:@"b'%@'", [mySQLConnection escapeString:tempValue includingQuotes:NO]]]; } - else if ([tempValue isKindOfClass:[MCPGeometryData class]]) { - [value setString:[NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:[tempValue data]]]]; + else if ([tempValue isKindOfClass:[SPMySQLGeometryData class]]) { + [value setString:[mySQLConnection escapeAndQuoteData:[tempValue data]]]; } // BLOB/TEXT data else if ([tempValue isKindOfClass:[NSData class]]) { - [value setString:[NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:tempValue]]]; + [value setString:[mySQLConnection escapeAndQuoteData:tempValue]]; } else - [value setString:[NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:tempValue]]]; + [value setString:[mySQLConnection escapeAndQuoteString:tempValue]]; [argument appendFormat:@"%@ = %@", [NSArrayObjectAtIndex(keys, i) backtickQuotedString], value]; } @@ -3120,7 +3111,7 @@ [tableDocumentInstance startTaskWithDescription:NSLocalizedString(@"Checking field data for editing...", @"checking field data for editing task description")]; // Actual check whether field can be identified bijectively - MCPResult *tempResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@.%@ %@", + SPMySQLResult *tempResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@.%@ %@", [[columnDefinition objectForKey:@"db"] backtickQuotedString], [tableForColumn backtickQuotedString], fieldIDQueryStr]]; @@ -3130,7 +3121,7 @@ return [NSArray arrayWithObjects:[NSNumber numberWithInteger:-1], @"", nil]; } - NSArray *tempRow = [tempResult fetchRowAsArray]; + NSArray *tempRow = [tempResult getRowAsArray]; if([tempRow count] && [[tempRow objectAtIndex:0] integerValue] > 1) { // try to identify the cell by using blob data @@ -3150,7 +3141,7 @@ return [NSArray arrayWithObjects:[NSNumber numberWithInteger:-1], @"", nil]; } - tempRow = [tempResult fetchRowAsArray]; + tempRow = [tempResult getRowAsArray]; if([tempRow count] && [[tempRow objectAtIndex:0] integerValue] < 1) { [tableDocumentInstance endTask]; @@ -3309,11 +3300,11 @@ NSString *newObject = nil; if ( [anObject isKindOfClass:[NSCalendarDate class]] ) { - newObject = [NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[anObject description]]]; + newObject = [mySQLConnection escapeAndQuoteString:[anObject description]]; } else if ( [anObject isKindOfClass:[NSNumber class]] ) { newObject = [anObject stringValue]; } else if ( [anObject isKindOfClass:[NSData class]] ) { - newObject = [NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:anObject]]; + newObject = [mySQLConnection escapeAndQuoteData:anObject]; } else { if ( [[anObject description] isEqualToString:@"CURRENT_TIMESTAMP"] ) { newObject = @"CURRENT_TIMESTAMP"; @@ -3327,7 +3318,7 @@ && [[anObject description] isEqualToString:@"NOW()"]) { newObject = @"NOW()"; } else { - newObject = [NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:[anObject description]]]; + newObject = [mySQLConnection escapeAndQuoteString:[anObject description]]; } } @@ -3340,7 +3331,7 @@ // Check for errors while UPDATE if ([mySQLConnection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), NSLocalizedString(@"Cancel", @"cancel button"), nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't write field.\nMySQL said: %@", @"message of panel when error while updating field to db"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't write field.\nMySQL said: %@", @"message of panel when error while updating field to db"), [mySQLConnection lastErrorMessage]]); [tableDocumentInstance endTask]; [[NSNotificationCenter defaultCenter] postNotificationName:@"SMySQLQueryHasBeenPerformed" object:tableDocumentInstance]; @@ -3349,7 +3340,7 @@ // This shouldn't happen – for safety reasons - if ( ![mySQLConnection affectedRows] ) { + if ( ![mySQLConnection rowsAffectedByLastQuery] ) { #ifndef SP_REFACTOR if ( [prefs boolForKey:SPShowNoAffectedRowsError] ) { SPBeginAlertSheet(NSLocalizedString(@"Warning", @"warning"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, @@ -3864,7 +3855,7 @@ */ - (NSInteger)fetchNumberOfRows { - return [[[[mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [selectedTable backtickQuotedString]]] fetchRowAsArray] objectAtIndex:0] integerValue]; + return [[mySQLConnection getFirstFieldFromQuery:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [selectedTable backtickQuotedString]]] integerValue]; } /** @@ -3951,7 +3942,7 @@ return nil; } } - else if ([theValue isKindOfClass:[MCPGeometryData class]]) { + else if ([theValue isKindOfClass:[SPMySQLGeometryData class]]) { SPGeometryDataView *v = [[SPGeometryDataView alloc] initWithCoordinates:[theValue coordinates]]; image = [v thumbnailImage]; if(image) { @@ -4035,7 +4026,7 @@ theValue = SPDataStorageObjectAtRowAndColumn(tableValues, rowIndex, columnIndex); } - if([theValue isKindOfClass:[MCPGeometryData class]]) + if([theValue isKindOfClass:[SPMySQLGeometryData class]]) return [theValue wktString]; if ([theValue isNSNull]) @@ -4242,7 +4233,7 @@ if ([mySQLConnection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't sort table. MySQL said: %@", @"message of panel when sorting of table failed"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't sort table. MySQL said: %@", @"message of panel when sorting of table failed"), [mySQLConnection lastErrorMessage]]); [tableDocumentInstance endTask]; [sortPool drain]; return; @@ -4403,14 +4394,14 @@ // Only get the data for the selected column, not all of them NSString *query = [NSString stringWithFormat:@"SELECT %@ FROM %@ WHERE %@", [[[aTableColumn headerCell] stringValue] backtickQuotedString], [selectedTable backtickQuotedString], wherePart]; - MCPResult *tempResult = [mySQLConnection queryString:query]; - if (![tempResult numOfRows]) { + SPMySQLResult *tempResult = [mySQLConnection queryString:query]; + if (![tempResult numberOfRows]) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, NSLocalizedString(@"Couldn't load the row. Reload the table to be sure that the row exists and use a primary key for your table.", @"message of panel when loading of row failed")); return NO; } - NSArray *tempRow = [tempResult fetchRowAsArray]; + NSArray *tempRow = [tempResult getRowAsArray]; [tableValues replaceObjectInRow:rowIndex column:[[tableContentView tableColumns] indexOfObject:aTableColumn] withObject:[tempRow objectAtIndex:0]]; [tableContentView reloadData]; } diff --git a/Source/SPTableCopy.m b/Source/SPTableCopy.m index 5aa55df1..539b83af 100644 --- a/Source/SPTableCopy.m +++ b/Source/SPTableCopy.m @@ -24,6 +24,7 @@ #import "SPDBActionCommons.h" #import "SPTableCopy.h" +#import "SPMySQL.h" @implementation SPTableCopy @@ -31,10 +32,10 @@ { NSString *showCreateTableStatment = [NSString stringWithFormat:@"SHOW CREATE TABLE %@.%@", [sourceDB backtickQuotedString], [tableName backtickQuotedString]]; - MCPResult *theResult = [connection queryString:showCreateTableStatment]; + SPMySQLResult *theResult = [connection queryString:showCreateTableStatment]; - if ([theResult numOfRows] != 0) { - return [[theResult fetchRowAsArray] objectAtIndex:1]; + if ([theResult numberOfRows] != 0) { + return [[theResult getRowAsArray] objectAtIndex:1]; } return @""; diff --git a/Source/SPTableData.h b/Source/SPTableData.h index b4042527..c7ebe37b 100644 --- a/Source/SPTableData.h +++ b/Source/SPTableData.h @@ -23,10 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPDatabaseDocument; -@class SPTablesList; +@class SPDatabaseDocument, SPTablesList, SPMySQLConnection; @interface SPTableData : NSObject { @@ -42,7 +39,7 @@ NSString *tableEncoding; NSString *tableCreateSyntax; - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; pthread_mutex_t dataProcessingLock; @@ -51,7 +48,7 @@ @property (readonly, assign) BOOL tableHasAutoIncrementField; -- (void) setConnection:(MCPConnection *)theConnection; +- (void) setConnection:(SPMySQLConnection *)theConnection; - (NSString *) tableEncoding; - (NSString *) tableCreateSyntax; - (NSArray *) columns; diff --git a/Source/SPTableData.m b/Source/SPTableData.m index 297718b9..5f043548 100644 --- a/Source/SPTableData.m +++ b/Source/SPTableData.m @@ -30,6 +30,8 @@ #import "SPAlertSheets.h" #import "RegexKitLite.h" #import "SPServerSupport.h" +#import "SPMySQL.h" +#include <pthread.h> @interface SPTableData (PrivateAPI) @@ -70,7 +72,7 @@ * * @param theConnection The used connection for the SPDatabaseDocument */ -- (void) setConnection:(MCPConnection *)theConnection +- (void) setConnection:(SPMySQLConnection *)theConnection { mySQLConnection = theConnection; [mySQLConnection retain]; @@ -476,7 +478,7 @@ [constraints removeAllObjects]; // Retrieve the CREATE TABLE syntax for the table - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE %@", [tableName backtickQuotedString]]]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE TABLE %@", [tableName backtickQuotedString]]]; [theResult setReturnDataAsStrings:YES]; // Check for any errors, but only display them if a connection still exists @@ -485,10 +487,10 @@ SPBeginAlertSheet(NSLocalizedString(@"Error retrieving table information", @"error retrieving table information message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving the information for table '%@'. Please try again.\n\nMySQL said: %@", @"error retrieving table information informative message"), - tableName, [mySQLConnection getLastErrorMessage]]); + tableName, [mySQLConnection lastErrorMessage]]); // If the current table doesn't exist anymore reload table list - if([mySQLConnection getLastErrorID] == 1146) { + if([mySQLConnection lastErrorID] == 1146) { // Release the table loading lock to allow reselection/reloading to requery the database. pthread_mutex_unlock(&dataProcessingLock); @@ -503,8 +505,8 @@ } // Retrieve the table syntax string - NSArray *syntaxResult = [theResult fetchRowAsArray]; - NSArray *resultFieldNames = [theResult fetchFieldNames]; + NSArray *syntaxResult = [theResult getRowAsArray]; + NSArray *resultFieldNames = [theResult fieldNames]; // Only continue if syntaxResult is not nil. This accommodates causes where the above query caused the // connection reconnect dialog to appear and the user chose to close the connection. @@ -798,7 +800,6 @@ NSMutableArray *tableColumns; NSDictionary *resultRow; NSMutableDictionary *tableColumn, *viewData; - NSUInteger i; BOOL changeEncoding = ![[mySQLConnection encoding] isEqualToString:@"utf8"]; // Catch unselected views and return nil @@ -811,7 +812,7 @@ } // Retrieve the CREATE TABLE syntax for the table - MCPResult *theResult = [mySQLConnection queryString: [NSString stringWithFormat: @"SHOW CREATE TABLE %@", + SPMySQLResult *theResult = [mySQLConnection queryString: [NSString stringWithFormat: @"SHOW CREATE TABLE %@", [viewName backtickQuotedString] ]]; [theResult setReturnDataAsStrings:YES]; @@ -822,7 +823,7 @@ SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"), - [mySQLConnection getLastErrorMessage]]); + [mySQLConnection lastErrorMessage]]); if (changeEncoding) [mySQLConnection restoreStoredEncoding]; } return nil; @@ -830,7 +831,7 @@ // Retrieve the table syntax string if (tableCreateSyntax) [tableCreateSyntax release], tableCreateSyntax = nil; - NSString *syntaxString = [[theResult fetchRowAsArray] objectAtIndex:1]; + NSString *syntaxString = [[theResult getRowAsArray] objectAtIndex:1]; // A NULL value indicates that the user does not have permission to view the syntax if ([syntaxString isNSNull]) { @@ -856,20 +857,18 @@ SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"), - [mySQLConnection getLastErrorMessage]]); + [mySQLConnection lastErrorMessage]]); if (changeEncoding) [mySQLConnection restoreStoredEncoding]; } return nil; } // Loop through the fields and capture details - if ([theResult numOfRows]) [theResult dataSeek:0]; tableColumns = [[NSMutableArray alloc] init]; tableColumn = [[NSMutableDictionary alloc] init]; fieldParser = [[SPSQLParser alloc] init]; - for ( i = 0; i < [theResult numOfRows] ; i++ ) { + for (resultRow in theResult) { [tableColumn removeAllObjects]; - resultRow = [theResult fetchRowAsDictionary]; // Add the column index and name [tableColumn setObject:[NSString stringWithFormat:@"%llu", (unsigned long long)[tableColumns count]] forKey:@"datacolumnindex"]; @@ -938,7 +937,7 @@ [escapedTableName replaceOccurrencesOfString:@"\\" withString:@"\\\\" options:0 range:NSMakeRange(0, [escapedTableName length])]; [escapedTableName replaceOccurrencesOfString:@"'" withString:@"\\\'" options:0 range:NSMakeRange(0, [escapedTableName length])]; - MCPResult *tableStatusResult = nil; + SPMySQLResult *tableStatusResult = nil; if ([tableListInstance tableType] == SPTableTypeProc) { NSMutableString *escapedDatabaseName = [NSMutableString stringWithString:[tableDocumentInstance database]]; @@ -967,7 +966,7 @@ SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occured while retrieving status data.\nMySQL said: %@", @"message of panel when retrieving view information failed"), - [mySQLConnection getLastErrorMessage]]); + [mySQLConnection lastErrorMessage]]); if (changeEncoding) [mySQLConnection restoreStoredEncoding]; } pthread_mutex_unlock(&dataProcessingLock); @@ -975,7 +974,7 @@ } // Retrieve the status as a dictionary and set as the cache - [status setDictionary:[tableStatusResult fetchRowAsDictionary]]; + [status setDictionary:[tableStatusResult getRowAsDictionary]]; if ([tableListInstance tableType] == SPTableTypeTable) { @@ -1001,10 +1000,10 @@ // [status objectForKey:@"Rows"] is NULL then try to get the number of rows via SELECT COUNT(1) FROM `foo` // this happens e.g. for db "information_schema" - if([[status objectForKey:@"Rows"] isKindOfClass:[NSNull class]]) { + if([[status objectForKey:@"Rows"] isNSNull]) { tableStatusResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [escapedTableName backtickQuotedString] ]]; if (![mySQLConnection queryErrored]) - [status setObject:[[tableStatusResult fetchRowAsArray] objectAtIndex:0] forKey:@"Rows"]; + [status setObject:[[tableStatusResult getRowAsArray] objectAtIndex:0] forKey:@"Rows"]; [status setObject:@"y" forKey:@"RowsCountAccurate"]; } @@ -1042,7 +1041,7 @@ [mySQLConnection setEncoding:@"utf8"]; } - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"/*!50003 SHOW TRIGGERS WHERE `Table` = %@ */", + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"/*!50003 SHOW TRIGGERS WHERE `Table` = %@ */", [[tableListInstance tableName] tickQuotedString]]]; [theResult setReturnDataAsStrings:YES]; @@ -1052,7 +1051,7 @@ SPBeginAlertSheet(NSLocalizedString(@"Error retrieving trigger information", @"error retrieving trigger information message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving the trigger information for table '%@'. Please try again.\n\nMySQL said: %@", @"error retrieving table information informative message"), - [tableListInstance tableName], [mySQLConnection getLastErrorMessage]]); + [tableListInstance tableName], [mySQLConnection lastErrorMessage]]); if (triggers) [triggers release], triggers = nil; if (changeEncoding) [mySQLConnection restoreStoredEncoding]; } @@ -1061,11 +1060,8 @@ return NO; } - if (triggers) [triggers release]; - triggers = [[NSMutableArray alloc] init]; - for (NSUInteger i=0; i<[theResult numOfRows]; i++) { - [triggers addObject:[theResult fetchRowAsDictionary]]; - } + [triggers removeAllObjects]; + [triggers addObjectsFromArray:[theResult getAllRows]]; if (changeEncoding) [mySQLConnection restoreStoredEncoding]; @@ -1298,9 +1294,7 @@ NSString *selectedTable = [tableListInstance tableName]; if(![selectedTable length]) return nil; - MCPResult *r; - NSArray *resultRow; - NSUInteger i; + SPMySQLResult *r; NSMutableArray *keyColumns = [NSMutableArray array]; // select all columns that are primary keys @@ -1308,22 +1302,22 @@ r = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@ /*!50003 WHERE `key` = 'PRI'*/", [selectedTable backtickQuotedString]]]; [r setReturnDataAsStrings:YES]; - if([r numOfRows] < 1) { + if ([r numberOfRows] < 1) { if (changeEncoding && [mySQLConnection isConnected]) [mySQLConnection restoreStoredEncoding]; return nil; } if ([mySQLConnection queryErrored]) { if ([mySQLConnection isConnected]) { - NSRunAlertPanel(@"Error", [NSString stringWithFormat:NSLocalizedString(@"An error occured while retrieving the PRIMARY KEY data:\n\n%@",@"message when the query that fetches the primary keys fails"), [mySQLConnection getLastErrorMessage]], @"OK", nil, nil); + NSRunAlertPanel(@"Error", [NSString stringWithFormat:NSLocalizedString(@"An error occured while retrieving the PRIMARY KEY data:\n\n%@",@"message when the query that fetches the primary keys fails"), [mySQLConnection lastErrorMessage]], @"OK", nil, nil); if (changeEncoding) [mySQLConnection restoreStoredEncoding]; } return nil; } - for( i = 0; i < [r numOfRows]; i++ ) { - resultRow = [r fetchRowAsArray]; + for (NSArray *resultRow in r) { + // check if the row is indeed a key (for MySQL servers before 5.0.3) if ([[NSArrayObjectAtIndex(resultRow ,3) description] isEqualToString:@"PRI"]) { [keyColumns addObject:[NSArrayObjectAtIndex(resultRow ,0) description]]; @@ -1382,4 +1376,4 @@ #endif -@end
\ No newline at end of file +@end diff --git a/Source/SPTableRelations.h b/Source/SPTableRelations.h index 5a8b9c40..99fa251f 100644 --- a/Source/SPTableRelations.h +++ b/Source/SPTableRelations.h @@ -23,9 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPTableView; +@class SPTableView, SPMySQLConnection; @interface SPTableRelations : NSObject { @@ -53,7 +51,7 @@ IBOutlet NSProgressIndicator *dataProgressIndicator; IBOutlet NSTextField *progressStatusTextField; - MCPConnection *connection; + SPMySQLConnection *connection; NSUserDefaults *prefs; NSMutableArray *relationData; @@ -61,7 +59,7 @@ } @property (readonly) NSMutableArray *relationData; -@property (readwrite, assign) MCPConnection *connection; +@property (readwrite, assign) SPMySQLConnection *connection; // IB action methods - (IBAction)addRelation:(id)sender; diff --git a/Source/SPTableRelations.m b/Source/SPTableRelations.m index eacdc8f6..44d05ee7 100644 --- a/Source/SPTableRelations.m +++ b/Source/SPTableRelations.m @@ -30,6 +30,7 @@ #import "SPTableView.h" #import "SPAlertSheets.h" #import "RegexKitLite.h" +#import "SPMySQL.h" static NSString *SPRemoveRelation = @"SPRemoveRelation"; @@ -177,12 +178,12 @@ static NSString *SPRelationOnDeleteKey = @"on_delete"; if ([connection queryErrored]) { // Retrieve the last connection error message. - NSString *errorText = [connection getLastErrorMessage]; + NSString *errorText = [connection lastErrorMessage]; // An error ID of 1005 indicates a foreign key error. These are thrown for many reasons, but the two // most common are 121 (name probably in use) and 150 (types don't exactly match). // Retrieve the InnoDB status and extract the most recent error for more helpful text. - if ([connection getLastErrorID] == 1005) { + if ([connection lastErrorID] == 1005) { NSString *statusText = [connection getFirstFieldFromQuery:@"SHOW INNODB STATUS"]; NSString *detailErrorString = [statusText stringByMatching:@"latest foreign key error\\s+-----*\\s+[0-9: ]*(.*?)\\s+-----" options:(RKLCaseless | RKLDotAll) inRange:NSMakeRange(0, [statusText length]) capture:1L error:NULL]; if (detailErrorString) { @@ -249,13 +250,10 @@ static NSString *SPRelationOnDeleteKey = @"on_delete"; // Get all InnoDB tables in the current database // TODO: MySQL 4 compatibility - MCPResult *result = [connection queryString:[NSString stringWithFormat:@"SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND engine = 'InnoDB' AND table_schema = %@", [[tableDocumentInstance database] tickQuotedString]]]; - - [result dataSeek:0]; - - for (NSUInteger i = 0; i < [result numOfRows]; i++) - { - [refTablePopUpButton addItemWithTitle:[[result fetchRowAsArray] objectAtIndex:0]]; + SPMySQLResult *result = [connection queryString:[NSString stringWithFormat:@"SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND engine = 'InnoDB' AND table_schema = %@", [[tableDocumentInstance database] tickQuotedString]]]; + [result setDefaultRowReturnType:SPMySQLResultRowAsArray]; + for (NSArray *eachRow in result) { + [refTablePopUpButton addItemWithTitle:[eachRow objectAtIndex:0]]; } // Reset other fields @@ -505,7 +503,7 @@ static NSString *SPRelationOnDeleteKey = @"on_delete"; SPBeginAlertSheet(NSLocalizedString(@"Unable to delete relation", @"error deleting relation message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], nil, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"The selected relation couldn't be deleted.\n\nMySQL said: %@", @"error deleting relation informative message"), [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"The selected relation couldn't be deleted.\n\nMySQL said: %@", @"error deleting relation informative message"), [connection lastErrorMessage]]); // Abort loop break; diff --git a/Source/SPTableStructure.h b/Source/SPTableStructure.h index 63ac74b8..a97f70b2 100644 --- a/Source/SPTableStructure.h +++ b/Source/SPTableStructure.h @@ -23,9 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPDatabaseDocument, SPTableFieldValidation, SPTableData, SPDatabaseData, SPTablesList, SPIndexesController, SPTableView; +@class SPDatabaseDocument, SPTableFieldValidation, SPTableData, SPDatabaseData, SPTablesList, SPIndexesController, SPTableView, SPMySQLConnection, SPMySQLResult; @interface SPTableStructure : NSObject #ifdef SP_REFACTOR @@ -70,9 +68,7 @@ #endif IBOutlet NSPopUpButtonCell *encodingPopupCell; - MCPConnection *mySQLConnection; - MCPResult *tableSourceResult; - MCPResult *indexResult; + SPMySQLConnection *mySQLConnection; SPTableFieldValidation *fieldValidation; @@ -123,15 +119,15 @@ - (IBAction)resetAutoIncrement:(id)sender; - (void)resetAutoincrementSheetDidEnd:(NSWindow *)theSheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (IBAction)showOptimizedFieldType:(id)sender; -- (IBAction)toggleColumnView:(id)sender; +- (IBAction)toggleColumnView:(NSMenuItem *)sender; - (BOOL)cancelRowEditing; // Index sheet methods - (IBAction)closeSheet:(id)sender; // Additional methods -- (void)setConnection:(MCPConnection *)theConnection; -- (NSArray *)fetchResultAsArray:(MCPResult *)theResult; +- (void)setConnection:(SPMySQLConnection *)theConnection; +- (NSArray *)convertIndexResultToArray:(SPMySQLResult *)theResult; - (BOOL)saveRowOnDeselect; - (BOOL)addRowToDB; - (void)addRowErrorSheetDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; diff --git a/Source/SPTableStructure.m b/Source/SPTableStructure.m index f9c56eb9..a0fb6ab2 100644 --- a/Source/SPTableStructure.m +++ b/Source/SPTableStructure.m @@ -36,6 +36,7 @@ #import "SPIndexesController.h" #import "RegexKitLite.h" #import "SPTableFieldValidation.h" +#import "SPMySQL.h" @interface SPTableStructure (PrivateAPI) @@ -232,6 +233,7 @@ { NSArray *theTableIndexes; NSMutableDictionary *theTableEnumLists = [NSMutableDictionary dictionary]; + SPMySQLResult *indexResult; // Check whether a save of the current row is required. if ( ![[self onMainThread] saveRowOnDeselect] ) return; @@ -249,7 +251,7 @@ [theTableFields addObject:[[col mutableCopy] autorelease]]; // Retrieve the indexes for the table - indexResult = [[mySQLConnection queryString:[NSString stringWithFormat:@"SHOW INDEX FROM %@", [aTable backtickQuotedString]]] retain]; + indexResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW INDEX FROM %@", [aTable backtickQuotedString]]]; // If an error occurred, reset the interface and abort if ([mySQLConnection queryErrored]) { @@ -264,17 +266,14 @@ SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while retrieving information.\nMySQL said: %@", @"message of panel when retrieving information failed"), - [mySQLConnection getLastErrorMessage]]); + [mySQLConnection lastErrorMessage]]); } - - if (indexResult) [indexResult release]; - + return; } // Process the indexes into a local array of dictionaries - theTableIndexes = [self fetchResultAsArray:indexResult]; - [indexResult release]; + theTableIndexes = [self convertIndexResultToArray:indexResult]; // Set the Key column for (NSDictionary* theIndex in theTableIndexes) @@ -357,7 +356,7 @@ // Normalize default if(![theField objectForKey:@"default"]) [theField setObject:@"" forKey:@"default"]; - else if([[theField objectForKey:@"default"] isKindOfClass:[NSNull class]]) + else if([[theField objectForKey:@"default"] isNSNull]) [theField setObject:[prefs stringForKey:SPNullValue] forKey:@"default"]; // Init Extra field @@ -533,7 +532,7 @@ */ - (IBAction)showOptimizedFieldType:(id)sender { - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT %@ FROM %@ PROCEDURE ANALYSE(0,8192)", + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SELECT %@ FROM %@ PROCEDURE ANALYSE(0,8192)", [[[tableFields objectAtIndex:[tableSourceView selectedRow]] objectForKey:@"name"] backtickQuotedString], [selectedTable backtickQuotedString]]]; @@ -546,7 +545,7 @@ defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while fetching the optimized field type.\n\nMySQL said:%@",@"an error occurred while fetching the optimized field type.\n\nMySQL said:%@"), [mySQLConnection getLastErrorMessage]]] + informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while fetching the optimized field type.\n\nMySQL said:%@",@"an error occurred while fetching the optimized field type.\n\nMySQL said:%@"), [mySQLConnection lastErrorMessage]]] beginSheetModalForWindow:[tableDocumentInstance parentWindow] modalDelegate:self didEndSelector:NULL @@ -556,13 +555,10 @@ return; } - NSArray *result = [theResult fetch2DResultAsType:MCPTypeDictionary]; + NSDictionary *analysisResult = [theResult getRowAsDictionary]; - NSString *type = nil; - - if([result count]) - type = [[result objectAtIndex:0] objectForKey:@"Optimal_fieldtype"]; - if(!type || [type isKindOfClass:[NSNull class]] || ![type length]) + NSString *type = [analysisResult objectForKey:@"Optimal_fieldtype"]; + if (!type || [type isNSNull] || ![type length]) type = NSLocalizedString(@"No optimized field type found.", @"no optimized field type found. message"); [[NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Optimized type for field '%@'", @"Optimized type for field %@"), [[tableFields objectAtIndex:[tableSourceView selectedRow]] objectForKey:@"name"]] @@ -580,31 +576,31 @@ /** * Control the visibility of the columns */ -- (IBAction)toggleColumnView:(id)sender +- (IBAction)toggleColumnView:(NSMenuItem *)sender { NSString *columnIdentifierName = nil; - switch([sender tag]) { + switch ([sender tag]) { case 7: - columnIdentifierName = @"Key"; + columnIdentifierName = @"Key"; break; case 10: - columnIdentifierName = @"encoding"; + columnIdentifierName = @"encoding"; break; case 11: - columnIdentifierName = @"collation"; + columnIdentifierName = @"collation"; break; case 12: - columnIdentifierName = @"comment"; + columnIdentifierName = @"comment"; break; default: return; } - for(NSTableColumn *col in [tableSourceView tableColumns]) { + for (NSTableColumn *col in [tableSourceView tableColumns]) { - if([[col identifier] isEqualToString:columnIdentifierName]) { + if ([[col identifier] isEqualToString:columnIdentifierName]) { [col setHidden:([sender state] == NSOffState) ? NO : YES]; [(NSMenuItem *)sender setState:![sender state]]; break; @@ -864,7 +860,7 @@ NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], nil, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to reset AUTO_INCREMENT of table '%@'.\n\nMySQL said: %@", @"error resetting auto_increment informative message"), - selTable, [mySQLConnection getLastErrorMessage]]); + selTable, [mySQLConnection lastErrorMessage]]); } // reload data @@ -884,9 +880,9 @@ /** * Converts the supplied result to an array containing a (mutable) dictionary for each row */ -- (NSArray *)fetchResultAsArray:(MCPResult *)theResult +- (NSArray *)convertIndexResultToArray:(SPMySQLResult *)theResult { - NSUInteger numOfRows = (NSUInteger)[theResult numOfRows]; + NSUInteger numOfRows = (NSUInteger)[theResult numberOfRows]; NSMutableArray *tempResult = [NSMutableArray arrayWithCapacity:numOfRows]; NSMutableDictionary *tempRow; NSArray *keys; @@ -896,9 +892,8 @@ // Ensure table information is returned as strings to avoid problems with some server versions [theResult setReturnDataAsStrings:YES]; - if (numOfRows) [theResult dataSeek:0]; for ( i = 0 ; i < (NSInteger)numOfRows ; i++ ) { - tempRow = [NSMutableDictionary dictionaryWithDictionary:[theResult fetchRowAsDictionary]]; + tempRow = [NSMutableDictionary dictionaryWithDictionary:[theResult getRowAsDictionary]]; // Replace NSNull instances with the NULL string from preferences keys = [tempRow allKeys]; @@ -1028,7 +1023,7 @@ } // Otherwise, use the provided default else { - [queryString appendFormat:@"\n DEFAULT '%@' ", [mySQLConnection prepareString:[theRow objectForKey:@"default"]]]; + [queryString appendFormat:@"\n DEFAULT %@ ", [mySQLConnection escapeAndQuoteString:[theRow objectForKey:@"default"]]]; } } @@ -1115,7 +1110,7 @@ } // Otherwise, use the provided default else { - [queryString appendFormat:@"\n DEFAULT '%@'", [mySQLConnection prepareString:[theRow objectForKey:@"default"]]]; + [queryString appendFormat:@"\n DEFAULT %@", [mySQLConnection escapeAndQuoteString:[theRow objectForKey:@"default"]]]; } } @@ -1126,7 +1121,7 @@ // Any column comments if ([(NSString *)[theRow objectForKey:@"comment"] length]) { - [queryString appendFormat:@"\n COMMENT '%@'", [mySQLConnection prepareString:[theRow objectForKey:@"comment"]]]; + [queryString appendFormat:@"\n COMMENT %@", [mySQLConnection escapeAndQuoteString:[theRow objectForKey:@"comment"]]]; } if (!isEditingNewRow) { @@ -1207,12 +1202,12 @@ } else { alertSheetOpened = YES; - if([mySQLConnection getLastErrorID] == 1146) { // If the current table doesn't exist anymore + if([mySQLConnection lastErrorID] == 1146) { // If the current table doesn't exist anymore SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to alter table '%@'.\n\nMySQL said: %@", @"error while trying to alter table message"), - selectedTable, [mySQLConnection getLastErrorMessage]]); + selectedTable, [mySQLConnection lastErrorMessage]]); isEditingRow = NO; isEditingNewRow = NO; @@ -1237,14 +1232,14 @@ NSLocalizedString(@"Edit row", @"Edit row button"), NSLocalizedString(@"Discard changes", @"discard changes button"), nil, [tableDocumentInstance parentWindow], self, @selector(addRowErrorSheetDidEnd:returnCode:contextInfo:), nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to add the field '%@' via\n\n%@\n\nMySQL said: %@", @"error adding field informative message"), - [theRow objectForKey:@"name"], queryString, [mySQLConnection getLastErrorMessage]]); + [theRow objectForKey:@"name"], queryString, [mySQLConnection lastErrorMessage]]); } else { SPBeginAlertSheet(NSLocalizedString(@"Error changing field", @"error changing field message"), NSLocalizedString(@"Edit row", @"Edit row button"), NSLocalizedString(@"Discard changes", @"discard changes button"), nil, [tableDocumentInstance parentWindow], self, @selector(addRowErrorSheetDidEnd:returnCode:contextInfo:), nil, [NSString stringWithFormat:NSLocalizedString(@"An error occurred when trying to change the field '%@' via\n\n%@\n\nMySQL said: %@", @"error changing field informative message"), - [theRow objectForKey:@"name"], queryString, [mySQLConnection getLastErrorMessage]]); + [theRow objectForKey:@"name"], queryString, [mySQLConnection lastErrorMessage]]); } return NO; @@ -1431,7 +1426,7 @@ /** * Sets the connection (received from SPDatabaseDocument) and makes things that have to be done only once */ -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { mySQLConnection = theConnection; @@ -1449,7 +1444,7 @@ { if ( ![defaultValues objectForKey:field] ) { return [prefs objectForKey:SPNullValue]; - } else if ( [[defaultValues objectForKey:field] isMemberOfClass:[NSNull class]] ) { + } else if ( [[defaultValues objectForKey:field] isNSNull] ) { return [prefs objectForKey:SPNullValue]; } else { return [defaultValues objectForKey:field]; @@ -1502,18 +1497,15 @@ NSString *nullValue = [prefs stringForKey:SPNullValue]; CFStringRef escapedNullValue = CFXMLCreateStringByEscapingEntities(NULL, ((CFStringRef)nullValue), NULL); - MCPResult *structureQueryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@", [selectedTable backtickQuotedString]]]; - MCPResult *indexesQueryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW INDEXES FROM %@", [selectedTable backtickQuotedString]]]; + SPMySQLResult *structureQueryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW COLUMNS FROM %@", [selectedTable backtickQuotedString]]]; + SPMySQLResult *indexesQueryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW INDEXES FROM %@", [selectedTable backtickQuotedString]]]; [structureQueryResult setReturnDataAsStrings:YES]; [indexesQueryResult setReturnDataAsStrings:YES]; - if ([structureQueryResult numOfRows]) [structureQueryResult dataSeek:0]; - if ([indexesQueryResult numOfRows]) [indexesQueryResult dataSeek:0]; - - [tempResult addObject:[structureQueryResult fetchFieldNames]]; + [tempResult addObject:[structureQueryResult fieldNames]]; - NSMutableArray *temp = [[indexesQueryResult fetchFieldNames] mutableCopy]; + NSMutableArray *temp = [[indexesQueryResult fieldNames] mutableCopy]; // Remove the 'table' column [temp removeObjectAtIndex:0]; @@ -1522,8 +1514,8 @@ [temp release]; - for (i = 0; i < [structureQueryResult numOfRows]; i++) { - NSMutableArray *row = [[structureQueryResult fetchRowAsArray] mutableCopy]; + for (i = 0; i < [structureQueryResult numberOfRows]; i++) { + NSMutableArray *row = [[structureQueryResult getRowAsArray] mutableCopy]; // For every NULL value replace it with the user's NULL value placeholder so we can actually print it for (j = 0; j < [row count]; j++) @@ -1538,8 +1530,8 @@ [row release]; } - for (i = 0; i < [indexesQueryResult numOfRows]; i++) { - NSMutableArray *eachIndex = [[indexesQueryResult fetchRowAsArray] mutableCopy]; + for (i = 0; i < [indexesQueryResult numberOfRows]; i++) { + NSMutableArray *eachIndex = [[indexesQueryResult getRowAsArray] mutableCopy]; // Remove the 'table' column values [eachIndex removeObjectAtIndex:0]; @@ -1658,10 +1650,10 @@ [mySQLConnection queryString:[NSString stringWithFormat:@"ALTER TABLE %@ DROP FOREIGN KEY %@", [selectedTable backtickQuotedString], [relationName backtickQuotedString]]]; // Check for errors, but only if the query wasn't cancelled - if ([mySQLConnection queryErrored] && ![mySQLConnection queryCancelled]) { + if ([mySQLConnection queryErrored] && ![mySQLConnection lastQueryWasCancelled]) { NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary]; [errorDictionary setObject:NSLocalizedString(@"Unable to delete relation", @"error deleting relation message") forKey:@"title"]; - [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to delete the relation '%@'.\n\nMySQL said: %@", @"error deleting relation informative message"), relationName, [mySQLConnection getLastErrorMessage]] forKey:@"message"]; + [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to delete the relation '%@'.\n\nMySQL said: %@", @"error deleting relation informative message"), relationName, [mySQLConnection lastErrorMessage]] forKey:@"message"]; [[self onMainThread] showErrorSheetWith:errorDictionary]; } } @@ -1671,12 +1663,12 @@ [selectedTable backtickQuotedString], [[[tableFields objectAtIndex:[tableSourceView selectedRow]] objectForKey:@"name"] backtickQuotedString]]]; // Check for errors, but only if the query wasn't cancelled - if ([mySQLConnection queryErrored] && ![mySQLConnection queryCancelled]) { + if ([mySQLConnection queryErrored] && ![mySQLConnection lastQueryWasCancelled]) { NSMutableDictionary *errorDictionary = [NSMutableDictionary dictionary]; [errorDictionary setObject:NSLocalizedString(@"Error", @"error") forKey:@"title"]; [errorDictionary setObject:[NSString stringWithFormat:NSLocalizedString(@"Couldn't delete field %@.\nMySQL said: %@", @"message of panel when field cannot be deleted"), [[tableFields objectAtIndex:[tableSourceView selectedRow]] objectForKey:@"name"], - [mySQLConnection getLastErrorMessage]] forKey:@"message"]; + [mySQLConnection lastErrorMessage]] forKey:@"message"]; [[self onMainThread] showErrorSheetWith:errorDictionary]; } else { diff --git a/Source/SPTableStructureDelegate.m b/Source/SPTableStructureDelegate.m index 997bfea2..6493e850 100644 --- a/Source/SPTableStructureDelegate.m +++ b/Source/SPTableStructureDelegate.m @@ -30,6 +30,7 @@ #import "SPTableData.h" #import "SPTableView.h" #import "SPTableFieldValidation.h" +#import "SPMySQL.h" @implementation SPTableStructure (SPTableStructureDelegate) @@ -328,13 +329,13 @@ [queryString appendString:@" DEFAULT CURRENT_TIMESTAMP"]; } else if ([(NSString *)[originalRow objectForKey:@"default"] length]) { - [queryString appendFormat:@" DEFAULT '%@'", [mySQLConnection prepareString:[originalRow objectForKey:@"default"]]]; + [queryString appendFormat:@" DEFAULT %@", [mySQLConnection escapeAndQuoteString:[originalRow objectForKey:@"default"]]]; } } // Any column comments if ([(NSString *)[originalRow objectForKey:@"comment"] length]) { - [queryString appendFormat:@" COMMENT '%@'", [mySQLConnection prepareString:[originalRow objectForKey:@"comment"]]]; + [queryString appendFormat:@" COMMENT %@", [mySQLConnection escapeAndQuoteString:[originalRow objectForKey:@"comment"]]]; } // Unparsed details - column formats, storage, reference definitions @@ -355,7 +356,7 @@ if ([mySQLConnection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Error moving field", @"error moving field message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to move the field.\n\nMySQL said: %@", @"error moving field informative message"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to move the field.\n\nMySQL said: %@", @"error moving field informative message"), [mySQLConnection lastErrorMessage]]); } else { [tableDataInstance resetAllData]; diff --git a/Source/SPTableTextFieldCell.m b/Source/SPTableTextFieldCell.m index 799cb4c0..ea70b01e 100644 --- a/Source/SPTableTextFieldCell.m +++ b/Source/SPTableTextFieldCell.m @@ -61,7 +61,7 @@ NSSize cellSize = [super cellSize]; cellSize.width = [[self attributedStringValue] size].width + (([self image] != nil) ? [[self image] size].width : 0) + 25; - cellSize.height = [[self attributedStringValue] size].height + 14.0; + cellSize.height = [[self attributedStringValue] size].height + 14.0f; return cellSize; } diff --git a/Source/SPTableTriggers.h b/Source/SPTableTriggers.h index 5cc8d59d..3ffac7fe 100644 --- a/Source/SPTableTriggers.h +++ b/Source/SPTableTriggers.h @@ -23,9 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPTableView; +@class SPTableView, SPMySQLConnection; @interface SPTableTriggers : NSObject { @@ -50,7 +48,7 @@ IBOutlet NSBox *addTriggerTableBox; IBOutlet NSButton *confirmAddTriggerButton; - MCPConnection *connection; + SPMySQLConnection *connection; NSMutableArray *triggerData; @@ -64,7 +62,7 @@ NSString *editTriggerActionTime; } -@property (readwrite, assign) MCPConnection *connection; +@property (readwrite, assign) SPMySQLConnection *connection; - (void)loadTriggers; - (void)resetInterface; diff --git a/Source/SPTableTriggers.m b/Source/SPTableTriggers.m index 59fbb673..393b0568 100644 --- a/Source/SPTableTriggers.m +++ b/Source/SPTableTriggers.m @@ -30,6 +30,7 @@ #import "SPTableView.h" #import "SPAlertSheets.h" #import "SPServerSupport.h" +#import "SPMySQL.h" // Constants static const NSString *SPTriggerName = @"TriggerName"; @@ -189,7 +190,7 @@ static const NSString *SPTriggerSQLMode = @"TriggerSQLMode"; NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], nil, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"The selected trigger couldn't be deleted.\n\nMySQL said: %@", @"error deleting trigger informative message"), - [connection getLastErrorMessage]]); + [connection lastErrorMessage]]); return; } @@ -229,7 +230,7 @@ static const NSString *SPTriggerSQLMode = @"TriggerSQLMode"; NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], nil, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"The specified trigger was unable to be created.\n\nMySQL said: %@", @"error creating trigger informative message"), - [connection getLastErrorMessage]]); + [connection lastErrorMessage]]); // In case of error, re-create the original trigger statement if (isEdit) { @@ -346,12 +347,12 @@ static const NSString *SPTriggerSQLMode = @"TriggerSQLMode"; /** * Double-click action on table cells - for the time being, return NO to disable editing. */ -- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSUInteger)rowIndex +- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex { if ([tableDocumentInstance isWorking]) return NO; // Start Edit panel - if (([triggerData count] > rowIndex) && [triggerData objectAtIndex:rowIndex]) { + if (((NSInteger)[triggerData count] > rowIndex) && [triggerData objectAtIndex:rowIndex]) { [self _editTriggerAtIndex:rowIndex]; } @@ -427,7 +428,7 @@ static const NSString *SPTriggerSQLMode = @"TriggerSQLMode"; SPBeginAlertSheet(NSLocalizedString(@"Unable to delete trigger", @"error deleting trigger message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], nil, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"The selected trigger couldn't be deleted.\n\nMySQL said: %@", @"error deleting trigger informative message"), [connection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"The selected trigger couldn't be deleted.\n\nMySQL said: %@", @"error deleting trigger informative message"), [connection lastErrorMessage]]); // Abort loop break; diff --git a/Source/SPTablesList.h b/Source/SPTablesList.h index e5e76548..6da4f6cc 100644 --- a/Source/SPTablesList.h +++ b/Source/SPTablesList.h @@ -23,9 +23,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPHistoryController, SPTableView; +@class SPHistoryController, SPTableView, SPMySQLConnection; @class SPDatabaseDocument, SPDatabaseData, SPTableStructure, SPTableContent; #ifdef SP_REFACTOR @@ -103,7 +101,7 @@ IBOutlet NSMenuItem *separatorTableMenuItem3; #endif - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; #ifndef SP_REFACTOR /* ivars */ // Table list context menu items @@ -153,7 +151,7 @@ - (IBAction)togglePaneCollapse:(id)sender; #endif // Additional methods -- (void)setConnection:(MCPConnection *)theConnection; +- (void)setConnection:(SPMySQLConnection *)theConnection; - (void)setSelectionState:(NSDictionary *)selectionDetails; #ifndef SP_REFACTOR /* method decls */ - (void)selectTableAtIndex:(NSNumber *)row; diff --git a/Source/SPTablesList.m b/Source/SPTablesList.m index e68bf4f6..09cd8cde 100644 --- a/Source/SPTablesList.m +++ b/Source/SPTablesList.m @@ -27,6 +27,7 @@ #import "SPDatabaseDocument.h" #import "SPTableStructure.h" #import "SPDatabaseViewController.h" +#import "SPMySQL.h" #ifndef SP_REFACTOR /* headers */ #import "SPTableContent.h" @@ -103,9 +104,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; */ - (IBAction)updateTables:(id)sender { - MCPResult *theResult; - NSArray *resultRow; - NSUInteger i; + SPMySQLResult *theResult; NSString *previousSelectedTable = nil; NSString *previousFilterString = nil; BOOL previousTableListIsSelectable = tableListIsSelectable; @@ -150,25 +149,24 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; // Select the table list for the current database. On MySQL versions after 5 this will include // views; on MySQL versions >= 5.0.02 select the "full" list to also select the table type column. theResult = [mySQLConnection queryString:@"SHOW /*!50002 FULL*/ TABLES"]; - if ([theResult numOfRows]) [theResult dataSeek:0]; - if ([theResult numOfFields] == 1) { - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { - [tables addObject:[[theResult fetchRowAsArray] objectAtIndex:0]]; + [theResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; + if ([theResult numberOfFields] == 1) { + for (NSArray *eachRow in theResult) { + [tables addObject:[eachRow objectAtIndex:0]]; [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeTable]]; } } else { - for ( i = 0 ; i < [theResult numOfRows] ; i++ ) { - resultRow = [theResult fetchRowAsArray]; + for (NSArray *eachRow in theResult) { + // Due to encoding problems it can be the case that [resultRow objectAtIndex:0] // return NSNull, thus catch that case for safety reasons - NSString *row = [resultRow objectAtIndex:0]; - NSString *tableName; - if([row isKindOfClass:[NSString class]]) - tableName = [NSString stringWithUTF8String:[row cStringUsingEncoding:[mySQLConnection stringEncoding]]]; - else + id tableName = [eachRow objectAtIndex:0]; + if ([tableName isNSNull]) { tableName = @"..."; + } [tables addObject:tableName]; - if ([[resultRow objectAtIndex:1] isEqualToString:@"VIEW"]) { + + if ([[eachRow objectAtIndex:1] isEqualToString:@"VIEW"]) { [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeView]]; tableListContainsViews = YES; } else { @@ -187,31 +185,31 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; * backward compatibility with pre 4 I believe. I left the other methods below, in case. */ if ([[tableDocumentInstance serverSupport] supportsInformationSchema]) { - NSString *pQuery = [NSString stringWithFormat:@"SELECT * FROM information_schema.routines WHERE routine_schema = '%@' ORDER BY routine_name",[tableDocumentInstance database]]; + NSString *pQuery = [NSString stringWithFormat:@"SELECT * FROM information_schema.routines WHERE routine_schema = %@ ORDER BY routine_name", [[tableDocumentInstance database] tickQuotedString]]; theResult = [mySQLConnection queryString:pQuery]; + [theResult setDefaultRowReturnType:SPMySQLResultRowAsArray]; // Check for mysql errors - if information_schema is not accessible for some reasons // omit adding procedures and functions - if(![mySQLConnection queryErrored] && theResult != nil && [theResult numOfRows] ) { - // add the header row + if(![mySQLConnection queryErrored] && theResult != nil && [theResult numberOfRows] ) { + + // Add the header row [tables addObject:NSLocalizedString(@"PROCS & FUNCS",@"header for procs & funcs list")]; [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeNone]]; - [theResult dataSeek:0]; - if( [theResult numOfFields] == 1 ) { - for( i = 0; i < [theResult numOfRows]; i++ ) { - [tables addObject:NSArrayObjectAtIndex([theResult fetchRowAsArray],3)]; - if( [NSArrayObjectAtIndex([theResult fetchRowAsArray], 4) isEqualToString:@"PROCEDURE"]) { + if( [theResult numberOfFields] == 1 ) { + for (NSArray *eachRow in theResult) { + [tables addObject:NSArrayObjectAtIndex(eachRow, 3)]; + if ([NSArrayObjectAtIndex(eachRow, 4) isEqualToString:@"PROCEDURE"]) { [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeProc]]; } else { [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeFunc]]; } } } else { - for( i = 0; i < [theResult numOfRows]; i++ ) { - resultRow = [theResult fetchRowAsArray]; - [tables addObject:NSArrayObjectAtIndex(resultRow, 3)]; - if( [NSArrayObjectAtIndex(resultRow, 4) isEqualToString:@"PROCEDURE"] ) { + for (NSArray *eachRow in theResult) { + [tables addObject:NSArrayObjectAtIndex(eachRow, 3)]; + if ([NSArrayObjectAtIndex(eachRow, 4) isEqualToString:@"PROCEDURE"]) { [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeProc]]; } else { [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeFunc]]; @@ -728,7 +726,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; /** * Sets the connection (received from SPDatabaseDocument) and makes things that have to be done only once */ -- (void)setConnection:(MCPConnection *)theConnection +- (void)setConnection:(SPMySQLConnection *)theConnection { mySQLConnection = theConnection; [self updateTables:self]; @@ -1744,7 +1742,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; alternateButton:nil otherButton:nil informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to import a table via: \n%@\n\n\nMySQL said: %@", @"error importing table informative message"), - query, [mySQLConnection getLastErrorMessage]]]; + query, [mySQLConnection lastErrorMessage]]]; [alert setAlertStyle:NSCriticalAlertStyle]; [alert beginSheetModalForWindow:[tableDocumentInstance parentWindow] modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:@"truncateTableError"]; @@ -2159,7 +2157,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; [alert addButtonWithTitle:NSLocalizedString(@"Stop", @"stop button")]; } [alert setMessageText:NSLocalizedString(@"Error", @"error")]; - [alert setInformativeText:[NSString stringWithFormat:NSLocalizedString(@"Couldn't delete '%@'.\n\nMySQL said: %@", @"message of panel when an item cannot be deleted"), [filteredTables objectAtIndex:currentIndex], [mySQLConnection getLastErrorMessage]]]; + [alert setInformativeText:[NSString stringWithFormat:NSLocalizedString(@"Couldn't delete '%@'.\n\nMySQL said: %@", @"message of panel when an item cannot be deleted"), [filteredTables objectAtIndex:currentIndex], [mySQLConnection lastErrorMessage]]]; [alert setAlertStyle:NSWarningAlertStyle]; if ([indexes indexLessThanIndex:currentIndex] == NSNotFound) { [alert beginSheetModalForWindow:[tableDocumentInstance parentWindow] modalDelegate:self didEndSelector:nil contextInfo:nil]; @@ -2218,7 +2216,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; alternateButton:nil otherButton:nil informativeTextWithFormat:[NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to truncate the table '%@'.\n\nMySQL said: %@", @"error truncating table informative message"), - [filteredTables objectAtIndex:currentIndex], [mySQLConnection getLastErrorMessage]]]; + [filteredTables objectAtIndex:currentIndex], [mySQLConnection lastErrorMessage]]]; [alert setAlertStyle:NSCriticalAlertStyle]; // NSArray *buttons = [alert buttons]; @@ -2339,7 +2337,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; SPBeginAlertSheet(NSLocalizedString(@"Error adding new table", @"error adding new table message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, @selector(sheetDidEnd:returnCode:contextInfo:), SPAddRow, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to add the new table '%@'.\n\nMySQL said: %@", @"error adding new table informative message"), tableName, [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred while trying to add the new table '%@'.\n\nMySQL said: %@", @"error adding new table informative message"), tableName, [mySQLConnection lastErrorMessage]]); if (changeEncoding) [mySQLConnection restoreStoredEncoding]; [[tablesListView onMainThread] reloadData]; @@ -2393,16 +2391,17 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; } // Get table/view structure - MCPResult *queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE %@ %@", + SPMySQLResult *queryResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE %@ %@", [tableType uppercaseString], [[filteredTables objectAtIndex:[tablesListView selectedRow]] backtickQuotedString] ]]; [queryResult setReturnDataAsStrings:YES]; - if ( ![queryResult numOfRows] ) { + if ( ![queryResult numberOfRows] ) { + //error while getting table structure SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't get create syntax.\nMySQL said: %@", @"message of panel when table information cannot be retrieved"), [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't get create syntax.\nMySQL said: %@", @"message of panel when table information cannot be retrieved"), [mySQLConnection lastErrorMessage]]); } else { //insert new table name in create syntax and create new table @@ -2410,14 +2409,14 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; NSString *scanString; if(tblType == SPTableTypeView){ - scanner = [[NSScanner alloc] initWithString:[[queryResult fetchRowAsDictionary] objectForKey:@"Create View"]]; + scanner = [[NSScanner alloc] initWithString:[[queryResult getRowAsDictionary] objectForKey:@"Create View"]]; [scanner scanUpToString:@"AS" intoString:nil]; [scanner scanUpToString:@"" intoString:&scanString]; [scanner release]; [mySQLConnection queryString:[NSString stringWithFormat:@"CREATE VIEW %@ %@", [[copyTableNameField stringValue] backtickQuotedString], scanString]]; } else if(tblType == SPTableTypeTable){ - scanner = [[NSScanner alloc] initWithString:[[queryResult fetchRowAsDictionary] objectForKey:@"Create Table"]]; + scanner = [[NSScanner alloc] initWithString:[[queryResult getRowAsDictionary] objectForKey:@"Create Table"]]; [scanner scanUpToString:@"(" intoString:nil]; [scanner scanUpToString:@"" intoString:&scanString]; [scanner release]; @@ -2436,7 +2435,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; else if(tblType == SPTableTypeFunc || tblType == SPTableTypeProc) { // get the create syntax - MCPResult *theResult; + SPMySQLResult *theResult; if(selectedTableType == SPTableTypeProc) theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE PROCEDURE %@", [selectedTableName backtickQuotedString]]]; else if([self tableType] == SPTableTypeFunc) @@ -2448,20 +2447,20 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; if ([mySQLConnection queryErrored]) { if ([mySQLConnection isConnected]) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occured while retrieving the create syntax for '%@'.\nMySQL said: %@", @"message of panel when create syntax cannot be retrieved"), selectedTableName, [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occured while retrieving the create syntax for '%@'.\nMySQL said: %@", @"message of panel when create syntax cannot be retrieved"), selectedTableName, [mySQLConnection lastErrorMessage]]); } return; } [theResult setReturnDataAsStrings:YES]; - NSString *tableSyntax = [[theResult fetchRowAsArray] objectAtIndex:2]; + NSString *tableSyntax = [[theResult getRowAsArray] objectAtIndex:2]; // replace the old name by the new one and drop the old one [mySQLConnection queryString:[tableSyntax stringByReplacingOccurrencesOfRegex:[NSString stringWithFormat:@"(?<=%@ )(`[^`]+?`)", [tableType uppercaseString]] withString:[[copyTableNameField stringValue] backtickQuotedString]]]; if ([mySQLConnection queryErrored]) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't duplicate '%@'.\nMySQL said: %@", @"message of panel when an item cannot be renamed"), [copyTableNameField stringValue], [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't duplicate '%@'.\nMySQL said: %@", @"message of panel when an item cannot be renamed"), [copyTableNameField stringValue], [mySQLConnection lastErrorMessage]]); } } @@ -2469,7 +2468,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; if ([mySQLConnection queryErrored]) { //error while creating new table SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [tableDocumentInstance parentWindow], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"Couldn't create '%@'.\nMySQL said: %@", @"message of panel when table cannot be created"), [copyTableNameField stringValue], [mySQLConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"Couldn't create '%@'.\nMySQL said: %@", @"message of panel when table cannot be created"), [copyTableNameField stringValue], [mySQLConnection lastErrorMessage]]); } else { if (copyTableContent) { @@ -2578,7 +2577,7 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; [mySQLConnection queryString:[NSString stringWithFormat:@"RENAME TABLE %@ TO %@", [oldTableName backtickQuotedString], [newTableName backtickQuotedString]]]; // check for errors if ([mySQLConnection queryErrored]) { - [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming '%@'.\n\nMySQL said: %@", @"rename table error informative message"), oldTableName, [mySQLConnection getLastErrorMessage]]; + [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming '%@'.\n\nMySQL said: %@", @"rename table error informative message"), oldTableName, [mySQLConnection lastErrorMessage]]; } return; @@ -2597,12 +2596,12 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; default: break; } - MCPResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE %@ %@", stringTableType, [oldTableName backtickQuotedString] ] ]; + SPMySQLResult *theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"SHOW CREATE %@ %@", stringTableType, [oldTableName backtickQuotedString] ] ]; if ([mySQLConnection queryErrored]) { - [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming. I couldn't retrieve the syntax for '%@'.\n\nMySQL said: %@", @"rename precedure/function error - can't retrieve syntax"), oldTableName, [mySQLConnection getLastErrorMessage]]; + [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming. I couldn't retrieve the syntax for '%@'.\n\nMySQL said: %@", @"rename precedure/function error - can't retrieve syntax"), oldTableName, [mySQLConnection lastErrorMessage]]; } [theResult setReturnDataAsStrings:YES]; - NSString *oldCreateSyntax = [[theResult fetchRowAsArray] objectAtIndex:2]; + NSString *oldCreateSyntax = [[theResult getRowAsArray] objectAtIndex:2]; // replace the old name with the new name NSRange rangeOfProcedureName = [oldCreateSyntax rangeOfString: [NSString stringWithFormat:@"%@ %@", stringTableType, [oldTableName backtickQuotedString] ] ]; @@ -2613,12 +2612,12 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; withString: [NSString stringWithFormat:@"%@ %@", stringTableType, [newTableName backtickQuotedString] ] ]; [mySQLConnection queryString: newCreateSyntax]; if ([mySQLConnection queryErrored]) { - [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming. I couldn't recreate '%@'.\n\nMySQL said: %@", @"rename precedure/function error - can't recreate procedure"), oldTableName, [mySQLConnection getLastErrorMessage]]; + [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming. I couldn't recreate '%@'.\n\nMySQL said: %@", @"rename precedure/function error - can't recreate procedure"), oldTableName, [mySQLConnection lastErrorMessage]]; } [mySQLConnection queryString: [NSString stringWithFormat: @"DROP %@ %@", stringTableType, [oldTableName backtickQuotedString]]]; if ([mySQLConnection queryErrored]) { - [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming. I couldn't delete '%@'.\n\nMySQL said: %@", @"rename precedure/function error - can't delete old procedure"), oldTableName, [mySQLConnection getLastErrorMessage]]; + [NSException raise:@"MySQL Error" format:NSLocalizedString(@"An error occured while renaming. I couldn't delete '%@'.\n\nMySQL said: %@", @"rename precedure/function error - can't delete old procedure"), oldTableName, [mySQLConnection lastErrorMessage]]; } return; } diff --git a/Source/SPTextView.h b/Source/SPTextView.h index dc0557f2..ac4391d8 100644 --- a/Source/SPTextView.h +++ b/Source/SPTextView.h @@ -23,14 +23,13 @@ // More info at <http://code.google.com/p/sequel-pro/> #import <Cocoa/Cocoa.h> -#import <MCPKit/MCPKit.h> #import "NoodleLineNumberView.h" #import "SPCopyTable.h" #define SP_TEXT_SIZE_TRIGGER_FOR_PARTLY_PARSING 10000 -@class SPNarrowDownCompletion, SPDatabaseDocument, SPTablesList, SPCustomQuery; +@class SPNarrowDownCompletion, SPDatabaseDocument, SPTablesList, SPCustomQuery, SPMySQLConnection; @interface SPTextView : NSTextView #ifdef SP_REFACTOR @@ -65,7 +64,7 @@ NSUserDefaults *prefs; #endif - MCPConnection *mySQLConnection; + SPMySQLConnection *mySQLConnection; NSInteger mySQLmajorVersion; NSInteger snippetControlArray[20][3]; @@ -148,7 +147,7 @@ #endif - (void) doSyntaxHighlighting; - (NSBezierPath*)roundedBezierPathAroundRange:(NSRange)aRange; -- (void) setConnection:(MCPConnection *)theConnection withVersion:(NSInteger)majorVersion; +- (void) setConnection:(SPMySQLConnection *)theConnection withVersion:(NSInteger)majorVersion; - (void) doCompletionByUsingSpellChecker:(BOOL)isDictMode fuzzyMode:(BOOL)fuzzySearch autoCompleteMode:(BOOL)autoCompleteMode; - (void) doAutoCompletion; - (void) refreshCompletion; diff --git a/Source/SPTextView.m b/Source/SPTextView.m index 500e4892..b3db1b30 100644 --- a/Source/SPTextView.m +++ b/Source/SPTextView.m @@ -36,6 +36,7 @@ #import "SPBundleHTMLOutputController.h" #import "SPDatabaseViewController.h" #import "SPAppController.h" +#import "SPMySQL.h" #pragma mark - #pragma mark lex init @@ -227,7 +228,7 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse) #endif } -- (void) setConnection:(MCPConnection *)theConnection withVersion:(NSInteger)majorVersion +- (void) setConnection:(SPMySQLConnection *)theConnection withVersion:(NSInteger)majorVersion { mySQLConnection = theConnection; mySQLmajorVersion = majorVersion; diff --git a/Source/SPUserMO.h b/Source/SPUserMO.h index b77dfd04..90706ef5 100644 --- a/Source/SPUserMO.h +++ b/Source/SPUserMO.h @@ -38,4 +38,4 @@ - (void)addChildrenObject:(NSManagedObject *)value; - (void)removeChildrenObject:(NSManagedObject *)value; -@end
\ No newline at end of file +@end diff --git a/Source/SPUserManager.h b/Source/SPUserManager.h index 3df63a6f..11bb736e 100644 --- a/Source/SPUserManager.h +++ b/Source/SPUserManager.h @@ -22,9 +22,7 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - -@class SPServerSupport, BWAnchoredButtonBar; +@class SPServerSupport, SPMySQLConnection, BWAnchoredButtonBar; @interface SPUserManager : NSWindowController { @@ -35,7 +33,7 @@ BOOL isInitializing; - MCPConnection *mySqlConnection; + SPMySQLConnection *mySqlConnection; SPServerSupport *serverSupport; IBOutlet NSOutlineView *outlineView; @@ -75,7 +73,7 @@ NSMutableString *errorsString; } -@property (nonatomic, retain) MCPConnection *mySqlConnection; +@property (nonatomic, retain) SPMySQLConnection *mySqlConnection; @property (nonatomic, retain) SPServerSupport *serverSupport; @property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; diff --git a/Source/SPUserManager.m b/Source/SPUserManager.m index 83f0a12f..3b3add1e 100644 --- a/Source/SPUserManager.m +++ b/Source/SPUserManager.m @@ -29,6 +29,7 @@ #import "SPConnectionController.h" #import "SPServerSupport.h" #import "SPAlertSheets.h" +#import "SPMySQL.h" #import <BWToolkitFramework/BWAnchoredButtonBar.h> static const NSString *SPTableViewNameColumnID = @"NameColumn"; @@ -140,23 +141,11 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; NSMutableString *privKey; NSArray *privRow; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSMutableArray *resultAsArray = [NSMutableArray array]; NSMutableArray *usersResultArray = [NSMutableArray array]; // Select users from the mysql.user table - MCPResult *result = [self.mySqlConnection queryString:@"SELECT * FROM mysql.user ORDER BY user"]; - - NSUInteger rows = (NSUInteger)[result numOfRows]; - - if (rows > 0) [result dataSeek:0]; - - for (NSUInteger i = 0; i < rows; i++) - { - [resultAsArray addObject:[result fetchRowAsDictionary]]; - } - - [usersResultArray addObjectsFromArray:resultAsArray]; + SPMySQLResult *result = [self.mySqlConnection queryString:@"SELECT * FROM mysql.user ORDER BY user"]; + [usersResultArray addObjectsFromArray:[result getAllRows]]; [self _initializeTree:usersResultArray]; @@ -173,8 +162,8 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; [result setReturnDataAsStrings:YES]; } - if (result && [result numOfRows]) { - while ((privRow = [result fetchRowAsArray])) + if (result && [result numberOfRows]) { + while ((privRow = [result getRowAsArray])) { privKey = [NSMutableString stringWithString:[[privRow objectAtIndex:0] lowercaseString]]; @@ -193,7 +182,7 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; [result setReturnDataAsStrings:YES]; - while ((privRow = [result fetchRowAsArray])) + while ((privRow = [result getRowAsArray])) { privKey = [NSMutableString stringWithString:[privRow objectAtIndex:0]]; @@ -308,15 +297,7 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; { // Initialize Databases [schemas removeAllObjects]; - - MCPResult *results = [self.mySqlConnection listDBs]; - - if ([results numOfRows]) [results dataSeek:0]; - - for (NSUInteger i = 0; i < [results numOfRows]; i++) - { - [schemas addObject:[results fetchRowAsDictionary]]; - } + [schemas addObjectsFromArray:[self.mySqlConnection databases]]; [schemaController rearrangeObjects]; @@ -377,16 +358,10 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; NSString *queryString = [NSString stringWithFormat:@"SELECT * from mysql.db d WHERE d.user = %@ and d.host = %@", [[[child parent] valueForKey:@"user"] tickQuotedString], [[child valueForKey:@"host"] tickQuotedString]]; - MCPResult *queryResults = [self.mySqlConnection queryString:queryString]; + SPMySQLResult *queryResults = [self.mySqlConnection queryString:queryString]; - if ([queryResults numOfRows] > 0) { - // Go to the beginning - [queryResults dataSeek:0]; - } - - for (NSUInteger i = 0; i < [queryResults numOfRows]; i++) + for (NSDictionary *rowDict in queryResults) { - NSDictionary *rowDict = [queryResults fetchRowAsDictionary]; NSManagedObject *dbPriv = [NSEntityDescription insertNewObjectForEntityForName:@"Privileges" inManagedObjectContext:[self managedObjectContext]]; for (NSString *key in rowDict) @@ -1212,12 +1187,7 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; [[schemaPriv valueForKeyPath:@"user.host"] tickQuotedString], [dbName tickQuotedString]]; - MCPResult *result = [self.mySqlConnection queryString:statement]; - - NSUInteger rows = (NSUInteger)[result numOfRows]; - BOOL userExists = YES; - - if (rows == 0) userExists = NO; + NSArray *matchingUsers = [self.mySqlConnection getAllRowsFromQuery:statement]; for (NSString *key in self.privsSupportedByServer) { @@ -1228,7 +1198,7 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; [grantPrivileges addObject:[privilege replaceUnderscoreWithSpace]]; } else { - if (userExists || [grantPrivileges count] > 0) { + if ([matchingUsers count] || [grantPrivileges count] > 0) { [revokePrivileges addObject:[privilege replaceUnderscoreWithSpace]]; } } @@ -1433,11 +1403,11 @@ static const NSString *SPTableViewNameColumnID = @"NameColumn"; { if ([self.mySqlConnection queryErrored]) { if (isSaving) { - [errorsString appendFormat:@"%@\n", [self.mySqlConnection getLastErrorMessage]]; + [errorsString appendFormat:@"%@\n", [self.mySqlConnection lastErrorMessage]]; } else { SPBeginAlertSheet(NSLocalizedString(@"An error occurred", @"mysql error occurred message"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:NSLocalizedString(@"An error occurred whilst trying to perform the operation.\n\nMySQL said: %@", @"mysql error occurred informative message"), [self.mySqlConnection getLastErrorMessage]]); + [NSString stringWithFormat:NSLocalizedString(@"An error occurred whilst trying to perform the operation.\n\nMySQL said: %@", @"mysql error occurred informative message"), [self.mySqlConnection lastErrorMessage]]); } return NO; diff --git a/Source/SPWindowAdditions.m b/Source/SPWindowAdditions.m index 676019ee..ab0b35bc 100644 --- a/Source/SPWindowAdditions.m +++ b/Source/SPWindowAdditions.m @@ -35,7 +35,7 @@ - (CGFloat)toolbarHeight { NSRect windowFrame; - CGFloat toolbarHeight = 0.0; + CGFloat toolbarHeight = 0.0f; if ([self toolbar] && [[self toolbar] isVisible]) { windowFrame = [NSWindow contentRectForFrameRect:[self frame] styleMask:[self styleMask]]; @@ -83,10 +83,12 @@ if( frontDoc && [frontDoc isKindOfClass:[SPDatabaseDocument class]] && [frontDoc valueForKeyPath:@"spHistoryControllerInstance"] && ![frontDoc isWorking]) + { if([anEvent deltaX] == -1.0f) [[frontDoc valueForKeyPath:@"spHistoryControllerInstance"] valueForKey:@"goForwardInHistory"]; else if([anEvent deltaX] == 1.0f) [[frontDoc valueForKeyPath:@"spHistoryControllerInstance"] valueForKey:@"goBackInHistory"]; + } } diff --git a/Source/SPWindowController.m b/Source/SPWindowController.m index 2ef62941..ed538312 100644 --- a/Source/SPWindowController.m +++ b/Source/SPWindowController.m @@ -586,8 +586,8 @@ enum { // Draw the background flipped, which is actually the right way up NSAffineTransform *transform = [NSAffineTransform transform]; - [transform translateXBy:0.0 yBy:[[[self window] contentView] frame].size.height]; - [transform scaleXBy:1.0 yBy:-1.0]; + [transform translateXBy:0.0f yBy:[[[self window] contentView] frame].size.height]; + [transform scaleXBy:1.0f yBy:-1.0f]; [transform concat]; [(id <PSMTabStyle>)[[aTabView delegate] style] drawBackgroundInRect:tabFrame]; [viewImage unlockFocus]; @@ -813,4 +813,4 @@ enum { [theDocument addObserver:self forKeyPath:@"isProcessing" options:0 context:nil]; } -@end
\ No newline at end of file +@end diff --git a/Source/SPXMLExporter.m b/Source/SPXMLExporter.m index dfd55bf0..8ff99e0d 100644 --- a/Source/SPXMLExporter.m +++ b/Source/SPXMLExporter.m @@ -23,12 +23,11 @@ // // More info at <http://code.google.com/p/sequel-pro/> -#import <MCPKit/MCPKit.h> - #import "SPXMLExporter.h" #import "SPExportFile.h" #import "SPFileHandle.h" #import "SPExportUtilities.h" +#import "SPMySQL.h" @implementation SPXMLExporter @@ -73,9 +72,9 @@ NSString *dataConversionString = nil; // Result sets - MCPResult *statusResult = nil; - MCPResult *structureResult = nil; - MCPStreamingResult *streamingResult = nil; + SPMySQLResult *statusResult = nil; + SPMySQLResult *structureResult = nil; + SPMySQLFastStreamingResult *streamingResult = nil; NSMutableArray *xmlTags = [NSMutableArray array]; NSMutableString *xmlString = [NSMutableString string]; @@ -107,7 +106,7 @@ isTableExport = YES; - totalRows = [[[[connection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [[self xmlTableName] backtickQuotedString]]] fetchRowAsArray] objectAtIndex:0] integerValue]; + totalRows = [[connection getFirstFieldFromQuery:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [[self xmlTableName] backtickQuotedString]]] integerValue]; streamingResult = [connection streamingQueryString:[NSString stringWithFormat:@"SELECT * FROM %@", [[self xmlTableName] backtickQuotedString]] useLowMemoryBlockingStreaming:[self exportUsingLowMemoryBlockingStreaming]]; // Only include the structure if necessary @@ -118,17 +117,12 @@ [escapedTableName replaceOccurrencesOfString:@"\\" withString:@"\\\\\\\\" options:0 range:NSMakeRange(0, [escapedTableName length])]; statusResult = [connection queryString:[NSString stringWithFormat:@"SHOW TABLE STATUS LIKE %@", escapedTableName]]; - if ([structureResult numOfRows] && [statusResult numOfRows]) { - - [statusResult dataSeek:0]; - [structureResult dataSeek:0]; - + if ([structureResult numberOfRows] && [statusResult numberOfRows]) { + [xmlString appendFormat:@"\t<table_structure name=\"%@\">\n", [self xmlTableName]]; - for (i = 0; i < [structureResult numOfRows]; i++) + for (NSDictionary *row in structureResult) { - NSDictionary *row = [structureResult fetchRowAsDictionary]; - [xmlString appendFormat:@"\t\t<field field=\"%@\" type=\"%@\" null=\"%@\" key=\"%@\" default=\"%@\" extra=\"%@\" />\n", [row objectForKey:@"Field"], [row objectForKey:@"Type"], @@ -138,7 +132,7 @@ [row objectForKey:@"Extra"]]; } - NSDictionary *row = [statusResult fetchRowAsDictionary]; + NSDictionary *row = [statusResult getRowAsDictionary]; [xmlString appendFormat:@"\n\t\t<options name=\"%@\" engine=\"%@\" version=\"%@\" row_format=\"%@\" rows=\"%@\" avg_row_length=\"%@\" data_length=\"%@\" max_data_length=\"%@\" index_length=\"%@\" data_free=\"%@\" create_time=\"%@\" update_time=\"%@\" collation=\"%@\" create_options=\"%@\" comment=\"%@\" />\n", [row objectForKey:@"Name"], @@ -175,7 +169,7 @@ if ((!isTableExport) || (isTableExport && [self xmlOutputIncludeContent])) { // Set up an array of encoded field names as opening and closing tags - fieldNames = ([self xmlDataArray]) ? NSArrayObjectAtIndex([self xmlDataArray], 0) : [streamingResult fetchFieldNames]; + fieldNames = ([self xmlDataArray]) ? NSArrayObjectAtIndex([self xmlDataArray], 0) : [streamingResult fieldNames]; for (i = 0; i < [fieldNames count]; i++) { @@ -225,7 +219,7 @@ } // Or by reading an appropriate row from the streaming result else { - xmlRow = [streamingResult fetchNextRowAsArray]; + xmlRow = [streamingResult getRowAsArray]; if (!xmlRow) break; } @@ -265,14 +259,14 @@ [xmlItem setString:[NSString stringWithString:dataConversionString]]; [dataConversionString release]; } - else if ([data isKindOfClass:[NSNull class]]) { + else if (data == [NSNull null]) { dataIsNULL = YES; if ([self xmlFormat] == SPXMLExportPlainFormat) { [xmlItem setString:[self xmlNULLString]]; } } - else if ([data isKindOfClass:[MCPGeometryData class]]) { + else if ([data isKindOfClass:[SPMySQLGeometryData class]]) { [xmlItem setString:[data wktString]]; } else { diff --git a/Source/SPXMLExporterDelegate.m b/Source/SPXMLExporterDelegate.m index 7f286c46..013019b2 100644 --- a/Source/SPXMLExporterDelegate.m +++ b/Source/SPXMLExporterDelegate.m @@ -27,6 +27,7 @@ #import "SPXMLExporter.h" #import "SPDatabaseDocument.h" #import "SPExportFile.h" +#import "SPMySQL.h" @implementation SPExportController (SPXMLExporterDelegate) diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index a40aef7e..62945ff0 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -89,34 +89,6 @@ 17A7773411C52D8E001E27B4 /* SPIndexesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17A7773311C52D8E001E27B4 /* SPIndexesController.m */; }; 17A7773811C52E61001E27B4 /* IndexesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17A7773611C52E61001E27B4 /* IndexesView.xib */; }; 17AF787B11FC41C00073D043 /* SPExportFilenameUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 17AF787A11FC41C00073D043 /* SPExportFilenameUtilities.m */; }; - 17B7B578101601C300F057DE /* libmysqlclient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 17B7B576101601C300F057DE /* libmysqlclient.a */; }; - 17B7B5901016028F00F057DE /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 17B7B58F1016028F00F057DE /* libcrypto.dylib */; }; - 17B7B592101602AE00F057DE /* libssl.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 17B7B591101602AE00F057DE /* libssl.dylib */; }; - 17B7B595101602D800F057DE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */; }; - 17B7B5991016038400F057DE /* MCPKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17B7B5621016012700F057DE /* MCPKit.framework */; }; - 17B7B5D3101603B200F057DE /* MCPConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5C4101603B200F057DE /* MCPConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5D4101603B200F057DE /* MCPConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B7B5C5101603B200F057DE /* MCPConnection.m */; }; - 17B7B5D5101603B200F057DE /* MCPConnectionProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5C6101603B200F057DE /* MCPConnectionProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5D6101603B200F057DE /* MCPConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5C7101603B200F057DE /* MCPConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5D7101603B200F057DE /* MCPFastQueries.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5C8101603B200F057DE /* MCPFastQueries.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5D8101603B200F057DE /* MCPFastQueries.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B7B5C9101603B200F057DE /* MCPFastQueries.m */; }; - 17B7B5D9101603B200F057DE /* MCPKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5CA101603B200F057DE /* MCPKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5DA101603B200F057DE /* MCPNull.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5CB101603B200F057DE /* MCPNull.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5DB101603B200F057DE /* MCPNull.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B7B5CC101603B200F057DE /* MCPNull.m */; }; - 17B7B5DC101603B200F057DE /* MCPNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5CD101603B200F057DE /* MCPNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5DD101603B200F057DE /* MCPNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B7B5CE101603B200F057DE /* MCPNumber.m */; }; - 17B7B5DE101603B200F057DE /* MCPResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5CF101603B200F057DE /* MCPResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5DF101603B200F057DE /* MCPResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B7B5D0101603B200F057DE /* MCPResult.m */; }; - 17B7B5E1101603B200F057DE /* MCPResultPlus.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B7B5D2101603B200F057DE /* MCPResultPlus.m */; }; - 17B7B5EA101603D200F057DE /* my_alloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E2101603D200F057DE /* my_alloc.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5EB101603D200F057DE /* my_list.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E3101603D200F057DE /* my_list.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5EC101603D200F057DE /* mysql.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E4101603D200F057DE /* mysql.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5ED101603D200F057DE /* mysql_com.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E5101603D200F057DE /* mysql_com.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5EE101603D200F057DE /* mysql_embed.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E6101603D200F057DE /* mysql_embed.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5EF101603D200F057DE /* mysql_time.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E7101603D200F057DE /* mysql_time.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5F0101603D200F057DE /* mysql_version.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E8101603D200F057DE /* mysql_version.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B5F1101603D200F057DE /* typelib.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5E9101603D200F057DE /* typelib.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17B7B61D101605E300F057DE /* MCPKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 17B7B5621016012700F057DE /* MCPKit.framework */; }; 17C058880FC9FC390077E9CF /* SPNarrowDownCompletion.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C058870FC9FC390077E9CF /* SPNarrowDownCompletion.m */; }; 17CC97F310B4ABE90034CD7A /* SPAboutController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17CC97F210B4ABE90034CD7A /* SPAboutController.m */; }; 17CC97F710B4AC6C0034CD7A /* AboutPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17CC97F510B4AC6C0034CD7A /* AboutPanel.xib */; }; @@ -131,8 +103,6 @@ 17D3C671128AD8160047709F /* SPSingleton.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D3C670128AD8160047709F /* SPSingleton.m */; }; 17D3C6D3128B1C900047709F /* SPFavoritesOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D3C6D2128B1C900047709F /* SPFavoritesOutlineView.m */; }; 17D3DC201281816E002A163A /* SPDatabaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D3DC1F1281816E002A163A /* SPDatabaseViewController.m */; }; - 17DC8E75126F4AB600E9AAEC /* MCPConnectionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 17DC8E74126F4AB600E9AAEC /* MCPConnectionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17DCC5C7115C202700F89A00 /* MCPStringAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 17DCC5C5115C202700F89A00 /* MCPStringAdditions.h */; }; 17DD52B7115071D0007D8950 /* SPPrintTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = 17DD52B6115071D0007D8950 /* SPPrintTemplate.html */; }; 17DD52C3115074B3007D8950 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 17DD52C1115074B3007D8950 /* InfoPlist.strings */; }; 17DD52C6115074CB007D8950 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 17DD52C4115074CB007D8950 /* Localizable.strings */; }; @@ -204,7 +174,6 @@ 4DECC3370EC2A170008D359E /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DECC3340EC2A170008D359E /* Growl.framework */; }; 4DECC48F0EC2B436008D359E /* Sparkle.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 4DECC3320EC2A170008D359E /* Sparkle.framework */; }; 4DECC4910EC2B436008D359E /* Growl.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 4DECC3340EC2A170008D359E /* Growl.framework */; }; - 580316CF13AE7BB300235317 /* MCPStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 580316CE13AE7BB300235317 /* MCPStringAdditions.m */; }; 5806B76411A991EC00813A88 /* SPDocumentController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5806B76311A991EC00813A88 /* SPDocumentController.m */; }; 580E8DB711EA774B000D8427 /* SequelProTabClose_Pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 580E8DAB11EA772C000D8427 /* SequelProTabClose_Pressed.png */; }; 580E8DB811EA774B000D8427 /* SequelProTabClose_Rollover.png in Resources */ = {isa = PBXBuildFile; fileRef = 580E8DAC11EA772C000D8427 /* SequelProTabClose_Rollover.png */; }; @@ -212,7 +181,6 @@ 580E8DBA11EA774B000D8427 /* SequelProTabDirty_Pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 580E8DAE11EA772C000D8427 /* SequelProTabDirty_Pressed.png */; }; 580E8DBB11EA774B000D8427 /* SequelProTabDirty_Rollover.png in Resources */ = {isa = PBXBuildFile; fileRef = 580E8DAF11EA772C000D8427 /* SequelProTabDirty_Rollover.png */; }; 580E8DBC11EA774B000D8427 /* SequelProTabDirty.png in Resources */ = {isa = PBXBuildFile; fileRef = 580E8DB011EA772C000D8427 /* SequelProTabDirty.png */; }; - 580E8EDD11EBE2A4000D8427 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 580E8EDC11EBE2A4000D8427 /* SystemConfiguration.framework */; }; 581068B61015411B0068C6E2 /* link-arrow-highlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 581068B51015411B0068C6E2 /* link-arrow-highlighted.png */; }; 581069B410167EC10068C6E2 /* SequelProTunnelAssistant in Resources */ = {isa = PBXBuildFile; fileRef = 58CDB3360FCE13C900F8ACA3 /* SequelProTunnelAssistant */; }; 58186D210F4CB38900851FE9 /* ConnectionErrorDialog.xib in Resources */ = {isa = PBXBuildFile; fileRef = 58186D1F0F4CB38900851FE9 /* ConnectionErrorDialog.xib */; }; @@ -222,9 +190,7 @@ 582A01E9107C0C170027D42B /* SPNotLoaded.m in Sources */ = {isa = PBXBuildFile; fileRef = 582A01E8107C0C170027D42B /* SPNotLoaded.m */; }; 582A05A9108A5CCF0027D42B /* ProgressIndicatorLayer.xib in Resources */ = {isa = PBXBuildFile; fileRef = 582A05A7108A5CCF0027D42B /* ProgressIndicatorLayer.xib */; }; 582F02311370B52600B30621 /* SPExportFileNameTokenObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 582F02301370B52600B30621 /* SPExportFileNameTokenObject.m */; }; - 583B77D4103870C800B21F7E /* MCPStreamingResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 583B779810386B0200B21F7E /* MCPStreamingResult.m */; }; 583CA21512EC8B2200C9E763 /* SPWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 583CA21412EC8B2200C9E763 /* SPWindow.m */; }; - 583CE52D11725642008F148E /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 583CE52C11725642008F148E /* libz.dylib */; }; 584095191107CB6600260CFD /* SPAlertSheets.m in Sources */ = {isa = PBXBuildFile; fileRef = 584095181107CB6600260CFD /* SPAlertSheets.m */; }; 5841423F0F97E11000A34B47 /* NoodleLineNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5841423E0F97E11000A34B47 /* NoodleLineNumberView.m */; }; 584192A1101E57BB0089807F /* NSMutableArray-MultipleSort.m in Sources */ = {isa = PBXBuildFile; fileRef = 584192A0101E57BB0089807F /* NSMutableArray-MultipleSort.m */; }; @@ -241,9 +207,9 @@ 58475704120A1B290057631F /* SPQLPluginQueryFavoritesTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = 584756FE120A1B290057631F /* SPQLPluginQueryFavoritesTemplate.html */; }; 58475705120A1B290057631F /* SPQLPluginSQLTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = 58475700120A1B290057631F /* SPQLPluginSQLTemplate.html */; }; 5847577D120A1E8A0057631F /* Sequel Pro.qlgenerator in Copy QuickLook Plugins */ = {isa = PBXBuildFile; fileRef = 584754C2120A04560057631F /* Sequel Pro.qlgenerator */; }; + 584D804A15056AC200F24774 /* SPMySQL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 584D804315056AA700F24774 /* SPMySQL.framework */; }; + 584D804D15056ACB00F24774 /* SPMySQL.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 584D804315056AA700F24774 /* SPMySQL.framework */; }; 584F5F8F0F50ACD800036517 /* table-view-small.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 584F5F8E0F50ACD800036517 /* table-view-small.tiff */; }; - 58587B5A11B4437C00D129ED /* NSNotificationAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 58587B5811B4437C00D129ED /* NSNotificationAdditions.h */; }; - 58587B5B11B4437C00D129ED /* NSNotificationAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 58587B5911B4437C00D129ED /* NSNotificationAdditions.m */; }; 586AAB1514FAD3AF007F82BF /* QueryKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17E5955314F304000054EE08 /* QueryKit.framework */; }; 586AAB9314FAD40D007F82BF /* QueryKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 17E5955314F304000054EE08 /* QueryKit.framework */; }; 586EBD2411418D7C00B3DE45 /* FeedbackReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586EBD2311418D7C00B3DE45 /* FeedbackReporter.framework */; }; @@ -298,8 +264,6 @@ 58B907FB11BDA5A9000826E5 /* PSMTabBar.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 58B906E611BD989A000826E5 /* PSMTabBar.framework */; }; 58B9097B11C3A4A2000826E5 /* xibLocalizationPostprocessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B9095B11C3A3EC000826E5 /* xibLocalizationPostprocessor.m */; }; 58B909A511C3B919000826E5 /* DMLocalizedNibBundle.m in Sources */ = {isa = PBXBuildFile; fileRef = 58B909A411C3B919000826E5 /* DMLocalizedNibBundle.m */; }; - 58BC5E56103898140058C2E6 /* MCPStreamingResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 583B779710386B0200B21F7E /* MCPStreamingResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 58BC5E571038983E0058C2E6 /* MCPResultPlus.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B7B5D1101603B200F057DE /* MCPResultPlus.h */; settings = {ATTRIBUTES = (Public, ); }; }; 58C34F5310B86CAE00D37E14 /* NSNotificationAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 58C34F5210B86CAE00D37E14 /* NSNotificationAdditions.m */; }; 58C3506510B9A56C00D37E14 /* button_left.png in Resources */ = {isa = PBXBuildFile; fileRef = 58C3506410B9A56C00D37E14 /* button_left.png */; }; 58C3506710B9A57300D37E14 /* button_right.png in Resources */ = {isa = PBXBuildFile; fileRef = 58C3506610B9A57300D37E14 /* button_right.png */; }; @@ -472,20 +436,11 @@ BCD06FC7120AAACB00C73602 /* SPStringAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1789343A0F30C1DD0097539A /* SPStringAdditions.h */; }; BCD0AD490FBBFC340066EA5C /* SPSQLTokenizer.l in Sources */ = {isa = PBXBuildFile; fileRef = BCD0AD480FBBFC340066EA5C /* SPSQLTokenizer.l */; }; BCE0025D11173D2A009DA533 /* SPFieldMapperController.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE0025C11173D2A009DA533 /* SPFieldMapperController.m */; }; - BCE97AEE125DC4EC0091ED3C /* MCPGeometryData.h in Headers */ = {isa = PBXBuildFile; fileRef = BCE97AEC125DC4EC0091ED3C /* MCPGeometryData.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCE97AEF125DC4EC0091ED3C /* MCPGeometryData.m in Sources */ = {isa = PBXBuildFile; fileRef = BCE97AED125DC4EC0091ED3C /* MCPGeometryData.m */; }; BCEC862012115A30002561DA /* SPQLPluginConnectionBundleWindowTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = BCEC861F12115A30002561DA /* SPQLPluginConnectionBundleWindowTemplate.html */; }; BCEF78C6115215CA0023F8C2 /* network-small.tif in Resources */ = {isa = PBXBuildFile; fileRef = BCEF78C5115215CA0023F8C2 /* network-small.tif */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 1792C2CC10AE239D00ABE758 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 2A37F4A9FDCFA73011CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 17B7B5611016012700F057DE; - remoteInfo = MCPKit; - }; 1798AAFF12676BAD000D946A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 2A37F4A9FDCFA73011CA2CEA /* Project object */; @@ -507,13 +462,6 @@ remoteGlobalIDString = 58B9096011C3A42B000826E5; remoteInfo = xibLocalizationPostprocessor; }; - 17B7B59A1016039200F057DE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 2A37F4A9FDCFA73011CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 17B7B5611016012700F057DE; - remoteInfo = MCPKit; - }; 17E5955214F304000054EE08 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 17E5954E14F304000054EE08 /* QueryKit.xcodeproj */; @@ -535,11 +483,25 @@ remoteGlobalIDString = 584754C1120A04560057631F; remoteInfo = "Sequel Pro QLGenerator"; }; + 584D804215056AA700F24774 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 584D803E15056AA700F24774 /* SPMySQLFramework.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8DC2EF5B0486A6940098B216 /* SPMySQL.framework */; + remoteInfo = SPMySQL.framework; + }; + 584D804815056AB700F24774 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 584D803E15056AA700F24774 /* SPMySQLFramework.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216 /* SPMySQL.framework */; + remoteInfo = SPMySQL.framework; + }; 586AAB0F14FAD3A2007F82BF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 17E5954E14F304000054EE08 /* QueryKit.xcodeproj */; proxyType = 1; - remoteGlobalIDString = 8DC2EF4F0486A6940098B216 /* QueryKit */; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = QueryKit; }; 58B907CC11BDA552000826E5 /* PBXContainerItemProxy */ = { @@ -583,7 +545,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 17B7B61D101605E300F057DE /* MCPKit.framework in Copy Frameworks */, 58B907FB11BDA5A9000826E5 /* PSMTabBar.framework in Copy Frameworks */, 4DECC4910EC2B436008D359E /* Growl.framework in Copy Frameworks */, 4DECC48F0EC2B436008D359E /* Sparkle.framework in Copy Frameworks */, @@ -592,6 +553,7 @@ 58C6C71F11FBB18000A3F5E9 /* UniversalDetector.framework in Copy Frameworks */, 58DC0D7C12932AB200B76DA5 /* ShortcutRecorder.framework in Copy Frameworks */, 586AAB9314FAD40D007F82BF /* QueryKit.framework in Copy Frameworks */, + 584D804D15056ACB00F24774 /* SPMySQL.framework in Copy Frameworks */, ); name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -738,55 +700,9 @@ 17A7773711C52E61001E27B4 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Interfaces/English.lproj/IndexesView.xib; sourceTree = "<group>"; }; 17AF787911FC41C00073D043 /* SPExportFilenameUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPExportFilenameUtilities.h; sourceTree = "<group>"; }; 17AF787A11FC41C00073D043 /* SPExportFilenameUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPExportFilenameUtilities.m; sourceTree = "<group>"; }; - 17B7B5621016012700F057DE /* MCPKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MCPKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 17B7B576101601C300F057DE /* libmysqlclient.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmysqlclient.a; sourceTree = "<group>"; }; - 17B7B577101601C300F057DE /* libmysqlclient_r.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmysqlclient_r.a; sourceTree = "<group>"; }; 17B7B58B1016022C00F057DE /* MCPKit-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "MCPKit-Info.plist"; path = "Plists/MCPKit-Info.plist"; sourceTree = "<group>"; }; 17B7B58F1016028F00F057DE /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.dylib; path = /usr/lib/libcrypto.dylib; sourceTree = "<absolute>"; }; 17B7B591101602AE00F057DE /* libssl.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libssl.dylib; path = /usr/lib/libssl.dylib; sourceTree = "<absolute>"; }; - 17B7B59C101603A400F057DE /* MCPAttribute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPAttribute.h; sourceTree = "<group>"; }; - 17B7B59D101603A400F057DE /* MCPAttribute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPAttribute.m; sourceTree = "<group>"; }; - 17B7B59E101603A400F057DE /* MCPClassDescription+MCPEntreprise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MCPClassDescription+MCPEntreprise.h"; sourceTree = "<group>"; }; - 17B7B59F101603A400F057DE /* MCPClassDescription+MCPEntreprise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MCPClassDescription+MCPEntreprise.m"; sourceTree = "<group>"; }; - 17B7B5A0101603A400F057DE /* MCPClassDescription+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MCPClassDescription+Private.h"; sourceTree = "<group>"; }; - 17B7B5A1101603A400F057DE /* MCPClassDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPClassDescription.h; sourceTree = "<group>"; }; - 17B7B5A2101603A400F057DE /* MCPClassDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPClassDescription.m; sourceTree = "<group>"; }; - 17B7B5A3101603A400F057DE /* MCPEntrepriseNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPEntrepriseNotifications.h; sourceTree = "<group>"; }; - 17B7B5A4101603A400F057DE /* MCPEntrepriseNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPEntrepriseNotifications.m; sourceTree = "<group>"; }; - 17B7B5A5101603A400F057DE /* MCPJoin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPJoin.h; sourceTree = "<group>"; }; - 17B7B5A6101603A400F057DE /* MCPJoin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPJoin.m; sourceTree = "<group>"; }; - 17B7B5A7101603A400F057DE /* MCPModel+MCPEntreprise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MCPModel+MCPEntreprise.h"; sourceTree = "<group>"; }; - 17B7B5A8101603A400F057DE /* MCPModel+MCPEntreprise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MCPModel+MCPEntreprise.m"; sourceTree = "<group>"; }; - 17B7B5A9101603A400F057DE /* MCPModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPModel.h; sourceTree = "<group>"; }; - 17B7B5AA101603A400F057DE /* MCPModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPModel.m; sourceTree = "<group>"; }; - 17B7B5AB101603A400F057DE /* MCPObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPObject.h; sourceTree = "<group>"; }; - 17B7B5AC101603A400F057DE /* MCPObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPObject.m; sourceTree = "<group>"; }; - 17B7B5AD101603A400F057DE /* MCPRelation+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MCPRelation+Private.h"; sourceTree = "<group>"; }; - 17B7B5AE101603A400F057DE /* MCPRelation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPRelation.h; sourceTree = "<group>"; }; - 17B7B5AF101603A400F057DE /* MCPRelation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPRelation.m; sourceTree = "<group>"; }; - 17B7B5C4101603B200F057DE /* MCPConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPConnection.h; sourceTree = "<group>"; }; - 17B7B5C5101603B200F057DE /* MCPConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPConnection.m; sourceTree = "<group>"; }; - 17B7B5C6101603B200F057DE /* MCPConnectionProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPConnectionProxy.h; sourceTree = "<group>"; }; - 17B7B5C7101603B200F057DE /* MCPConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPConstants.h; sourceTree = "<group>"; }; - 17B7B5C8101603B200F057DE /* MCPFastQueries.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPFastQueries.h; sourceTree = "<group>"; }; - 17B7B5C9101603B200F057DE /* MCPFastQueries.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPFastQueries.m; sourceTree = "<group>"; }; - 17B7B5CA101603B200F057DE /* MCPKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPKit.h; sourceTree = "<group>"; }; - 17B7B5CB101603B200F057DE /* MCPNull.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPNull.h; sourceTree = "<group>"; }; - 17B7B5CC101603B200F057DE /* MCPNull.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPNull.m; sourceTree = "<group>"; }; - 17B7B5CD101603B200F057DE /* MCPNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPNumber.h; sourceTree = "<group>"; }; - 17B7B5CE101603B200F057DE /* MCPNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPNumber.m; sourceTree = "<group>"; }; - 17B7B5CF101603B200F057DE /* MCPResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPResult.h; sourceTree = "<group>"; }; - 17B7B5D0101603B200F057DE /* MCPResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPResult.m; sourceTree = "<group>"; }; - 17B7B5D1101603B200F057DE /* MCPResultPlus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPResultPlus.h; sourceTree = "<group>"; }; - 17B7B5D2101603B200F057DE /* MCPResultPlus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPResultPlus.m; sourceTree = "<group>"; }; - 17B7B5E2101603D200F057DE /* my_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = my_alloc.h; sourceTree = "<group>"; }; - 17B7B5E3101603D200F057DE /* my_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = my_list.h; sourceTree = "<group>"; }; - 17B7B5E4101603D200F057DE /* mysql.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql.h; sourceTree = "<group>"; }; - 17B7B5E5101603D200F057DE /* mysql_com.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_com.h; sourceTree = "<group>"; }; - 17B7B5E6101603D200F057DE /* mysql_embed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_embed.h; sourceTree = "<group>"; }; - 17B7B5E7101603D200F057DE /* mysql_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_time.h; sourceTree = "<group>"; }; - 17B7B5E8101603D200F057DE /* mysql_version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mysql_version.h; sourceTree = "<group>"; }; - 17B7B5E9101603D200F057DE /* typelib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typelib.h; sourceTree = "<group>"; }; 17B7B698101611C800F057DE /* build-mysql-client.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "build-mysql-client.sh"; sourceTree = "<group>"; }; 17C058860FC9FC390077E9CF /* SPNarrowDownCompletion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPNarrowDownCompletion.h; sourceTree = "<group>"; }; 17C058870FC9FC390077E9CF /* SPNarrowDownCompletion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPNarrowDownCompletion.m; sourceTree = "<group>"; }; @@ -817,8 +733,6 @@ 17D3DC1E1281816E002A163A /* SPDatabaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDatabaseViewController.h; sourceTree = "<group>"; }; 17D3DC1F1281816E002A163A /* SPDatabaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDatabaseViewController.m; sourceTree = "<group>"; }; 17DA04EA0FC1A7DA00D66140 /* Unit Tests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Unit Tests-Info.plist"; path = "Plists/Unit Tests-Info.plist"; sourceTree = "<group>"; }; - 17DC8E74126F4AB600E9AAEC /* MCPConnectionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPConnectionDelegate.h; sourceTree = "<group>"; }; - 17DCC5C5115C202700F89A00 /* MCPStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPStringAdditions.h; sourceTree = "<group>"; }; 17DD52B6115071D0007D8950 /* SPPrintTemplate.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = SPPrintTemplate.html; path = Templates/SPPrintTemplate.html; sourceTree = "<group>"; }; 17DD52B811507217007D8950 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; }; 17DD52C2115074B3007D8950 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; }; @@ -953,7 +867,6 @@ 4D90B7A1101E0D1500D116A1 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/UserManagerView.xib; sourceTree = "<group>"; }; 4DECC3320EC2A170008D359E /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Frameworks/Sparkle.framework; sourceTree = "<group>"; }; 4DECC3340EC2A170008D359E /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = Frameworks/Growl.framework; sourceTree = "<group>"; }; - 580316CE13AE7BB300235317 /* MCPStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPStringAdditions.m; sourceTree = "<group>"; }; 5806B76211A991EC00813A88 /* SPDocumentController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDocumentController.h; sourceTree = "<group>"; }; 5806B76311A991EC00813A88 /* SPDocumentController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDocumentController.m; sourceTree = "<group>"; }; 580E8DAB11EA772C000D8427 /* SequelProTabClose_Pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = SequelProTabClose_Pressed.png; sourceTree = "<group>"; }; @@ -975,8 +888,6 @@ 582A05A8108A5CCF0027D42B /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Interfaces/English.lproj/ProgressIndicatorLayer.xib; sourceTree = "<group>"; }; 582F022F1370B52600B30621 /* SPExportFileNameTokenObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPExportFileNameTokenObject.h; sourceTree = "<group>"; }; 582F02301370B52600B30621 /* SPExportFileNameTokenObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPExportFileNameTokenObject.m; sourceTree = "<group>"; }; - 583B779710386B0200B21F7E /* MCPStreamingResult.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 4; path = MCPStreamingResult.h; sourceTree = "<group>"; }; - 583B779810386B0200B21F7E /* MCPStreamingResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPStreamingResult.m; sourceTree = "<group>"; }; 583CA21312EC8B2200C9E763 /* SPWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWindow.h; sourceTree = "<group>"; }; 583CA21412EC8B2200C9E763 /* SPWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWindow.m; sourceTree = "<group>"; }; 583CE39C11722B84008F148E /* zlib.1.2.4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zlib.1.2.4.h; path = Frameworks/zlib/zlib.1.2.4.h; sourceTree = SOURCE_ROOT; }; @@ -1004,9 +915,8 @@ 58475707120A1B630057631F /* German */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = German; path = German.lproj/SPQLPluginContentFiltersTemplate.html; sourceTree = "<group>"; }; 58475708120A1B630057631F /* German */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = German; path = German.lproj/SPQLPluginQueryFavoritesTemplate.html; sourceTree = "<group>"; }; 58475709120A1B630057631F /* German */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = German; path = German.lproj/SPQLPluginSQLTemplate.html; sourceTree = "<group>"; }; + 584D803E15056AA700F24774 /* SPMySQLFramework.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SPMySQLFramework.xcodeproj; path = Frameworks/SPMySQLFramework/SPMySQLFramework.xcodeproj; sourceTree = "<group>"; }; 584F5F8E0F50ACD800036517 /* table-view-small.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "table-view-small.tiff"; sourceTree = "<group>"; }; - 58587B5811B4437C00D129ED /* NSNotificationAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSNotificationAdditions.h; path = "Support files/NSNotificationAdditions.h"; sourceTree = "<group>"; }; - 58587B5911B4437C00D129ED /* NSNotificationAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSNotificationAdditions.m; path = "Support files/NSNotificationAdditions.m"; sourceTree = "<group>"; }; 586EBD2311418D7C00B3DE45 /* FeedbackReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FeedbackReporter.framework; path = Frameworks/FeedbackReporter.framework; sourceTree = "<group>"; }; 586F432A0FD74CFC00B428D7 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/SSHQuestionDialog.xib; sourceTree = "<group>"; }; 5870868210FA3E9C00D58E1C /* SPDataStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDataStorage.h; sourceTree = "<group>"; }; @@ -1319,27 +1229,12 @@ BCD0AD4A0FBBFC480066EA5C /* SPSQLTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPSQLTokenizer.h; sourceTree = "<group>"; }; BCE0025B11173D2A009DA533 /* SPFieldMapperController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPFieldMapperController.h; sourceTree = "<group>"; }; BCE0025C11173D2A009DA533 /* SPFieldMapperController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPFieldMapperController.m; sourceTree = "<group>"; }; - BCE97AEC125DC4EC0091ED3C /* MCPGeometryData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPGeometryData.h; sourceTree = "<group>"; }; - BCE97AED125DC4EC0091ED3C /* MCPGeometryData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCPGeometryData.m; sourceTree = "<group>"; }; BCEC861D12115A2B002561DA /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = English; path = English.lproj/SPQLPluginConnectionBundleWindowTemplate.html; sourceTree = "<group>"; }; BCEC862112115A3D002561DA /* German */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = German; path = German.lproj/SPQLPluginConnectionBundleWindowTemplate.html; sourceTree = "<group>"; }; BCEF78C5115215CA0023F8C2 /* network-small.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "network-small.tif"; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 17B7B5601016012700F057DE /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 17B7B578101601C300F057DE /* libmysqlclient.a in Frameworks */, - 17B7B5901016028F00F057DE /* libcrypto.dylib in Frameworks */, - 17B7B592101602AE00F057DE /* libssl.dylib in Frameworks */, - 17B7B595101602D800F057DE /* Cocoa.framework in Frameworks */, - 583CE52D11725642008F148E /* libz.dylib in Frameworks */, - 580E8EDD11EBE2A4000D8427 /* SystemConfiguration.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 17E20DFF12D6609E007F75A6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1398,7 +1293,7 @@ B5EAC0FD0EC87FF900CC579C /* Security.framework in Frameworks */, 4DECC3350EC2A170008D359E /* Sparkle.framework in Frameworks */, 586AAB1514FAD3AF007F82BF /* QueryKit.framework in Frameworks */, - 17B7B5991016038400F057DE /* MCPKit.framework in Frameworks */, + 584D804A15056AC200F24774 /* SPMySQL.framework in Frameworks */, 296DC89F0F8FD336002A3258 /* WebKit.framework in Frameworks */, 58B907CA11BDA541000826E5 /* PSMTabBar.framework in Frameworks */, 58C458DF10CF188F00E6E13E /* libcrypto.dylib in Frameworks */, @@ -1753,106 +1648,6 @@ name = "Controller Categories"; sourceTree = "<group>"; }; - 17B7B5551016002900F057DE /* MCPKit */ = { - isa = PBXGroup; - children = ( - 17B7B5561016003F00F057DE /* MySQL */, - 17B7B5581016005700F057DE /* MCPEntrepriseKit */, - 17B7B5571016004500F057DE /* MCPFoundationKit */, - 58587B4E11B4433B00D129ED /* Support files */, - ); - name = MCPKit; - path = Frameworks/MCPKit; - sourceTree = "<group>"; - }; - 17B7B5561016003F00F057DE /* MySQL */ = { - isa = PBXGroup; - children = ( - 17B7B55A1016007600F057DE /* lib */, - 17B7B55B1016007C00F057DE /* include */, - ); - path = MySQL; - sourceTree = "<group>"; - }; - 17B7B5571016004500F057DE /* MCPFoundationKit */ = { - isa = PBXGroup; - children = ( - 17B7B5CA101603B200F057DE /* MCPKit.h */, - 17B7B5C4101603B200F057DE /* MCPConnection.h */, - 17B7B5C5101603B200F057DE /* MCPConnection.m */, - 17B7B5C7101603B200F057DE /* MCPConstants.h */, - 17B7B5C8101603B200F057DE /* MCPFastQueries.h */, - 17B7B5C9101603B200F057DE /* MCPFastQueries.m */, - 17B7B5CB101603B200F057DE /* MCPNull.h */, - 17B7B5CC101603B200F057DE /* MCPNull.m */, - 17B7B5CD101603B200F057DE /* MCPNumber.h */, - 17B7B5CE101603B200F057DE /* MCPNumber.m */, - 17B7B5CF101603B200F057DE /* MCPResult.h */, - 17B7B5D0101603B200F057DE /* MCPResult.m */, - 17B7B5D1101603B200F057DE /* MCPResultPlus.h */, - 17B7B5D2101603B200F057DE /* MCPResultPlus.m */, - 583B779710386B0200B21F7E /* MCPStreamingResult.h */, - 583B779810386B0200B21F7E /* MCPStreamingResult.m */, - 17DCC5C5115C202700F89A00 /* MCPStringAdditions.h */, - 580316CE13AE7BB300235317 /* MCPStringAdditions.m */, - BCE97AEC125DC4EC0091ED3C /* MCPGeometryData.h */, - BCE97AED125DC4EC0091ED3C /* MCPGeometryData.m */, - 17DC8E73126F4A8000E9AAEC /* Protocols */, - ); - path = MCPFoundationKit; - sourceTree = "<group>"; - }; - 17B7B5581016005700F057DE /* MCPEntrepriseKit */ = { - isa = PBXGroup; - children = ( - 17B7B59C101603A400F057DE /* MCPAttribute.h */, - 17B7B59D101603A400F057DE /* MCPAttribute.m */, - 17B7B59E101603A400F057DE /* MCPClassDescription+MCPEntreprise.h */, - 17B7B59F101603A400F057DE /* MCPClassDescription+MCPEntreprise.m */, - 17B7B5A0101603A400F057DE /* MCPClassDescription+Private.h */, - 17B7B5A1101603A400F057DE /* MCPClassDescription.h */, - 17B7B5A2101603A400F057DE /* MCPClassDescription.m */, - 17B7B5A3101603A400F057DE /* MCPEntrepriseNotifications.h */, - 17B7B5A4101603A400F057DE /* MCPEntrepriseNotifications.m */, - 17B7B5A5101603A400F057DE /* MCPJoin.h */, - 17B7B5A6101603A400F057DE /* MCPJoin.m */, - 17B7B5A7101603A400F057DE /* MCPModel+MCPEntreprise.h */, - 17B7B5A8101603A400F057DE /* MCPModel+MCPEntreprise.m */, - 17B7B5A9101603A400F057DE /* MCPModel.h */, - 17B7B5AA101603A400F057DE /* MCPModel.m */, - 17B7B5AB101603A400F057DE /* MCPObject.h */, - 17B7B5AC101603A400F057DE /* MCPObject.m */, - 17B7B5AD101603A400F057DE /* MCPRelation+Private.h */, - 17B7B5AE101603A400F057DE /* MCPRelation.h */, - 17B7B5AF101603A400F057DE /* MCPRelation.m */, - ); - path = MCPEntrepriseKit; - sourceTree = "<group>"; - }; - 17B7B55A1016007600F057DE /* lib */ = { - isa = PBXGroup; - children = ( - 17B7B576101601C300F057DE /* libmysqlclient.a */, - 17B7B577101601C300F057DE /* libmysqlclient_r.a */, - ); - path = lib; - sourceTree = "<group>"; - }; - 17B7B55B1016007C00F057DE /* include */ = { - isa = PBXGroup; - children = ( - 17B7B5E2101603D200F057DE /* my_alloc.h */, - 17B7B5E3101603D200F057DE /* my_list.h */, - 17B7B5E4101603D200F057DE /* mysql.h */, - 17B7B5E5101603D200F057DE /* mysql_com.h */, - 17B7B5E6101603D200F057DE /* mysql_embed.h */, - 17B7B5E7101603D200F057DE /* mysql_time.h */, - 17B7B5E8101603D200F057DE /* mysql_version.h */, - 17B7B5E9101603D200F057DE /* typelib.h */, - ); - path = include; - sourceTree = "<group>"; - }; 17BFC80D10D3FF5200A3B112 /* Icons */ = { isa = PBXGroup; children = ( @@ -2018,15 +1813,6 @@ name = "Category Additions"; sourceTree = "<group>"; }; - 17DC8E73126F4A8000E9AAEC /* Protocols */ = { - isa = PBXGroup; - children = ( - 17B7B5C6101603B200F057DE /* MCPConnectionProxy.h */, - 17DC8E74126F4AB600E9AAEC /* MCPConnectionDelegate.h */, - ); - name = Protocols; - sourceTree = "<group>"; - }; 17DD52D0115075B1007D8950 /* Help */ = { isa = PBXGroup; children = ( @@ -2392,7 +2178,7 @@ isa = PBXGroup; children = ( 17E5954E14F304000054EE08 /* QueryKit.xcodeproj */, - 17B7B5551016002900F057DE /* MCPKit */, + 584D803E15056AA700F24774 /* SPMySQLFramework.xcodeproj */, 58B906F811BD9B34000826E5 /* PSMTabBar */, ); name = Frameworks; @@ -2414,7 +2200,6 @@ 8D15AC370486D014006FF6A4 /* Sequel Pro.app */, 380F4ED90FC0B50500B0BFD7 /* Unit Tests.octest */, 58CDB3360FCE13C900F8ACA3 /* SequelProTunnelAssistant */, - 17B7B5621016012700F057DE /* MCPKit.framework */, 58B906E611BD989A000826E5 /* PSMTabBar.framework */, 58B9096111C3A42B000826E5 /* xibLocalizationPostprocessor */, 584754C2120A04560057631F /* Sequel Pro.qlgenerator */, @@ -2514,13 +2299,12 @@ name = "QuickLook Plugin"; sourceTree = "<group>"; }; - 58587B4E11B4433B00D129ED /* Support files */ = { + 584D803F15056AA700F24774 /* Products */ = { isa = PBXGroup; children = ( - 58587B5811B4437C00D129ED /* NSNotificationAdditions.h */, - 58587B5911B4437C00D129ED /* NSNotificationAdditions.m */, + 584D804315056AA700F24774 /* SPMySQL.framework */, ); - name = "Support files"; + name = Products; sourceTree = "<group>"; }; 58B906F811BD9B34000826E5 /* PSMTabBar */ = { @@ -2722,35 +2506,6 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 17B7B55D1016012700F057DE /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 17B7B5D3101603B200F057DE /* MCPConnection.h in Headers */, - 17B7B5D5101603B200F057DE /* MCPConnectionProxy.h in Headers */, - 17B7B5D6101603B200F057DE /* MCPConstants.h in Headers */, - 17B7B5D7101603B200F057DE /* MCPFastQueries.h in Headers */, - 17B7B5D9101603B200F057DE /* MCPKit.h in Headers */, - 17B7B5DA101603B200F057DE /* MCPNull.h in Headers */, - 17B7B5DC101603B200F057DE /* MCPNumber.h in Headers */, - 17B7B5DE101603B200F057DE /* MCPResult.h in Headers */, - 58BC5E571038983E0058C2E6 /* MCPResultPlus.h in Headers */, - 58BC5E56103898140058C2E6 /* MCPStreamingResult.h in Headers */, - 17B7B5EA101603D200F057DE /* my_alloc.h in Headers */, - 17B7B5EB101603D200F057DE /* my_list.h in Headers */, - 17B7B5EC101603D200F057DE /* mysql.h in Headers */, - 17B7B5ED101603D200F057DE /* mysql_com.h in Headers */, - 17B7B5EE101603D200F057DE /* mysql_embed.h in Headers */, - 17B7B5EF101603D200F057DE /* mysql_time.h in Headers */, - 17B7B5F0101603D200F057DE /* mysql_version.h in Headers */, - 17B7B5F1101603D200F057DE /* typelib.h in Headers */, - 17DCC5C7115C202700F89A00 /* MCPStringAdditions.h in Headers */, - 58587B5A11B4437C00D129ED /* NSNotificationAdditions.h in Headers */, - BCE97AEE125DC4EC0091ED3C /* MCPGeometryData.h in Headers */, - 17DC8E75126F4AB600E9AAEC /* MCPConnectionDelegate.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 58B906E111BD989A000826E5 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2784,23 +2539,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 17B7B5611016012700F057DE /* MCPKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = 17B7B5671016012A00F057DE /* Build configuration list for PBXNativeTarget "MCPKit" */; - buildPhases = ( - 17B7B55D1016012700F057DE /* Headers */, - 17B7B55F1016012700F057DE /* Sources */, - 17B7B5601016012700F057DE /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MCPKit; - productName = MCPKit; - productReference = 17B7B5621016012700F057DE /* MCPKit.framework */; - productType = "com.apple.product-type.framework"; - }; 380F4ED80FC0B50500B0BFD7 /* Unit Tests */ = { isa = PBXNativeTarget; buildConfigurationList = 380F4EDE0FC0B50600B0BFD7 /* Build configuration list for PBXNativeTarget "Unit Tests" */; @@ -2813,7 +2551,6 @@ buildRules = ( ); dependencies = ( - 1792C2CD10AE239D00ABE758 /* PBXTargetDependency */, 1798AB0012676BAD000D946A /* PBXTargetDependency */, ); name = "Unit Tests"; @@ -2903,12 +2640,12 @@ buildRules = ( ); dependencies = ( - 17B7B59B1016039200F057DE /* PBXTargetDependency */, 58B907CD11BDA552000826E5 /* PBXTargetDependency */, 58CDB34B0FCE144000F8ACA3 /* PBXTargetDependency */, 58B9097011C3A462000826E5 /* PBXTargetDependency */, 5847571E120A1C6D0057631F /* PBXTargetDependency */, 586AAB1014FAD3A2007F82BF /* PBXTargetDependency */, + 584D804915056AB700F24774 /* PBXTargetDependency */, ); name = "Sequel Pro"; productInstallPath = "$(HOME)/Applications"; @@ -2939,13 +2676,16 @@ ProductGroup = 17E5954F14F304000054EE08 /* Products */; ProjectRef = 17E5954E14F304000054EE08 /* QueryKit.xcodeproj */; }, + { + ProductGroup = 584D803F15056AA700F24774 /* Products */; + ProjectRef = 584D803E15056AA700F24774 /* SPMySQLFramework.xcodeproj */; + }, ); projectRoot = ""; targets = ( 8D15AC270486D014006FF6A4 /* Sequel Pro */, 380F4ED80FC0B50500B0BFD7 /* Unit Tests */, 58CDB3350FCE13C900F8ACA3 /* SequelProTunnelAssistant */, - 17B7B5611016012700F057DE /* MCPKit */, 58B906E511BD989A000826E5 /* PSMTabBar */, 58B9096011C3A42B000826E5 /* xibLocalizationPostprocessor */, 584754C1120A04560057631F /* Sequel Pro QLGenerator */, @@ -2969,6 +2709,13 @@ remoteRef = 17E596A114F307CE0054EE08 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 584D804315056AA700F24774 /* SPMySQL.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SPMySQL.framework; + remoteRef = 584D804215056AA700F24774 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -3218,23 +2965,6 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 17B7B55F1016012700F057DE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 17B7B5D4101603B200F057DE /* MCPConnection.m in Sources */, - 17B7B5D8101603B200F057DE /* MCPFastQueries.m in Sources */, - 17B7B5DB101603B200F057DE /* MCPNull.m in Sources */, - 17B7B5DD101603B200F057DE /* MCPNumber.m in Sources */, - 17B7B5DF101603B200F057DE /* MCPResult.m in Sources */, - 17B7B5E1101603B200F057DE /* MCPResultPlus.m in Sources */, - 583B77D4103870C800B21F7E /* MCPStreamingResult.m in Sources */, - 58587B5B11B4437C00D129ED /* NSNotificationAdditions.m in Sources */, - BCE97AEF125DC4EC0091ED3C /* MCPGeometryData.m in Sources */, - 580316CF13AE7BB300235317 /* MCPStringAdditions.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 380F4ED50FC0B50500B0BFD7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3461,11 +3191,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 1792C2CD10AE239D00ABE758 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 17B7B5611016012700F057DE /* MCPKit */; - targetProxy = 1792C2CC10AE239D00ABE758 /* PBXContainerItemProxy */; - }; 1798AB0012676BAD000D946A /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8D15AC270486D014006FF6A4 /* Sequel Pro */; @@ -3481,16 +3206,16 @@ target = 58B9096011C3A42B000826E5 /* xibLocalizationPostprocessor */; targetProxy = 1798AB401267731F000D946A /* PBXContainerItemProxy */; }; - 17B7B59B1016039200F057DE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 17B7B5611016012700F057DE /* MCPKit */; - targetProxy = 17B7B59A1016039200F057DE /* PBXContainerItemProxy */; - }; 5847571E120A1C6D0057631F /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 584754C1120A04560057631F /* Sequel Pro QLGenerator */; targetProxy = 5847571D120A1C6D0057631F /* PBXContainerItemProxy */; }; + 584D804915056AB700F24774 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SPMySQL.framework; + targetProxy = 584D804815056AB700F24774 /* PBXContainerItemProxy */; + }; 586AAB1014FAD3A2007F82BF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = QueryKit; @@ -4101,96 +3826,6 @@ }; name = Distribution; }; - 17B7B5641016012A00F057DE /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Resources/Plists/MCPKit-Info.plist"; - INSTALL_PATH = "@executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Frameworks/MCPKit/MySQL/lib\"", - "\"$(SRCROOT)/Frameworks/zlib\"", - ); - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = MCPKit; - }; - name = Debug; - }; - 17B7B5651016012A00F057DE /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Resources/Plists/MCPKit-Info.plist"; - INSTALL_PATH = "@executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Frameworks/MCPKit/MySQL/lib\"", - "\"$(SRCROOT)/Frameworks/zlib\"", - ); - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = MCPKit; - ZERO_LINK = NO; - }; - name = Release; - }; - 17B7B5661016012A00F057DE /* Distribution */ = { - isa = XCBuildConfiguration; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; - INFOPLIST_FILE = "Resources/Plists/MCPKit-Info.plist"; - INSTALL_PATH = "@executable_path/../Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/Frameworks/MCPKit/MySQL/lib\"", - "\"$(SRCROOT)/Frameworks/zlib\"", - ); - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = MCPKit; - }; - name = Distribution; - }; 380F4EDB0FC0B50600B0BFD7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4391,6 +4026,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "${PROJECT_DIR}/Frameworks/SPMySQLFramework/**"; IBC_WARNINGS = YES; PREBINDING = NO; SDKROOT = macosx10.5; @@ -4414,10 +4050,7 @@ GCC_PREFIX_HEADER = "Source/Sequel-Pro.pch"; INFOPLIST_FILE = Resources/Plists/Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/Frameworks/MCPKit/MySQL/lib\"", - "\"$(SRCROOT)/Frameworks/zlib\"", - ); + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/Frameworks/zlib\""; OTHER_LDFLAGS = ( "$(SRCROOT)/Frameworks/zlib/libz.a", "-lcrypto", @@ -4636,10 +4269,7 @@ GCC_PREFIX_HEADER = "Source/Sequel-Pro.pch"; INFOPLIST_FILE = Resources/Plists/Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/Frameworks/MCPKit/MySQL/lib\"", - "\"$(SRCROOT)/Frameworks/zlib\"", - ); + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/Frameworks/zlib\""; OTHER_LDFLAGS = ( "$(SRCROOT)/Frameworks/zlib/libz.a", "-lcrypto", @@ -4665,10 +4295,7 @@ GCC_PREFIX_HEADER = "Source/Sequel-Pro.pch"; INFOPLIST_FILE = Resources/Plists/Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "\"$(SRCROOT)/Frameworks/MCPKit/MySQL/lib\"", - "\"$(SRCROOT)/Frameworks/zlib\"", - ); + LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/Frameworks/zlib\""; OTHER_LDFLAGS = ( "$(SRCROOT)/Frameworks/zlib/libz.a", "-lcrypto", @@ -4718,6 +4345,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "${PROJECT_DIR}/Frameworks/SPMySQLFramework/**"; IBC_FLATTEN_NIBS = NO; IBC_WARNINGS = YES; LEXFLAGS = ""; @@ -4775,6 +4403,7 @@ GCC_WARN_UNUSED_PARAMETER = NO; GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "${PROJECT_DIR}/Frameworks/SPMySQLFramework/**"; IBC_WARNINGS = YES; PREBINDING = NO; SDKROOT = macosx10.5; @@ -4796,16 +4425,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 17B7B5671016012A00F057DE /* Build configuration list for PBXNativeTarget "MCPKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 17B7B5641016012A00F057DE /* Debug */, - 17B7B5651016012A00F057DE /* Release */, - 17B7B5661016012A00F057DE /* Distribution */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 380F4EDE0FC0B50600B0BFD7 /* Build configuration list for PBXNativeTarget "Unit Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( |