// // $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 // More info at #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