baseten / Sources / BXAttributeDescription.m

//
// BXAttributeDescription.m
// BaseTen
//
// Copyright (C) 2006-2008 Marko Karppinen & Co. LLC.
//
// Before using this software, please review the available licensing options
// by visiting http://basetenframework.org/licensing/ or by contacting
// us at sales@karppinen.fi. Without an additional license, this software
// may be distributed only in compliance with the GNU General Public License.
//
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, version 2.0,
// as published by the Free Software Foundation.
//
// 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
//
// $Id$
//

#import "BXAttributeDescription.h"
#import "BXAttributeDescriptionPrivate.h"
#import "BXEntityDescription.h"
#import "BXDatabaseAdditions.h"
#import "BXPropertyDescriptionPrivate.h"


/**
 * An attribute description contains information about a column in a specific entity.
 * \ingroup Descriptions
 */
@implementation BXAttributeDescription
- (void) dealloc
{
	[mDatabaseTypeName release];
	[super dealloc];
}

- (id) initWithCoder: (NSCoder *) decoder
{
	if ((self = [super initWithCoder: decoder]))
	{
		[self setPrimaryKey: [decoder decodeBoolForKey: @"isPrimaryKey"]];
		[self setExcluded: [decoder decodeBoolForKey: @"isExcluded"]];
	}
	return self;
}

- (void) encodeWithCoder: (NSCoder *) coder
{
	[coder encodeBool: [self isPrimaryKey] forKey: @"isPrimaryKey"];
	[coder encodeBool: [self isExcluded] forKey: @"isExcluded"];
	[super encodeWithCoder: coder];
}

/** Whether the attribute is part of the primary key of its entity. */
- (BOOL) isPrimaryKey
{
	return (mFlags & kBXPropertyPrimaryKey ? YES : NO);
}

/** 
 * Whether the attribute will be excluded from fetches and queried only when needed. 
 * \see BXDatabaseContext::executeFetchForEntity:withPredicate:excludingFields:error:
 */
- (BOOL) isExcluded
{
	return (mFlags & kBXPropertyExcluded ? YES : NO);
}

- (NSString *) databaseTypeName
{
	return mDatabaseTypeName;
}

- (Class) attributeValueClass
{
	return mAttributeClass;
}

- (NSString *) attributeValueClassName
{
	return NSStringFromClass (mAttributeClass);
}
@end


@implementation BXAttributeDescription (PrivateMethods)

/** 
 * \internal
 * \name Creating an attribute description
 */
//@{
/**
 * \internal
 * Create an attribute description.
 * \param       aName       Name of the attribute
 * \param       anEntity    The entity which contains the attribute.
 * \return                  The attribute description.
 */
+ (id) attributeWithName: (NSString *) aName entity: (BXEntityDescription *) anEntity
{
    return [[[self alloc] initWithName: aName entity: anEntity] autorelease];
}
//@}

- (void) setPrimaryKey: (BOOL) aBool
{
	[mEntity willChangeValueForKey: @"primaryKeyFields"];
	if (aBool)
	{
		mFlags |= kBXPropertyPrimaryKey;
		mFlags &= ~kBXPropertyExcluded;
	}
	else
	{
		mFlags &= ~kBXPropertyPrimaryKey;
	}
	[mEntity didChangeValueForKey: @"primaryKeyFields"];
}

- (void) setExcluded: (BOOL) aBool
{
	if (![self isPrimaryKey])
	{
		if (aBool)
			mFlags |= kBXPropertyExcluded;
		else
			mFlags &= ~kBXPropertyExcluded;
	}
}

- (NSString *) BXAttributeName
{
	return mName;
}

- (void) setAttributeValueClass: (Class) aClass
{
	mAttributeClass = aClass;
}

- (void) setDatabaseTypeName: (NSString *) typeName
{
	if (mDatabaseTypeName != typeName)
	{
		[mDatabaseTypeName release];
		mDatabaseTypeName = [typeName retain];
	}
}
@end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.