* EOAccess/EOModel.m (-dealloc): Set entities model to nil.

* EOAccess/EOEntityPriv.h: Add functions for maintining list of
        relationships and their destination entities.
        * EOAccess/EOEntity.m: Implement new functions.
        (-dealloc:): Set attributes entities, and relationships source 
	and destinations entities to nil.
        (+initialize:): Initialize static map table.
        * EOAccess/EORelationship.m: Call functions to maintain 
	destination entities.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@23954 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Matt Rice 2006-10-23 15:29:27 +00:00
parent a1605b6f72
commit 9e08693c96
5 changed files with 81 additions and 2 deletions

View file

@ -1,6 +1,16 @@
2006-10-23 Matt Rice <ratmice@yahoo.com>
* EOAccess: Revert previous changes.
* EOAccess/EOModel.m (-dealloc): Set entities model to nil.
* EOAccess/EOEntityPriv.h: Add functions for maintining list of
relationships and their destination entities.
* EOAccess/EOEntity.m: Implement new functions.
(-dealloc:): Set attributes entities, and relationships source and
destinations entities to nil.
(+initialize:): Initialize static map table.
* EOAccess/EORelationship.m: Call functions to maintain destination
entities.
2006-10-22 Matt Rice <ratmice@yahoo.com>

View file

@ -86,6 +86,57 @@ RCS_ID("$Id$")
#include "EOPrivate.h"
#include "EOEntityPriv.h"
#include "EOAttributePriv.h"
#include "../EOControl/EOPrivate.h"
static NSMapTable *_destinationEntitiesRelationshipMap;
void GDL2DestinationEntitiesAddRelationship(EOEntity *entity, EORelationship *relationship);
void GDL2DestinationEntitiesRemoveRelationship(EOEntity *entity, EORelationship *relationship);
static void GDL2DestinationEntitiesRemoveEntity(EOEntity *entity)
{
GDL2NonRetainingMutableArray *rels;
rels = NSMapGet(_destinationEntitiesRelationshipMap, entity);
if (rels)
{
[rels makeObjectsPerformSelector:@selector(_joinsChanged)];
}
NSMapRemove(_destinationEntitiesRelationshipMap, entity);
}
void GDL2DestinationEntitiesAddRelationship(EOEntity *entity, EORelationship *relationship)
{
GDL2NonRetainingMutableArray *rels;
if (!entity) return;
rels = NSMapGet(_destinationEntitiesRelationshipMap, entity);
if (!rels)
{
rels = [[GDL2NonRetainingMutableArray alloc] init];
NSMapInsert(_destinationEntitiesRelationshipMap, entity, rels);
RELEASE(rels);
}
[rels addObject:relationship];
}
void GDL2DestinationEntitiesRemoveRelationship(EOEntity *entity, EORelationship *relationship)
{
GDL2NonRetainingMutableArray *rels;
if (!entity) return;
rels = NSMapGet(_destinationEntitiesRelationshipMap, entity);
[rels removeObject:relationship];
if ([rels count] == 0)
{
NSMapRemove(_destinationEntitiesRelationshipMap, entity);
}
}
@interface EOModel (Privat)
- (void)_updateCache;
@ -106,7 +157,9 @@ NSString *EONextPrimaryKeyProcedureOperation = @"EONextPrimaryKeyProcedureOperat
if (!initialized)
{
initialized=YES;
_destinationEntitiesRelationshipMap =
NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks,
NSObjectMapValueCallBacks, 0);
GDL2_EOAccessPrivateInit();
};
};
@ -521,6 +574,13 @@ NSString *EONextPrimaryKeyProcedureOperation = @"EONextPrimaryKeyProcedureOperat
- (void) dealloc
{
[_attributes makeObjectsPerform:@selector(setParent:) withObject:nil];
[_relationships makeObjectsPerform:@selector(setEntity:) withObject:nil];
// this must come after _attributes is cleared.
GDL2DestinationEntitiesRemoveEntity(self);
DESTROY(_relationshipsByName);
DESTROY(_relationships);
DESTROY(_attributes);
DESTROY(_name);
DESTROY(_className);

View file

@ -34,6 +34,8 @@
@class EOExpressionArray;
@class EOSQLExpression;
GDL2ACCESS_EXPORT void GDL2DestinationEntitiesAddRelationship(EOEntity *entity, EORelationship *relationship);
GDL2ACCESS_EXPORT void GDL2DestinationEntitiesRemoveRelationship(EOEntity *entity, EORelationship *relationship);
@interface EOEntity (EOEntityPrivate)

View file

@ -248,7 +248,8 @@ NSString *EOEntityLoadedNotification = @"EOEntityLoadedNotification";
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];
[[self entities] makeObjectsPerformSelector:@selector(_setModel:)
withObject:nil];
if (_entitiesByClass)
{
NSFreeMapTable(_entitiesByClass);

View file

@ -154,6 +154,9 @@ RCS_ID("$Id$")
if (destinationEntityName) //If not, this is because it's a definition
{
destinationEntity = [model entityNamed: destinationEntityName];
GDL2DestinationEntitiesRemoveRelationship(_destination, self);
GDL2DestinationEntitiesAddRelationship(destinationEntity, self);
_destination = destinationEntity;
}
@ -1264,6 +1267,7 @@ relationships. Nil if none" **/
EOFLOGObjectLevelArgs(@"EORelationship", @"_definitionArray=%@", _definitionArray);
EOFLOGObjectLevelArgs(@"EORelationship", @"[self definition]=%@", [self definition]);
GDL2DestinationEntitiesRemoveRelationship(_destination, self);
_destination = nil;
{
@ -2370,6 +2374,8 @@ dst entity primaryKeyAttributeNames
EOAttribute *destinationAttribute = [join destinationAttribute];
EOEntity *destinationEntity = [destinationAttribute entity];
GDL2DestinationEntitiesRemoveRelationship(_destination, self);
GDL2DestinationEntitiesAddRelationship(destinationEntity, self);
_destination = destinationEntity;
}
}