@@ -102,74 +102,71 @@ + (NSString *)libraryDataStoragePath {
102
102
return libraryDataPath;
103
103
}
104
104
105
- + (NSDictionary <NSString *, NSString *> *)pathsForEvent : (GDTCOREvent *)event {
106
- NSString *dataPath =
107
- [NSString stringWithFormat: @" %@ /%ld /%@ " , [GDTCORFlatFileStorage baseEventStoragePath ],
108
- (long )event.target, event.eventID];
109
- NSString *mappingIDPath =
110
- [NSString stringWithFormat: @" %@ /%ld /%@ /%@ " , [GDTCORFlatFileStorage baseEventStoragePath ],
111
- (long )event.target, event.mappingID, event.eventID];
112
- NSString *qosTierPath =
113
- [NSString stringWithFormat: @" %@ /%ld /%ld /%@ " , [GDTCORFlatFileStorage baseEventStoragePath ],
114
- (long )event.target, (long )event.qosTier, event.eventID];
115
- return @{
116
- gGDTCORFlatFileStorageEventDataPathKey : dataPath,
117
- gGDTCORFlatFileStorageMappingIDPathKey : mappingIDPath,
118
- gGDTCORFlatFileStorageQoSTierPathKey : qosTierPath
119
- };
120
- }
121
-
122
105
+ (NSString *)pathForTarget : (GDTCORTarget)target
123
- qosTier : (nullable NSNumber *)qosTier
124
- mappingID : (nullable NSString *)mappingID {
125
- NSString *baseEventPath = [GDTCORFlatFileStorage baseEventStoragePath ];
126
- // If only a target was given, return the target path.
127
- if (qosTier == nil && mappingID == nil ) {
128
- return [NSString stringWithFormat: @" %@ /%ld " , baseEventPath, (long )target];
129
- }
130
-
131
- // If only a target and mappingID were given, return the mapping ID path.
132
- if (qosTier == nil ) {
133
- return [NSString stringWithFormat: @" %@ /%ld /%@ " , baseEventPath, (long )target, mappingID];
134
- }
135
-
136
- // If only a target and qosTier were given, return the QoS tier path.
137
- if (mappingID == nil ) {
138
- return [NSString stringWithFormat: @" %@ /%ld /%@ " , baseEventPath, (long )target, qosTier];
139
- }
140
-
141
- // If a target, mappingID, and qosTier were all given, return a single target/qosTier/mappingID
142
- // directory.
106
+ eventID : (NSNumber *)eventID
107
+ qosTier : (NSNumber *)qosTier
108
+ mappingID : (NSString *)mappingID {
143
109
return
144
- [NSString stringWithFormat: @" %@ /%ld /%@ /%@ " , baseEventPath, (long )target, qosTier, mappingID];
110
+ [NSString stringWithFormat: @" %@ /%ld /%@ .%@ .%@ " , [GDTCORFlatFileStorage baseEventStoragePath ],
111
+ (long )target, eventID, qosTier, mappingID];
145
112
}
146
113
147
- + (NSArray <NSString *> *)searchPathsWithEventSelector : (GDTCORStorageEventSelector *)eventSelector {
148
- NSMutableArray <NSString *> *searchPaths = [[NSMutableArray alloc ] init ];
149
- if (eventSelector.selectedQosTiers && eventSelector.selectedQosTiers .count > 0 ) {
150
- for (NSNumber *qosTier in eventSelector.selectedQosTiers ) {
151
- NSString *searchPath = [self pathForTarget: eventSelector.selectedTarget
152
- qosTier: qosTier
153
- mappingID: eventSelector.selectedMappingID];
154
- BOOL isDirectory;
155
- if ([[NSFileManager defaultManager ] fileExistsAtPath: searchPath isDirectory: &isDirectory]) {
156
- if (isDirectory) {
157
- [searchPaths addObject: searchPath];
158
- }
159
- }
114
+ + (NSSet <NSString *> *)pathsForTarget : (GDTCORTarget)target
115
+ eventIDs : (nullable NSSet <NSNumber *> *)eventIDs
116
+ qosTiers : (nullable NSSet <NSNumber *> *)qosTiers
117
+ mappingIDs : (nullable NSSet <NSString *> *)mappingIDs {
118
+ NSMutableSet <NSString *> *paths = [[NSMutableSet alloc ] init ];
119
+ NSFileManager *fileManager = [NSFileManager defaultManager ];
120
+ NSString *targetPath = [NSString
121
+ stringWithFormat: @" %@ /%ld " , [GDTCORFlatFileStorage baseEventStoragePath ], (long )target];
122
+ NSError *error;
123
+ NSArray <NSString *> *dirPaths = [fileManager contentsOfDirectoryAtPath: targetPath error: &error];
124
+ if (error) {
125
+ GDTCORLogDebug (@" There was an error reading the contents of the target path: %@ " , error);
126
+ return paths;
127
+ }
128
+ BOOL checkingIDs = eventIDs.count > 0 ;
129
+ BOOL checkingQosTiers = qosTiers.count > 0 ;
130
+ BOOL checkingMappingIDs = mappingIDs.count > 0 ;
131
+ BOOL checkingAnything = checkingIDs == NO && checkingQosTiers == NO && checkingMappingIDs == NO ;
132
+ for (NSString *path in dirPaths) {
133
+ if (checkingAnything) {
134
+ [paths addObject: path];
135
+ continue ;
160
136
}
161
- } else {
162
- NSString *searchPath = [self pathForTarget: eventSelector.selectedTarget
163
- qosTier: nil
164
- mappingID: eventSelector.selectedMappingID];
165
- BOOL isDirectory;
166
- if ([[NSFileManager defaultManager ] fileExistsAtPath: searchPath isDirectory: &isDirectory]) {
167
- if (isDirectory) {
168
- [searchPaths addObject: searchPath];
169
- }
137
+ NSString *filename = [path lastPathComponent ];
138
+ NSArray <NSString *> *components = [filename componentsSeparatedByString: @" ." ];
139
+ if (components.count != 3 ) {
140
+ GDTCORLogDebug (@" There was an error reading the filename components: %@ " , components);
141
+ [[NSFileManager defaultManager ] removeItemAtPath: path error: nil ];
142
+ continue ;
143
+ }
144
+ NSNumber *eventID = @(components[0 ].integerValue );
145
+ NSNumber *qosTier = @(components[1 ].integerValue );
146
+ NSString *mappingID = components[2 ];
147
+ if (eventID == nil || qosTier == nil ) {
148
+ GDTCORLogDebug (@" There was an error parsing the filename components: %@ " , components);
149
+ [[NSFileManager defaultManager ] removeItemAtPath: path error: nil ];
150
+ continue ;
151
+ }
152
+ NSNumber *eventIDMatch = checkingIDs ? @([eventIDs containsObject: eventID]) : nil ;
153
+ NSNumber *qosTierMatch = checkingQosTiers ? @([qosTiers containsObject: qosTier]) : nil ;
154
+ NSNumber *mappingIDMatch = checkingMappingIDs ? @([mappingIDs containsObject: mappingID]) : nil ;
155
+ if ((eventIDMatch == nil || eventIDMatch.boolValue ) &&
156
+ (qosTierMatch == nil || qosTierMatch.boolValue ) &&
157
+ (mappingIDMatch == nil || mappingIDMatch.boolValue )) {
158
+ [paths addObject: path];
170
159
}
171
160
}
172
- return searchPaths;
161
+ return paths;
162
+ }
163
+
164
+ + (NSArray <NSString *> *)searchPathsWithEventSelector : (GDTCORStorageEventSelector *)eventSelector {
165
+ NSSet *searchPaths = [GDTCORFlatFileStorage pathsForTarget: eventSelector.selectedTarget
166
+ eventIDs: eventSelector.selectedEventIDs
167
+ qosTiers: eventSelector.selectedQosTiers
168
+ mappingIDs: eventSelector.selectedMappingIDs];
169
+ return [searchPaths allObjects ];
173
170
}
174
171
175
172
+ (instancetype )sharedInstance {
@@ -357,38 +354,23 @@ - (void)removeLibraryDataForKey:(nonnull NSString *)key
357
354
}
358
355
359
356
- (BOOL )hasEventsForTarget : (GDTCORTarget)target {
360
- NSString *searchPath = [GDTCORFlatFileStorage pathForTarget: target qosTier: nil mappingID: nil ];
361
- NSFileManager *fm = [NSFileManager defaultManager ];
362
- NSDirectoryEnumerator *enumerator = [fm enumeratorAtPath: searchPath];
363
- while ([enumerator nextObject ]) {
364
- if ([enumerator.fileAttributes[NSFileType ] isEqual: NSFileTypeRegular ]) {
365
- return YES ;
366
- }
367
- }
368
- return NO ;
357
+ // TODO(mikehaney24): Increase the performance of this call.
358
+ GDTCORStorageEventSelector *eventSelector =
359
+ [[GDTCORStorageEventSelector alloc ] initWithTarget: target
360
+ eventIDs: nil
361
+ mappingIDs: nil
362
+ qosTiers: nil ];
363
+ id <GDTCORStorageEventIterator> iter = [self iteratorWithSelector: eventSelector];
364
+ return [iter nextEvent ] != nil ;
369
365
}
370
366
371
367
- (nullable id <GDTCORStorageEventIterator>)iteratorWithSelector :
372
368
(nonnull GDTCORStorageEventSelector *)eventSelector {
373
369
__block GDTCORFlatFileStorageIterator *iterator;
374
370
dispatch_sync (_storageQueue, ^{
375
- NSMutableArray <NSString *> *filePaths;
376
371
NSArray <NSString *> *searchPaths =
377
372
[GDTCORFlatFileStorage searchPathsWithEventSelector: eventSelector];
378
- for (NSString *searchPath in searchPaths) {
379
- NSDirectoryEnumerator *enumerator =
380
- [[NSFileManager defaultManager ] enumeratorAtPath: searchPath];
381
- NSString *nextFile;
382
- while ((nextFile = [enumerator nextObject ])) {
383
- NSFileAttributeType fileType = enumerator.fileAttributes [NSFileType ];
384
- if ([fileType isEqual: NSFileTypeRegular ]) {
385
- [filePaths addObject: nextFile];
386
- }
387
- }
388
- iterator = [[GDTCORFlatFileStorageIterator alloc ] initWithTarget: eventSelector.selectedTarget
389
- queue: self ->_storageQueue];
390
- iterator.eventFiles = filePaths;
391
- }
373
+ iterator.eventFiles = searchPaths;
392
374
});
393
375
return iterator;
394
376
}
0 commit comments