/ CoreData / NSAtomicStore.m
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