Changeset 840
- Timestamp:
- 05/11/09 16:51:19 (16 months ago)
- Location:
- branches/CoreData/SapphireFrappliance
- Files:
-
- 10 modified
-
MetaData/SapphireMObjects/SapphireCast.m (modified) (3 diffs)
-
MetaData/SapphireMObjects/SapphireDirector.m (modified) (2 diffs)
-
MetaData/SapphireMObjects/SapphireEpisode.m (modified) (2 diffs)
-
MetaData/SapphireMObjects/SapphireGenre.m (modified) (2 diffs)
-
MetaData/SapphireMObjects/SapphireMovie.m (modified) (13 diffs)
-
MetaData/SapphireMObjects/SapphireSeason.m (modified) (2 diffs)
-
MetaData/SapphireMObjects/SapphireTVShow.m (modified) (1 diff)
-
MetaData/Support/SapphireMetaDataSupport.h (modified) (1 diff)
-
MetaData/Support/SapphireMetaDataSupport.m (modified) (5 diffs)
-
main_debug.m (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireCast.m
r739 r840 3 3 #import "CoreDataSupportFunctions.h" 4 4 #import "SapphireFileSorter.h" 5 #import "SapphireMetaDataSupport.h" 5 6 6 7 @implementation SapphireCast … … 64 65 } 65 66 66 - (void) removeMoviesObject:(SapphireMovie*)value_67 - (void)checkMajorRole 67 68 { 68 [super removeMoviesObject:value_];69 69 BOOL currentMajorRole = self.hasMajorRoleValue; 70 70 BOOL majorRole = NO; … … 83 83 } 84 84 85 - (BOOL)shouldDelete 86 { 87 return [self.moviesSet count] == 0; 88 } 89 90 -(void)removeMovies:(NSSet*)removedMovies 91 { 92 [super removeMovies:removedMovies]; 93 if([self.moviesSet count] == 0) 94 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 95 else 96 [self checkMajorRole]; 97 } 98 99 - (void)removeMoviesObject:(SapphireMovie *)removedMovie 100 { 101 [super removeMoviesObject:removedMovie]; 102 if([self.moviesSet count] == 0) 103 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 104 else 105 [self checkMajorRole]; 106 } 107 85 108 @end -
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireDirector.m
r739 r840 2 2 #import "CoreDataSupportFunctions.h" 3 3 #import "SapphireFileSorter.h" 4 #import "SapphireMetaDataSupport.h" 4 5 5 6 @implementation SapphireDirector … … 62 63 } 63 64 65 - (BOOL)shouldDelete 66 { 67 return [self.moviesSet count] == 0; 68 } 69 70 -(void)removeMovies:(NSSet*)removedMovies 71 { 72 [super removeMovies:removedMovies]; 73 if([self.moviesSet count] == 0) 74 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 75 } 76 77 - (void)removeMoviesObject:(SapphireMovie *)removedMovie 78 { 79 [super removeMoviesObject:removedMovie]; 80 if([self.moviesSet count] == 0) 81 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 82 } 83 64 84 @end -
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireEpisode.m
r836 r840 342 342 } 343 343 344 - (BOOL)shouldDelete 345 { 346 return [self.filesSet count] == 0; 347 } 348 344 349 -(void)removeFiles:(NSSet*)removeFiles 345 350 { 346 351 [super removeFiles:removeFiles]; 347 [self clearPredicateCache]; 352 if([self.filesSet count] == 0) 353 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 354 else 355 [self clearPredicateCache]; 348 356 } 349 357 … … 357 365 { 358 366 [super removeFilesObject:removeFile]; 359 [self clearPredicateCache]; 367 if([self.filesSet count] == 0) 368 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 369 else 370 [self clearPredicateCache]; 360 371 } 361 372 -
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireGenre.m
r739 r840 3 3 #import "SapphireFileSorter.h" 4 4 #import "SapphireMovie.h" 5 #import "SapphireMetaDataSupport.h" 5 6 6 7 @implementation SapphireGenre … … 63 64 } 64 65 66 - (BOOL)shouldDelete 67 { 68 return [self.moviesSet count] == 0; 69 } 70 71 -(void)removeMovies:(NSSet*)removedMovies 72 { 73 [super removeMovies:removedMovies]; 74 if([self.moviesSet count] == 0) 75 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 76 } 77 78 - (void)removeMoviesObject:(SapphireMovie *)removedMovie 79 { 80 [super removeMoviesObject:removedMovie]; 81 if([self.moviesSet count] == 0) 82 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 83 } 84 65 85 @end -
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireMovie.m
r836 r840 271 271 while((name = [nameEnum nextObject]) != nil) 272 272 { 273 SapphireCast *aCast = [SapphireCast c ast:name inContext:moc];273 SapphireCast *aCast = [SapphireCast createCast:name inContext:moc]; 274 274 if(aCast != nil) 275 275 [mutRet addObject:aCast]; … … 290 290 NSArray *arc = [ordered valueForKey:@"name"]; 291 291 [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_CAST_DATA]; 292 [self .castSet setSet:[NSSet setWithArray:ordered]];292 [self setValue:[NSSet setWithArray:ordered] forKey:@"cast"]; 293 293 int i, count=[ordered count]; 294 294 if(count > 10) … … 319 319 while((genre = [genreEnum nextObject]) != nil) 320 320 { 321 SapphireGenre *aGenre = [SapphireGenre genre:genre inContext:moc];321 SapphireGenre *aGenre = [SapphireGenre createGenre:genre inContext:moc]; 322 322 if(aGenre != nil) 323 323 [mutRet addObject:aGenre]; … … 338 338 NSArray *arc = [ordered valueForKey:@"name"]; 339 339 [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_GENRES_DATA]; 340 [self .genresSet addObjectsFromArray:ordered];340 [self setValue:[NSSet setWithArray:ordered] forKey:@"genres"]; 341 341 } 342 342 … … 360 360 while((name = [nameEnum nextObject]) != nil) 361 361 { 362 SapphireDirector *aDir = [SapphireDirector director:name inContext:moc];362 SapphireDirector *aDir = [SapphireDirector createDirector:name inContext:moc]; 363 363 if(aDir != nil) 364 364 [mutRet addObject:aDir]; … … 379 379 NSArray *arc = [ordered valueForKey:@"name"]; 380 380 [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_DIRECTOR_DATA]; 381 [self .directorsSet addObjectsFromArray:ordered];381 [self setValue:[NSSet setWithArray:ordered] forKey:@"directors"]; 382 382 } 383 383 … … 402 402 } 403 403 [self setPrimitiveValue:nil forKey:ORDERED_CAST_KEY]; 404 [self .castSet setSet:[NSSet setWithArray:self.orderedCast]];404 [self setValue:[NSSet setWithArray:self.orderedCast] forKey:@"cast"]; 405 405 } 406 406 … … 417 417 } 418 418 [self setPrimitiveValue:nil forKey:ORDERED_GENRES_KEY]; 419 [self .genresSet setSet:[NSSet setWithArray:self.orderedGenres]];419 [self setValue:[NSSet setWithArray:self.orderedGenres] forKey:@"genres"]; 420 420 } 421 421 … … 432 432 } 433 433 [self setPrimitiveValue:nil forKey:ORDERED_DIRECTOR_KEY]; 434 [self .directorsSet setSet:[NSSet setWithArray:self.orderedDirectors]];434 [self setValue:[NSSet setWithArray:self.orderedDirectors] forKey:@"directors"]; 435 435 } 436 436 … … 451 451 { 452 452 [super removeXml:removedXMLs]; 453 [self checkXMLOverridenSets]; 453 //This can occur during a delete propogation, which appears to have KVO completely broken; workaround 454 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 454 455 } 455 456 … … 463 464 { 464 465 [super removeXmlObject:removedXML]; 465 [self checkXMLOverridenSets]; 466 //This can occur during a delete propogation, which appears to have KVO completely broken; workaround 467 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 466 468 } 467 469 … … 575 577 } 576 578 579 - (BOOL)shouldDelete 580 { 581 if([self.filesSet count] == 0) 582 return YES; 583 584 [self checkXMLOverridenSets]; 585 return NO; 586 } 587 577 588 -(void)removeFiles:(NSSet*)removeFiles 578 589 { 579 590 [super removeFiles:removeFiles]; 580 [self clearPredicateCache]; 591 if([self.filesSet count] == 0) 592 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 593 else 594 [self clearPredicateCache]; 581 595 } 582 596 … … 590 604 { 591 605 [super removeFilesObject:removeFile]; 592 [self clearPredicateCache]; 606 if([self.filesSet count] == 0) 607 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 608 else 609 [self clearPredicateCache]; 593 610 } 594 611 -
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireSeason.m
r734 r840 2 2 #import "SapphireTVShow.h" 3 3 #import "SapphireFileSorter.h" 4 #import "SapphireMetaDataSupport.h" 4 5 5 6 @implementation SapphireSeason … … 82 83 } 83 84 85 - (BOOL)shouldDelete 86 { 87 return [self.episodesSet count] == 0; 88 } 89 90 -(void)removeEpisodes:(NSSet*)removedEpisodes 91 { 92 [super removeEpisodes:removedEpisodes]; 93 if([self.episodesSet count] == 0) 94 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 95 } 96 97 - (void)removeEpisodesObject:(SapphireEpisode*)removedEpisode 98 { 99 [super removeEpisodesObject:removedEpisode]; 100 if([self.episodesSet count] == 0) 101 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 102 } 103 84 104 @end -
branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireTVShow.m
r734 r840 128 128 } 129 129 130 - (BOOL)shouldDelete 131 { 132 return [self.episodesSet count] == 0; 133 } 134 135 -(void)removeEpisodes:(NSSet*)removedEpisodes 136 { 137 [super removeEpisodes:removedEpisodes]; 138 if([self.episodesSet count] == 0) 139 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 140 } 141 142 - (void)removeEpisodesObject:(SapphireEpisode*)removedEpisode 143 { 144 [super removeEpisodesObject:removedEpisode]; 145 if([self.episodesSet count] == 0) 146 [SapphireMetaDataSupport setObjectForPendingDelete:self]; 147 } 148 130 149 @end -
branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.h
r820 r840 44 44 */ 45 45 + (void)pruneMetaData:(NSManagedObjectContext *)moc; 46 47 /*! 48 * @brief Sets an object up for pending delete 49 * 50 * Any object added to this set will be first checked before delete. The check is calling selector 51 * shouldDelete and if returns YES, performs the delete, otherwise it is removed from set. 52 * 53 * @param objectToDelete The object to delete 54 */ 55 + (void)setObjectForPendingDelete:(NSManagedObject *)objectToDelete; 46 56 47 57 /*! -
branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.m
r839 r840 40 40 #import "SapphireSeason.h" 41 41 #import "CoreDataSupportFunctions.h" 42 43 @interface NSManagedObject (deleteDelegate) 44 - (BOOL)shouldDelete; 45 @end 46 42 47 43 48 @interface NSManagedObject (ChangePersistence) … … 140 145 141 146 static NSSet *coverArtExtentions = nil; 147 static NSMutableSet *pendingDeleteObjects = nil; 142 148 143 149 NSString *searchCoverArtExtForPath(NSString *path) … … 173 179 @"png", 174 180 @"gif", 175 nil]; 181 nil]; 182 pendingDeleteObjects = [[NSMutableSet alloc] init]; 176 183 } 177 184 … … 258 265 } 259 266 267 + (void)setObjectForPendingDelete:(NSManagedObject *)objectToDelete 268 { 269 [pendingDeleteObjects addObject:objectToDelete]; 270 } 271 272 /*! 273 * @brief Deletes pending objects 274 * 275 * Deletes all objects in the pending queue, but calls shouldDelete first to make sure it should 276 * be deleted. This is also used as a hack to work around CD apparent inability to make KVO 277 * notifications during an object delete when it is within an KVO notification. 278 */ 279 + (void)deletePendingObjects 280 { 281 NSManagedObjectContext *mainMoc = [SapphireMetaDataSupport sharedInstance]->mainMoc; 282 [mainMoc processPendingChanges]; 283 while([pendingDeleteObjects count]) 284 { 285 NSManagedObject *obj; 286 NSSet *pendingObjects = [pendingDeleteObjects copy]; 287 [pendingDeleteObjects removeAllObjects]; 288 NSEnumerator *objEnum = [pendingObjects objectEnumerator]; 289 while((obj = [objEnum nextObject]) != nil) 290 { 291 if([obj isDeleted]) 292 continue; 293 if([obj managedObjectContext] != mainMoc) 294 continue; 295 if(![obj respondsToSelector:@selector(shouldDelete)] || [obj shouldDelete]) 296 [mainMoc deleteObject:obj]; 297 } 298 [pendingObjects release]; 299 [mainMoc processPendingChanges]; 300 } 301 } 302 260 303 - (void)realWriteMetaData:(NSTimer *)timer 261 304 { … … 274 317 BOOL success = NO; 275 318 @try { 319 [SapphireMetaDataSupport deletePendingObjects]; 276 320 success = [context save:&error]; 277 321 } -
branches/CoreData/SapphireFrappliance/main_debug.m
r833 r840 38 38 #import "SapphireMetaDataSupport.h" 39 39 #import "SapphireAllImporter.h" 40 #import "SapphireTVShow.h" 41 #import "SapphireGenre.h" 42 #import "SapphireCast.h" 43 #import "SapphireDirector.h" 44 #import "SapphireXMLData.h" 40 45 41 46 void overrideApplicationSupportdir(NSString *override); … … 96 101 @end 97 102 103 @interface SapphireMetaDataSupport (debug) 104 + (void)deletePendingObjects; 105 @end 106 107 98 108 99 109 … … 112 122 113 123 // overrideApplicationSupportdir([NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Frontrow"]); 114 #define TESTING_UPGRADE124 //#define TESTING_UPGRADE 115 125 #ifdef TESTING_UPGRADE 116 126 { … … 198 208 } 199 209 #endif 200 #define TESTING_DIRECTORY_RESCAN210 //#define TESTING_DIRECTORY_RESCAN 201 211 #ifdef TESTING_DIRECTORY_RESCAN 202 212 { … … 209 219 } 210 220 #endif 221 #define TESTING_AUTO_PRUNING 222 #ifdef TESTING_AUTO_PRUNING 223 { 224 SapphireFileMetaData *file = [SapphireFileMetaData fileWithPath:@"/Users/gbooker/Movies/MovieTests/Little Einsteins.avi" inContext:moc]; 225 SapphireXMLData *xml = [file xmlData]; 226 [moc deleteObject:xml]; 227 [SapphireMetaDataSupport deletePendingObjects]; 228 SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData directoryWithPath:@"/Users/gbooker/Movies/MovieTests" inContext:moc]; 229 [moc deleteObject:dir]; 230 [SapphireMetaDataSupport deletePendingObjects]; 231 dir = [SapphireDirectoryMetaData directoryWithPath:@"/Users/gbooker/Movies/TVShowsTests" inContext:moc]; 232 [moc deleteObject:dir]; 233 [SapphireMetaDataSupport deletePendingObjects]; 234 NSArray *allMovies = doFetchRequest(SapphireMovieName, moc, nil); 235 NSArray *allShows = doFetchRequest(SapphireTVShowName, moc, nil); 236 NSArray *allGenres = doFetchRequest(SapphireGenreName, moc, nil); 237 NSArray *allCast = doFetchRequest(SapphireCastName, moc, nil); 238 NSArray *allDirectors = doFetchRequest(SapphireDirectorName, moc, nil); 239 240 NSLog(@"Movies: %@\nShows: %@\nCast: %@\nGenres: %@\nDirectors: %@", allMovies, allShows, allCast, allGenres, allDirectors); 241 } 242 #endif 211 243 212 244 [pool release];
