25 #import "CoreDataHeaders.h"
26 #import "GSPersistentStore.h"
31 #ifdef HAVE_NATIVE_OBJC_EXCEPTIONS
32 # define SUBCLASS_OVERRIDE_ERROR \
33 @throw [NSException exceptionWithName: NSInternalInconsistencyException \
34 reason: [NSString stringWithFormat: \
35 _(@"Subclass %@ didn't override `%@'."), [self className], \
36 NSStringFromSelector(_cmd)] \
39 # define SUBCLASS_OVERRIDE_ERROR \
40 [NSException raise: NSInternalInconsistencyException \
41 format: _(@"Subclass %@ didn't override `%@'."), \
42 [self className], NSStringFromSelector(_cmd)]
47 static NSRecursiveLock * randomizerLock = nil;
48 static struct drand48_data randomizerSetup;
51 #define STORE_UUID_SIZE (256 / 8)
60 GenerateNewRandomUUID (
void)
62 NSString * hexaValue =
@"";
65 [randomizerLock lock];
69 for (i = 0; i < (STORE_UUID_SIZE /
sizeof(
long int)); i++)
72 lrand48_r (&randomizerSetup, &result);
73 hexaValue = [NSString stringWithFormat: @"%@%X", hexaValue, result];
76 [randomizerLock unlock];
127 if (randomizerLock == nil)
130 randomizerLock = [NSRecursiveLock new];
133 srand48_r(time(NULL), &randomizerSetup);
140 TEST_RELEASE(_model);
141 TEST_RELEASE(_configuration);
142 TEST_RELEASE(_metadata);
143 TEST_RELEASE(_versionNumbers);
156 - initWithURL: (NSURL *) URL
157 managedObjectModel: (NSManagedObjectModel *) model
158 configuration: (NSString *) configuration
159 options: (NSDictionary *) options
164 ASSIGN(_model, model);
167 _metadata = [[NSDictionary alloc]
168 initWithObjectsAndKeys:
169 GenerateNewRandomUUID(), NSStoreUUIDKey,
170 [
self storeType], NSStoreTypeKey,
173 _versionNumbers = [NSMutableDictionary new];
200 return _configuration;
208 - (void) setUUID: (NSString *) UUID
212 metadata = [[_metadata mutableCopy] autorelease];
213 [metadata setObject: UUID
214 forKey: NSStoreUUIDKey];
215 ASSIGN(_metadata, [[
metadata copy] autorelease]);
225 - (void) setMetadata: (NSDictionary *) metadata
227 NSMutableDictionary * newMetadata = [[metadata mutableCopy] autorelease];
230 [newMetadata setObject: [_metadata objectForKey: NSStoreUUIDKey]
231 forKey: NSStoreUUIDKey];
232 [newMetadata setObject: [
self storeType] forKey: NSStoreTypeKey];
234 ASSIGN(_metadata, [[newMetadata copy] autorelease]);
248 - (BOOL) saveObjects: (NSSet *) objects
249 error: (NSError **) error
251 NSEnumerator * e = [objects objectEnumerator];
255 while ((managedObject = [e nextObject]) != nil)
257 if (![managedObject isFault])
259 unsigned long long version;
262 NSAssert([objectID persistentStore] ==
self, _(
@"Tried to store "
263 @"a managed object in a different persistent store than where "
266 version = [[_versionNumbers objectForKey: objectID]
267 unsignedLongLongValue];
270 setObject: [NSNumber numberWithUnsignedLongLong: version]
282 return [[_versionNumbers objectForKey: objectID] unsignedLongLongValue];
294 SUBCLASS_OVERRIDE_ERROR;
343 - (NSDictionary *) fetchObjectsWithEntity: (NSEntityDescription *) entity
344 predicate: (NSPredicate *) predicate
345 error: (NSError **) error
347 SUBCLASS_OVERRIDE_ERROR;
368 fetchProperties: (NSSet *) properties
369 error: (NSError **) error
371 SUBCLASS_OVERRIDE_ERROR;
406 - (BOOL) writeSavingObjects: (NSSet *) objectsToWrite
407 deletingObjects: (NSSet *) objectIDsToDelete
408 error: (NSError **) error
410 SUBCLASS_OVERRIDE_ERROR;
Nn abstract superclass from which concrete implementations of various persistent store types are subc...
NSDictionary * metadata()
Returns the store's metadata.
NSURL * URL()
Getting the store's URL.
NSString * storeType()
Subclasses must override this to return the store's type as a string.
NSString * configuration()
Getting the store's configuration.
For implementation notes see "Documentation/NSManagedObjectID.txt" in the source distribution of the ...
Validates whether value'' is a valid value forattribute'', returning YES if it is,...
NSManagedObjectID * objectID()
Returns the object ID of the receiver.