NSAtomicStore.m
1 #import "NSManagedObject-Private.h" 2 #import "NSManagedObjectID-Private.h" 3 #import <CoreData/NSAtomicStore.h> 4 #import <CoreData/NSAtomicStoreCacheNode.h> 5 #import <CoreData/NSManagedObject.h> 6 #import <Foundation/NSMutableDictionary.h> 7 #import <Foundation/NSMutableSet.h> 8 #import <Foundation/NSRaise.h> 9 10 @implementation NSAtomicStore 11 12 - initWithPersistentStoreCoordinator: 13 (NSPersistentStoreCoordinator *) coordinator 14 configurationName: (NSString *) configurationName 15 URL: (NSURL *) url 16 options: (NSDictionary *) options 17 { 18 if ([super initWithPersistentStoreCoordinator: coordinator 19 configurationName: configurationName 20 URL: url 21 options: options] == nil) 22 return nil; 23 24 _metadata = [[NSDictionary alloc] init]; 25 _cacheNodes = [[NSMutableSet alloc] init]; 26 _objectIDToCacheNode = [[NSMutableDictionary alloc] init]; 27 _objectIDTable = [[NSMutableDictionary alloc] init]; 28 return self; 29 } 30 31 - (void) dealloc { 32 [_metadata release]; 33 [_cacheNodes release]; 34 [_objectIDToCacheNode release]; 35 [_objectIDTable release]; 36 [super dealloc]; 37 } 38 39 - (NSSet *) cacheNodes { 40 return _cacheNodes; 41 } 42 43 - (NSDictionary *) metadata { 44 return _metadata; 45 } 46 47 - (void) setMetadata: (NSDictionary *) value { 48 value = [value copy]; 49 [_metadata release]; 50 _metadata = value; 51 } 52 53 - (void) addCacheNodes: (NSSet *) values { 54 for (NSAtomicStoreCacheNode *node in values) { 55 56 [_objectIDToCacheNode setObject: node forKey: [node objectID]]; 57 } 58 [_cacheNodes unionSet: values]; 59 } 60 61 - (NSAtomicStoreCacheNode *) cacheNodeForObjectID: 62 (NSManagedObjectID *) objectID 63 { 64 NSAtomicStoreCacheNode *result = 65 [_objectIDToCacheNode objectForKey: objectID]; 66 67 return result; 68 } 69 70 - (NSAtomicStoreCacheNode *) newCacheNodeForManagedObject: 71 (NSManagedObject *) managedObject 72 { 73 return [[NSAtomicStoreCacheNode alloc] 74 initWithObjectID: [managedObject objectID]]; 75 } 76 77 - (NSManagedObjectID *) objectIDForEntity: (NSEntityDescription *) entity 78 referenceObject: referenceObject 79 { 80 NSMutableDictionary *refTable = 81 [_objectIDTable objectForKey: [entity name]]; 82 83 if (refTable == nil) { 84 refTable = [NSMutableDictionary dictionary]; 85 [_objectIDTable setObject: refTable forKey: [entity name]]; 86 } 87 88 NSManagedObjectID *result = [refTable objectForKey: referenceObject]; 89 90 if (result == nil) { 91 result = [[[NSManagedObjectID alloc] initWithEntity: entity] 92 autorelease]; 93 94 [result setReferenceObject: referenceObject]; 95 [result setStoreIdentifier: [self identifier]]; 96 [result setPersistentStore: self]; 97 98 [refTable setObject: result forKey: referenceObject]; 99 } 100 101 return result; 102 } 103 104 - (void) _uniqueObjectID: (NSManagedObjectID *) objectID { 105 NSEntityDescription *entity = [objectID entity]; 106 NSMutableDictionary *refTable = 107 [_objectIDTable objectForKey: [entity name]]; 108 109 if (refTable == nil) { 110 refTable = [NSMutableDictionary dictionary]; 111 [_objectIDTable setObject: refTable forKey: [entity name]]; 112 } 113 114 id referenceObject = [objectID referenceObject]; 115 116 [refTable setObject: objectID forKey: referenceObject]; 117 } 118 119 - referenceObjectForObjectID: (NSManagedObjectID *) objectID { 120 return [objectID referenceObject]; 121 } 122 123 - (void) willRemoveCacheNodes: (NSSet *) cacheNodes { 124 } 125 126 - newReferenceObjectForManagedObject: (NSManagedObject *) managedObject { 127 NSInvalidAbstractInvocation(); 128 return 0; 129 } 130 131 - (void) updateCacheNode: (NSAtomicStoreCacheNode *) node 132 fromManagedObject: (NSManagedObject *) managedObject 133 { 134 NSInvalidAbstractInvocation(); 135 } 136 137 - (BOOL) load: (NSError **) error { 138 NSInvalidAbstractInvocation(); 139 return 0; 140 } 141 142 - (BOOL) save: (NSError **) error { 143 NSInvalidAbstractInvocation(); 144 return 0; 145 } 146 147 @end