25 #import "CoreDataHeaders.h"
26 #import "GSPersistentStore.h"
27 #import "GSSQLitePersistentStore.h"
30 *
const NSSQLiteStoreType =
@"NSSQLiteStoreType",
31 *
const NSXMLStoreType =
@"NSXMLStoreType",
32 *
const NSBinaryStoreType =
@"NSBinaryStoreType",
33 *
const NSInMemoryStoreType =
@"NSInMemoryStoreType";
36 *
const NSReadOnlyPersistentStoreOption =
@"NSReadOnlyPersistentStoreOption",
37 *
const NSValidateXMLStoreOption =
@"NSValidateXMLStoreOption";
40 *
const NSStoreTypeKey =
@"NSStoreTypeKey",
41 *
const NSStoreUUIDKey =
@"NSStoreUUIDKey";
43 @implementation NSPersistentStoreCoordinator
52 static NSMutableDictionary * persistentStoreTypes = nil;
57 if (persistentStoreTypes == nil)
59 persistentStoreTypes = [[NSMutableDictionary alloc]
60 initWithObjectsAndKeys:
61 NSSQLiteStoreType, [GSSQLitePersistentStore class],
70 + (void) addPersistentStoreType: (NSString *) type
71 handledByClass: (Class) newClass
77 [NSException raise: NSInvalidArgumentException
78 format: _(@"When adding a new store type, you must "
79 @"do so by subclassing GSPersistentStore "
80 @"and implementing it's abstract methods."),
81 [newClass className]];
85 oldClass = [persistentStoreTypes objectForKey: type];
86 if (oldClass != nil && oldClass != newClass)
88 NSLog(_(
@"WARNING: Replacing persistent store type %@, "
89 @"originally handled by class %@, with class %@."),
90 type, [oldClass className], [newClass className]);
93 [persistentStoreTypes setObject: newClass forKey: type];
96 + (NSArray *) supportedPersistentStoreTypes
98 return [persistentStoreTypes allKeys];
105 [_model _decrementUseCount];
107 TEST_RELEASE(_model);
109 TEST_RELEASE(_persistentStores);
115 - (id) initWithManagedObjectModel: (NSManagedObjectModel *) model
117 if ((
self = [
self init]))
119 ASSIGN(_model, model);
121 _persistentStores = [NSMutableDictionary new];
122 _lock = [NSRecursiveLock new];
128 - (NSManagedObjectModel *) managedObjectModel
133 - (id) addPersistentStoreWithType: (NSString *) storeType
134 configuration: (NSString *) configuration
136 options: (NSDictionary *) options
137 error: (NSError **) error
142 storeClass = [persistentStoreTypes objectForKey: storeType];
143 if (storeClass == Nil)
145 SetNonNullError(error, [NSError
146 errorWithDomain: NSCoreDataErrorDomain
147 code: NSPersistentStoreInvalidTypeError
154 if (_configurationSet == NO)
156 _multipleConfigurationsAllowed = (configuration != nil);
157 _configurationSet = YES;
159 else if (_multipleConfigurationsAllowed == NO && configuration != nil)
161 SetNonNullError(error, [NSError
162 errorWithDomain: NSCoreDataErrorDomain
163 code: NSPersistentStoreIncompatibleSchemaError
169 store = [[[storeClass alloc]
171 managedObjectModel: _model
172 configuration: configuration
177 SetNonNullError(error, [NSError
178 errorWithDomain: NSCoreDataErrorDomain
179 code: NSPersistentStoreInitializationError
185 [_persistentStores setObject: store forKey: aURL];
190 - (BOOL) removePersistentStore: (
id) persistentStore
191 error: (NSError **) error
196 [_persistentStores removeObjectForKey: [store
URL]];
201 - (NSArray *) persistentStores
203 return [_persistentStores allValues];
206 - (id) persistentStoreForURL: (NSURL *) aURL
208 return [_persistentStores objectForKey: aURL];
211 - (NSURL *) URLForPersistentStore: (
id) persistentStore
213 return [persistentStore URL];
223 return [_lock tryLock];
231 - (NSDictionary *) metadataForPersistentStore: (
id) store
233 return [store metadata];
240 unsigned long long uuid, idValue;
241 NSString * entityName;
242 NSEntityDescription * entity;
244 NSArray * pathComponents;
246 pathComponents = [[uri path] pathComponents];
247 if ([pathComponents count] != 3)
253 UUID = [pathComponents objectAtIndex: 0];
254 e = [[_persistentStores allValues] objectEnumerator];
255 while ((store = [e nextObject]) != nil)
257 if ([[[store metadata] objectForKey: NSStoreUUIDKey] isEqual: UUID])
269 entityName = [pathComponents objectAtIndex: 1];
270 if ([store configuration] == nil)
272 entity = [[_model entitiesByName] objectForKey: entityName];
276 entity = [[_model _entitiesByNameForConfiguration: [store
configuration]]
277 objectForKey: entityName];
286 if (sscanf([[pathComponents objectAtIndex: 2] cString],
"%llX",
294 _initWithEntity: entity
295 persistentStore: store
Nn abstract superclass from which concrete implementations of various persistent store types are subc...
NSURL * URL()
Getting the store's URL.
NSString * configuration()
Getting the store's configuration.
For implementation notes see "Documentation/NSManagedObjectID.txt" in the source distribution of the ...