* EOAccess/EODatabase.[hm]

add -forgetSnapshotForSourceGlobalID:relationshipName:
* EOAccess/EODatabaseContext.[hm]
  add -forgetSnapshotForSourceGlobalID:relationshipName:
  add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
  add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext:
  add -_turnToArrayFault:sourceGID:relationshipName:editingContext:isComplete:
* EOControl/EOCustomObject.m
  fix -validateValue:forKey:
  fix -validateValue:forKey:error:
  fix -addObject:toPropertyWithKey:
  fix -removeObject:object fromPropertyWithKey: 
* EOControl/EOEditingContext.[hm]
  add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
* EOControl/EONSAddOns.[hm]
  add -performSelector:withPointer:
* EOControl/EOObjectStore.[hm]
  add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
  add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext:
* EOControl/EOObjectStoreCoordinator.m
  add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
  add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext:


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@38006 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Manuel Guesdon 2014-07-24 21:09:40 +00:00
parent 3425fb640b
commit 339febaebc
13 changed files with 296 additions and 6 deletions

View file

@ -1,3 +1,26 @@
2014-07-24 Manuel Guesdon <mguesdon@orange-concept.com>
* EOAccess/EODatabase.[hm]
add -forgetSnapshotForSourceGlobalID:relationshipName:
* EOAccess/EODatabaseContext.[hm]
add -forgetSnapshotForSourceGlobalID:relationshipName:
add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext:
add -_turnToArrayFault:sourceGID:relationshipName:editingContext:isComplete:
* EOControl/EOCustomObject.m
fix -validateValue:forKey:
fix -validateValue:forKey:error:
fix -addObject:toPropertyWithKey:
fix -removeObject:object fromPropertyWithKey:
* EOControl/EOEditingContext.[hm]
add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
* EOControl/EONSAddOns.[hm]
add -performSelector:withPointer:
* EOControl/EOObjectStore.[hm]
add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext:
* EOControl/EOObjectStoreCoordinator.m
add -refaultObject:withSourceGlobalID:relationshipName:editingContext:
add -clearOriginalSnapshotForObject:sourceGlobalID:relationshipName:editingContext:
2014-06-03 Manuel Guesdon <mguesdon@orange-concept.com>
* EOAccess/EOAccessFault.m
remove empty init methods

View file

@ -122,6 +122,9 @@ GDL2ACCESS_EXPORT NSTimeInterval EODistantPastTimeInterval;
- (void)forgetSnapshotsForGlobalIDs: (NSArray *)gids;
- (void) forgetSnapshotForSourceGlobalID:(EOGlobalID *)gid
relationshipName: (NSString *)name;
- (void)forgetAllSnapshots;
- (void)recordSnapshots: (NSDictionary *)snapshots;

View file

@ -603,6 +603,22 @@ static NSMutableArray *databaseInstances;
}
//GDL2 addition: enable refaulting object to-many property
- (void) forgetSnapshotForSourceGlobalID:(EOGlobalID *)gid
relationshipName: (NSString *)name
{
NSMutableDictionary *toMany = nil;
NSAssert(gid,@"No Source Global ID");
NSAssert(name,@"No relationship name");
toMany = [_toManySnapshots objectForKey: gid];
if (toMany)
[toMany removeObjectForKey: name];
}
- (void)forgetAllSnapshots
{
NSMutableSet *gidSet = [NSMutableSet new];

View file

@ -201,6 +201,15 @@ struct _EOTransactionScope;
- (NSArray *)objectsForSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context;
- (void) forgetSnapshotForSourceGlobalID: (EOGlobalID*)globalID
relationshipName: (NSString *)name;
- (void) clearOriginalSnapshotForObject: (NSArray*)object
sourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context;
- (void)_registerSnapshot: (NSArray *)snapshot
forSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
@ -210,6 +219,16 @@ struct _EOTransactionScope;
withGlobalID: (EOGlobalID *)globalID
editingContext: (EOEditingContext *)context;
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context;
- (void) clearOriginalSnapshotForObject: (NSArray*)object
sourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context;
- (void)saveChangesInEditingContext: (EOEditingContext *)context;
- (NSArray *)objectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification

View file

@ -752,6 +752,54 @@ May raise an exception if transaction has began or if you want pessimistic lock
//TODO: use isComplete
}
//GDL2 addition: enable refaulting object to-many property
- (void) _turnToArrayFault: (NSArray*)object
sourceGID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context
isComplete: (BOOL)isComplete
{
//OK
EOAccessArrayFaultHandler *handler=nil;
NSDebugMLLog(@"EODatabaseContext", @"object=%p", object);
NSDebugMLLog(@"EODatabaseContext", @"globalID=%@", globalID);
NSAssert(globalID, @"No globalID");
NSAssert1([globalID isKindOfClass: [EOKeyGlobalID class]],
@"globalID is not a EOKeyGlobalID but a %@",
[globalID class]);
if ([(EOKeyGlobalID*)globalID areKeysAllNulls])
NSWarnLog(@"All key of globalID %p (%@) are nulls",
globalID,
globalID);
handler = [EOAccessArrayFaultHandler
accessArrayFaultHandlerWithSourceGlobalID:(EOKeyGlobalID*)globalID
relationshipName: relName
databaseContext: self
editingContext: context];
NSDebugMLLog(@"EODatabaseContext", @"handler=%@", handler);
NSDebugMLLog(@"EODatabaseContext", @"object->class_pointer=%p",
GSObjCClass(object));
[EOFault makeObjectIntoFault: object
withHandler: handler];
NSDebugMLLog(@"EODatabaseContext", @"object->class_pointer=%p",
GSObjCClass(object));
[self _addToManyBatchForSourceGlobalID: (EOKeyGlobalID *)globalID
relationshipName: relName
fault: (EOFault*)object];
//TODO: use isComplete
}
/** Get a fault for 'globalID' **/
//MG2014: OK
- (id)faultForGlobalID: (EOGlobalID *)globalID
@ -1173,6 +1221,25 @@ May raise an exception if transaction has began or if you want pessimistic lock
return objects;
}
//GDL2 addition: enable refaulting object to-many property
- (void) forgetSnapshotForSourceGlobalID: (EOGlobalID*)globalID
relationshipName: (NSString *)name
{
[_database forgetSnapshotForSourceGlobalID:globalID
relationshipName:name];
}
//GDL2 addition: enable refaulting object to-many property
- (void) clearOriginalSnapshotForObject: (NSArray*)object
sourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context
{
[_database forgetSnapshotForSourceGlobalID:globalID
relationshipName:name];
}
- (void)_registerSnapshot: (NSArray*)snapshot
forSourceGlobalID: (EOGlobalID*)globalID
relationshipName: (NSString*)name
@ -1232,6 +1299,43 @@ May raise an exception if transaction has began or if you want pessimistic lock
}
//GDL2 addition: enable refaulting object to-many property
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context
{
[EOObserverCenter suppressObserverNotification];
NS_DURING
{
NSAssert1(!object || [object isKindOfClass:[NSMutableArray class]],@"Not a mutable array %p",object);
[(NSMutableArray*)object removeAllObjects];//OK
}
NS_HANDLER
{
[EOObserverCenter enableObserverNotification];
[localException raise];
}
NS_ENDHANDLER;
[EOObserverCenter enableObserverNotification];
if ([(EOKeyGlobalID *)globalID areKeysAllNulls])
NSWarnLog(@"All key of globalID %p (%@) are nulls",
globalID,
globalID);
[self _turnToArrayFault:object
sourceGID:globalID
relationshipName: relName
editingContext: context
isComplete: YES]; //Why YES ?
[self forgetSnapshotForSourceGlobalID:globalID
relationshipName:relName];
}
- (void)saveChangesInEditingContext: (EOEditingContext *)context
{
//TODO: locks ?

View file

@ -50,6 +50,7 @@
#include "EOCustomObject.h"
#include "EOPrivate.h"
#include "EONSAddOns.h"
@implementation EOCustomObject
@ -222,12 +223,12 @@
{
SEL validateSelector;
NSUInteger length = [key length];
char buf[length + 10];
char buf[length + 10]; //validate + key + : + \0
strcpy(buf, "validate");
[key getCString:&buf[8]
maxLength:length
maxLength:length+1 //maxLength is total buffer size (See NSString.m comment)
encoding:NSASCIIStringEncoding];
buf[8] = toupper((int)buf[8]);
@ -238,7 +239,7 @@
if (validateSelector && [self respondsToSelector: validateSelector])
{
exception = [self performSelector: validateSelector
withObject: *valueP];
withPointer: valueP];
}
}
}
@ -260,7 +261,7 @@
NSDictionary * uInfo;
uInfo = [NSDictionary dictionaryWithObjectsAndKeys:
(*value ? *value : (id)@"nil"), @"EOValidatedObjectUserInfoKey",
self, @"EOValidatedObjectUserInfoKey",
key, @"EOValidatedPropertyUserInfoKey",
[ex reason], NSLocalizedDescriptionKey,
nil];
@ -444,7 +445,7 @@
strcpy(buf, "addTo");
[key getCString:&buf[5]
maxLength:size
maxLength:size+1 //maxLength is total buffer size (See NSString.m comment)
encoding:NSASCIIStringEncoding];
buf[5] = toupper(buf[5]);
@ -520,7 +521,7 @@
strcpy(buf, "removeFrom");
[key getCString:&buf[10]
maxLength:size
maxLength:size+1 //maxLength is total buffer size (See NSString.m comment)
encoding:NSASCIIStringEncoding];
buf[10] = toupper(buf[10]);

View file

@ -238,6 +238,11 @@ modified state of the object.**/
withGlobalID: (EOGlobalID *)globalID
editingContext: (EOEditingContext *)context;
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context;
- (void)saveChangesInEditingContext: (EOEditingContext *)context;
- (NSArray *)objectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification

View file

@ -3573,6 +3573,46 @@ modified state of the object.**/
}
}
//GDL2 addition: enable refaulting object to-many property
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)relName
editingContext: (EOEditingContext *)context
{
//Near OK
if (object && [EOFault isFault: object] == NO)
{
//call globalID isTemporary //ret NO
if (self == context)//??
{
//NO: in EODatabaseConetxt [object clearProperties];
if (NSMapGet(_objectsByGID, globalID) == nil
&& _sharedContext
&& [_sharedContext objectForGlobalID: globalID])
{
[NSException raise: NSInvalidArgumentException
format: @"Attempt to initialize object contained in EOSharedEditingContext"];
}
//OK
[_objectStore refaultObject: object
withSourceGlobalID: globalID
relationshipName: relName
editingContext: context];
//OK
[_objectStore clearOriginalSnapshotForObject: object
sourceGlobalID: globalID
relationshipName: relName
editingContext: context];
}
else
{
[self notImplemented: _cmd];
}
}
}
- (void)saveChangesInEditingContext: (EOEditingContext *)context
{
if (context != self)

View file

@ -119,6 +119,10 @@ returnsRemovedValues:(NSArray**)removedValues
@end
@interface NSObject (PerformSelect3)
- (id) performSelector: (SEL)selector
withPointer: (void*) ptr;
/**
* Causes the receiver to execute the method implementation corresponding
* to selector and returns the result.<br />

View file

@ -720,6 +720,27 @@ returnsRemovedValues:(NSArray**)removedValues
@end
@implementation NSObject (PerformSelect3)
- (id) performSelector: (SEL)selector
withPointer: (void*) ptr
{
IMP msg;
if (selector == 0)
[NSException raise: NSInvalidArgumentException
format: @"%@ null selector given", NSStringFromSelector(_cmd)];
msg = class_getMethodImplementation([self class], selector);
if (!msg)
{
[NSException raise: NSGenericException
format: @"invalid selector passed to %s", sel_getName(_cmd)];
return nil;
}
return (*msg)(self, selector, ptr);
}
//Ayers: Review (Do we really need this?)
/**
* Causes the receiver to execute the method implementation corresponding

View file

@ -69,6 +69,16 @@
withGlobalID: (EOGlobalID *)globalID
editingContext: (EOEditingContext *)context;
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context;
- (void) clearOriginalSnapshotForObject: (NSArray*)object
sourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context;
- (void)saveChangesInEditingContext: (EOEditingContext *)context;
- (NSArray *)objectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification

View file

@ -103,6 +103,24 @@ NSString *EOUpdatedKey = @"updated";
[self subclassResponsibility: _cmd];
}
//GDL2 addition: enable refaulting object to-many property
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context
{
[self subclassResponsibility: _cmd];
}
//GDL2 addition: enable refaulting object to-many property
- (void) clearOriginalSnapshotForObject: (NSArray*)object
sourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context
{
[self subclassResponsibility: _cmd];
}
- (void)saveChangesInEditingContext: (EOEditingContext *)context
{
[self subclassResponsibility: _cmd];

View file

@ -342,6 +342,32 @@ NSString *EOCooperatingObjectStoreNeeded = @"EOCooperatingObjectStoreNeeded";
editingContext: context];
}
//GDL2 addition: enable refaulting object to-many property
- (void)refaultObject: (NSArray*)object
withSourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString*)relName
editingContext: (EOEditingContext *)context
{
[[self objectStoreForGlobalID: globalID]
refaultObject: object
withSourceGlobalID: globalID
relationshipName: relName
editingContext: context];
}
//GDL2 addition: enable refaulting object to-many property
- (void) clearOriginalSnapshotForObject: (NSArray*)object
sourceGlobalID: (EOGlobalID *)globalID
relationshipName: (NSString *)name
editingContext: (EOEditingContext *)context
{
return [[self objectStoreForGlobalID: globalID]
clearOriginalSnapshotForObject: object
sourceGlobalID: globalID
relationshipName: name
editingContext: context];
}
- (void)initializeObject: (id)object
withGlobalID: (EOGlobalID *)globalID
editingContext: (EOEditingContext *)context