Changeset 840

Show
Ignore:
Timestamp:
05/11/09 16:51:19 (16 months ago)
Author:
gbooker
Message:

Delete unused objects as they become unused so as to not need the prune call later. This will help accelerate things later. Also, handled XML a bit better.

Location:
branches/CoreData/SapphireFrappliance
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireCast.m

    r739 r840  
    33#import "CoreDataSupportFunctions.h" 
    44#import "SapphireFileSorter.h" 
     5#import "SapphireMetaDataSupport.h" 
    56 
    67@implementation SapphireCast 
     
    6465} 
    6566 
    66 - (void)removeMoviesObject:(SapphireMovie*)value_ 
     67- (void)checkMajorRole 
    6768{ 
    68         [super removeMoviesObject:value_]; 
    6969        BOOL currentMajorRole = self.hasMajorRoleValue; 
    7070        BOOL majorRole = NO; 
     
    8383} 
    8484 
     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 
    85108@end 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireDirector.m

    r739 r840  
    22#import "CoreDataSupportFunctions.h" 
    33#import "SapphireFileSorter.h" 
     4#import "SapphireMetaDataSupport.h" 
    45 
    56@implementation SapphireDirector 
     
    6263} 
    6364 
     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 
    6484@end 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireEpisode.m

    r836 r840  
    342342} 
    343343 
     344- (BOOL)shouldDelete 
     345{ 
     346        return [self.filesSet count] == 0; 
     347} 
     348 
    344349-(void)removeFiles:(NSSet*)removeFiles 
    345350{ 
    346351        [super removeFiles:removeFiles]; 
    347         [self clearPredicateCache]; 
     352        if([self.filesSet count] == 0) 
     353                [SapphireMetaDataSupport setObjectForPendingDelete:self]; 
     354        else 
     355                [self clearPredicateCache]; 
    348356} 
    349357 
     
    357365{ 
    358366        [super removeFilesObject:removeFile]; 
    359         [self clearPredicateCache]; 
     367        if([self.filesSet count] == 0) 
     368                [SapphireMetaDataSupport setObjectForPendingDelete:self]; 
     369        else 
     370                [self clearPredicateCache]; 
    360371} 
    361372 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireGenre.m

    r739 r840  
    33#import "SapphireFileSorter.h" 
    44#import "SapphireMovie.h" 
     5#import "SapphireMetaDataSupport.h" 
    56 
    67@implementation SapphireGenre 
     
    6364} 
    6465 
     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 
    6585@end 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireMovie.m

    r836 r840  
    271271                        while((name = [nameEnum nextObject]) != nil) 
    272272                        { 
    273                                 SapphireCast *aCast = [SapphireCast cast:name inContext:moc]; 
     273                                SapphireCast *aCast = [SapphireCast createCast:name inContext:moc]; 
    274274                                if(aCast != nil) 
    275275                                        [mutRet addObject:aCast]; 
     
    290290        NSArray *arc = [ordered valueForKey:@"name"]; 
    291291        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_CAST_DATA]; 
    292         [self.castSet setSet:[NSSet setWithArray:ordered]]; 
     292        [self setValue:[NSSet setWithArray:ordered] forKey:@"cast"]; 
    293293        int i, count=[ordered count]; 
    294294        if(count > 10) 
     
    319319                        while((genre = [genreEnum nextObject]) != nil) 
    320320                        { 
    321                                 SapphireGenre *aGenre = [SapphireGenre genre:genre inContext:moc]; 
     321                                SapphireGenre *aGenre = [SapphireGenre createGenre:genre inContext:moc]; 
    322322                                if(aGenre != nil) 
    323323                                        [mutRet addObject:aGenre]; 
     
    338338        NSArray *arc = [ordered valueForKey:@"name"]; 
    339339        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_GENRES_DATA]; 
    340         [self.genresSet addObjectsFromArray:ordered]; 
     340        [self setValue:[NSSet setWithArray:ordered] forKey:@"genres"]; 
    341341} 
    342342 
     
    360360                        while((name = [nameEnum nextObject]) != nil) 
    361361                        { 
    362                                 SapphireDirector *aDir = [SapphireDirector director:name inContext:moc]; 
     362                                SapphireDirector *aDir = [SapphireDirector createDirector:name inContext:moc]; 
    363363                                if(aDir != nil) 
    364364                                        [mutRet addObject:aDir]; 
     
    379379        NSArray *arc = [ordered valueForKey:@"name"]; 
    380380        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_DIRECTOR_DATA]; 
    381         [self.directorsSet addObjectsFromArray:ordered]; 
     381        [self setValue:[NSSet setWithArray:ordered] forKey:@"directors"]; 
    382382} 
    383383 
     
    402402        } 
    403403        [self setPrimitiveValue:nil forKey:ORDERED_CAST_KEY]; 
    404         [self.castSet setSet:[NSSet setWithArray:self.orderedCast]]; 
     404        [self setValue:[NSSet setWithArray:self.orderedCast] forKey:@"cast"]; 
    405405} 
    406406 
     
    417417        } 
    418418        [self setPrimitiveValue:nil forKey:ORDERED_GENRES_KEY]; 
    419         [self.genresSet setSet:[NSSet setWithArray:self.orderedGenres]]; 
     419        [self setValue:[NSSet setWithArray:self.orderedGenres] forKey:@"genres"]; 
    420420} 
    421421 
     
    432432        } 
    433433        [self setPrimitiveValue:nil forKey:ORDERED_DIRECTOR_KEY]; 
    434         [self.directorsSet setSet:[NSSet setWithArray:self.orderedDirectors]]; 
     434        [self setValue:[NSSet setWithArray:self.orderedDirectors] forKey:@"directors"]; 
    435435} 
    436436 
     
    451451{ 
    452452        [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]; 
    454455} 
    455456 
     
    463464{ 
    464465        [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]; 
    466468} 
    467469 
     
    575577} 
    576578 
     579- (BOOL)shouldDelete 
     580{ 
     581        if([self.filesSet count] == 0) 
     582                return YES; 
     583         
     584        [self checkXMLOverridenSets]; 
     585        return NO; 
     586} 
     587 
    577588-(void)removeFiles:(NSSet*)removeFiles 
    578589{ 
    579590        [super removeFiles:removeFiles]; 
    580         [self clearPredicateCache]; 
     591        if([self.filesSet count] == 0) 
     592                [SapphireMetaDataSupport setObjectForPendingDelete:self]; 
     593        else 
     594                [self clearPredicateCache]; 
    581595} 
    582596 
     
    590604{ 
    591605        [super removeFilesObject:removeFile]; 
    592         [self clearPredicateCache]; 
     606        if([self.filesSet count] == 0) 
     607                [SapphireMetaDataSupport setObjectForPendingDelete:self]; 
     608        else 
     609                [self clearPredicateCache]; 
    593610} 
    594611 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireSeason.m

    r734 r840  
    22#import "SapphireTVShow.h" 
    33#import "SapphireFileSorter.h" 
     4#import "SapphireMetaDataSupport.h" 
    45 
    56@implementation SapphireSeason 
     
    8283} 
    8384 
     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 
    84104@end 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireTVShow.m

    r734 r840  
    128128} 
    129129 
     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 
    130149@end 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.h

    r820 r840  
    4444 */ 
    4545+ (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; 
    4656 
    4757/*! 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.m

    r839 r840  
    4040#import "SapphireSeason.h" 
    4141#import "CoreDataSupportFunctions.h" 
     42 
     43@interface NSManagedObject (deleteDelegate) 
     44- (BOOL)shouldDelete; 
     45@end 
     46 
    4247 
    4348@interface NSManagedObject (ChangePersistence) 
     
    140145 
    141146static NSSet *coverArtExtentions = nil; 
     147static NSMutableSet *pendingDeleteObjects = nil; 
    142148 
    143149NSString *searchCoverArtExtForPath(NSString *path) 
     
    173179                                                  @"png", 
    174180                                                  @"gif", 
    175                                                   nil];  
     181                                                  nil]; 
     182        pendingDeleteObjects = [[NSMutableSet alloc] init]; 
    176183} 
    177184 
     
    258265} 
    259266 
     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 
    260303- (void)realWriteMetaData:(NSTimer *)timer 
    261304{ 
     
    274317        BOOL success = NO; 
    275318        @try { 
     319                [SapphireMetaDataSupport deletePendingObjects]; 
    276320                success = [context save:&error]; 
    277321        } 
  • branches/CoreData/SapphireFrappliance/main_debug.m

    r833 r840  
    3838#import "SapphireMetaDataSupport.h" 
    3939#import "SapphireAllImporter.h" 
     40#import "SapphireTVShow.h" 
     41#import "SapphireGenre.h" 
     42#import "SapphireCast.h" 
     43#import "SapphireDirector.h" 
     44#import "SapphireXMLData.h" 
    4045 
    4146void overrideApplicationSupportdir(NSString *override); 
     
    96101@end 
    97102 
     103@interface SapphireMetaDataSupport (debug) 
     104+ (void)deletePendingObjects; 
     105@end 
     106 
     107 
    98108 
    99109 
     
    112122         
    113123//      overrideApplicationSupportdir([NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Frontrow"]); 
    114 #define TESTING_UPGRADE 
     124//#define TESTING_UPGRADE 
    115125#ifdef TESTING_UPGRADE 
    116126        { 
     
    198208        } 
    199209#endif 
    200 #define TESTING_DIRECTORY_RESCAN 
     210//#define TESTING_DIRECTORY_RESCAN 
    201211#ifdef TESTING_DIRECTORY_RESCAN 
    202212        { 
     
    209219        } 
    210220#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 
    211243         
    212244        [pool release];