Skip to content

Commit 91321f1

Browse files
committed
Ads SDK Adapter
ab92475a4028372ebe68c08580a0525b4316ec2e
1 parent bf0e78d commit 91321f1

16 files changed

+715
-19
lines changed

.mapping.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@
326326
"AppMetricaCore/Sources/Database/Migration/Scheme/AMALocationDatabaseSchemeMigrationTo2.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMALocationDatabaseSchemeMigrationTo2.m",
327327
"AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo500.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo500.h",
328328
"AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo500.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo500.m",
329+
"AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo580.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo580.h",
330+
"AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo580.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDataMigrationTo580.m",
329331
"AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDatabaseSchemeMigrationTo2.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDatabaseSchemeMigrationTo2.h",
330332
"AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDatabaseSchemeMigrationTo2.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Scheme/AMAReporterDatabaseSchemeMigrationTo2.m",
331333
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAAESUtility+Migration.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAAESUtility+Migration.h",
@@ -338,6 +340,8 @@
338340
"AppMetricaCore/Sources/Database/Migration/Utilities/AMALocationStorage+Migration.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMALocationStorage+Migration.h",
339341
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo500Utils.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo500Utils.h",
340342
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo500Utils.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo500Utils.m",
343+
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo580Utils.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo580Utils.h",
344+
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo580Utils.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationTo580Utils.m",
341345
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationUtils.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationUtils.h",
342346
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationUtils.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAMigrationUtils.m",
343347
"AppMetricaCore/Sources/Database/Migration/Utilities/AMAReporterDatabaseEncodersFactory+Migration.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaCore/Sources/Database/Migration/Utilities/AMAReporterDatabaseEncodersFactory+Migration.h",
@@ -1497,6 +1501,11 @@
14971501
"AppMetricaHostState/Tests/AMAHostStateControllerFactoryTests.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaHostState/Tests/AMAHostStateControllerFactoryTests.m",
14981502
"AppMetricaHostState/Tests/AMAHostStateProviderTests.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaHostState/Tests/AMAHostStateProviderTests.m",
14991503
"AppMetricaHostState/Tests/AMAHostStatePublisherTests.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaHostState/Tests/AMAHostStatePublisherTests.m",
1504+
"AppMetricaLibraryAdapter.podspec":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLibraryAdapter.podspec",
1505+
"AppMetricaLibraryAdapter/Sources/AppMetricaLibraryAdapter.swift":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLibraryAdapter/Sources/AppMetricaLibraryAdapter.swift",
1506+
"AppMetricaLibraryAdapter/Sources/Resources/PrivacyInfo.xcprivacy":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLibraryAdapter/Sources/Resources/PrivacyInfo.xcprivacy",
1507+
"AppMetricaLibraryAdapter/Tests/AppMetricaLibraryAdapterTests.swift":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLibraryAdapter/Tests/AppMetricaLibraryAdapterTests.swift",
1508+
"AppMetricaLibraryAdapter/Tests/MockAppMetrica.swift":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLibraryAdapter/Tests/MockAppMetrica.swift",
15001509
"AppMetricaLog.podspec":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLog.podspec",
15011510
"AppMetricaLog/Sources/AMAASLLogMiddleware.h":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLog/Sources/AMAASLLogMiddleware.h",
15021511
"AppMetricaLog/Sources/AMAASLLogMiddleware.m":"mobile/metrika/ios/appmetrica-sdk/public/AppMetricaLog/Sources/AMAASLLogMiddleware.m",

.swiftpm/xcode/xcshareddata/xcschemes/AppMetrica-Package.xcscheme

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,34 @@
384384
ReferencedContainer = "container:">
385385
</BuildableReference>
386386
</BuildActionEntry>
387+
<BuildActionEntry
388+
buildForTesting = "YES"
389+
buildForRunning = "YES"
390+
buildForProfiling = "YES"
391+
buildForArchiving = "YES"
392+
buildForAnalyzing = "YES">
393+
<BuildableReference
394+
BuildableIdentifier = "primary"
395+
BlueprintIdentifier = "AppMetricaLibraryAdapter"
396+
BuildableName = "AppMetricaLibraryAdapter"
397+
BlueprintName = "AppMetricaLibraryAdapter"
398+
ReferencedContainer = "container:">
399+
</BuildableReference>
400+
</BuildActionEntry>
401+
<BuildActionEntry
402+
buildForTesting = "YES"
403+
buildForRunning = "YES"
404+
buildForProfiling = "YES"
405+
buildForArchiving = "YES"
406+
buildForAnalyzing = "YES">
407+
<BuildableReference
408+
BuildableIdentifier = "primary"
409+
BlueprintIdentifier = "AppMetricaLibraryAdapterTests"
410+
BuildableName = "AppMetricaLibraryAdapterTests"
411+
BlueprintName = "AppMetricaLibraryAdapterTests"
412+
ReferencedContainer = "container:">
413+
</BuildableReference>
414+
</BuildActionEntry>
387415
</BuildActionEntries>
388416
</BuildAction>
389417
<TestAction
@@ -513,6 +541,16 @@
513541
ReferencedContainer = "container:">
514542
</BuildableReference>
515543
</TestableReference>
544+
<TestableReference
545+
skipped = "NO">
546+
<BuildableReference
547+
BuildableIdentifier = "primary"
548+
BlueprintIdentifier = "AppMetricaLibraryAdapterTests"
549+
BuildableName = "AppMetricaLibraryAdapterTests"
550+
BlueprintName = "AppMetricaLibraryAdapterTests"
551+
ReferencedContainer = "container:">
552+
</BuildableReference>
553+
</TestableReference>
516554
</Testables>
517555
</TestAction>
518556
<LaunchAction

AppMetricaCore/Sources/Database/AMADatabaseFactory.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#import "AMAReporterDataMigrationTo500.h"
4040
#import "AMALocationDataMigrationTo500.h"
4141
#import "AMADataMigrationTo580.h"
42+
#import "AMAReporterDataMigrationTo580.h"
4243

4344
#import "AMALocationDatabaseSchemeMigrationTo2.h"
4445

@@ -179,6 +180,7 @@ + (NSString *)configurationDatabasePath
179180
];
180181
NSArray *dataMigrations = @[
181182
[[AMAReporterDataMigrationTo500 alloc] initWithApiKey:apiKey],
183+
[[AMAReporterDataMigrationTo580 alloc] initWithApiKey:apiKey main:main],
182184
];
183185
NSArray *libraryMigrations = @[
184186
];

AppMetricaCore/Sources/Database/KeyValueStorage/AMADatabaseKeyValueStorageProvider.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ @implementation AMADatabaseKeyValueStorageProvider
2929
- (instancetype)initWithTableName:(NSString *)tableName
3030
converter:(id<AMAKeyValueStorageConverting>)converter
3131
objectProvider:(AMADatabaseObjectProviderBlock)objectProvider
32-
backingKVSDataProvider:(id<AMAKeyValueStorageDataProviding>)backingDataProvider;
32+
backingKVSDataProvider:(id<AMAKeyValueStorageDataProviding>)backingDataProvider
3333
{
3434
self = [super init];
3535
if (self != nil) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
#import "AMADatabaseDataMigration.h"
3+
4+
@interface AMAReporterDataMigrationTo580 : NSObject<AMADatabaseDataMigration>
5+
6+
- (instancetype)init NS_UNAVAILABLE;
7+
+ (instancetype)new NS_UNAVAILABLE;
8+
9+
- (instancetype)initWithApiKey:(NSString *)apiKey main:(BOOL)main;
10+
11+
@end
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
2+
#import <AppMetricaLog/AppMetricaLog.h>
3+
#import "AMAStorageKeys.h"
4+
#import "AMAReporterDataMigrationTo580.h"
5+
#import "AMADatabaseProtocol.h"
6+
#import "AMADatabaseConstants.h"
7+
#import <AppMetricaFMDB/AppMetricaFMDB.h>
8+
#import "AMATableDescriptionProvider.h"
9+
#import "AMAMigrationTo580Utils.h"
10+
#import "AMADatabaseFactory.h"
11+
12+
@interface AMAReporterDataMigrationTo580 ()
13+
14+
@property (nonatomic, strong) NSString *apiKey;
15+
@property (nonatomic, assign) BOOL main;
16+
17+
@end
18+
19+
@implementation AMAReporterDataMigrationTo580
20+
21+
- (instancetype)initWithApiKey:(NSString *)apiKey main:(BOOL)main
22+
{
23+
self = [super init];
24+
if (self != nil) {
25+
self.apiKey = apiKey;
26+
self.main = main;
27+
}
28+
return self;
29+
}
30+
31+
- (NSString *)migrationKey
32+
{
33+
return AMAStorageStringKeyDidApplyDataMigrationFor580;
34+
}
35+
36+
- (void)applyMigrationToDatabase:(id<AMADatabaseProtocol>)database
37+
{
38+
NSString *reporterPath = [[AMAFileUtility persistentPathForApiKey:self.apiKey]
39+
stringByAppendingPathComponent:@"data.sqlite"];
40+
@synchronized (self) {
41+
if ([AMAFileUtility fileExistsAtPath:reporterPath] == NO) {
42+
return;
43+
}
44+
if (self.main) {
45+
[self migrateReporterData:reporterPath database:database];
46+
[AMAMigrationTo580Utils migrateReporterEventHashes:self.apiKey];
47+
[self copyReporterBackup];
48+
}
49+
}
50+
}
51+
52+
- (void)migrateReporterData:(NSString *)sourceDBPath
53+
database:(id<AMADatabaseProtocol>)database
54+
{
55+
AMAFMDatabase *sourceDB = [AMAFMDatabase databaseWithPath:sourceDBPath];
56+
57+
if ([sourceDB open] == NO) {
58+
AMALogWarn(@"Failed to open database at path: %@", sourceDBPath);
59+
return;
60+
}
61+
62+
NSDictionary *tables = @{
63+
kAMAKeyValueTableName : [AMATableDescriptionProvider binaryKVTableMetaInfo],
64+
kAMASessionTableName : [AMATableDescriptionProvider sessionsTableMetaInfo],
65+
};
66+
[database inDatabase:^(AMAFMDatabase *db) {
67+
for (NSString *table in tables) {
68+
[AMAMigrationTo580Utils migrateTable:table
69+
tableScheme:[tables objectForKey:table]
70+
sourceDB:sourceDB
71+
destinationDB:db];
72+
}
73+
[AMAMigrationTo580Utils migrateReporterEvents:sourceDB
74+
destinationDB:db
75+
apiKey:self.apiKey];
76+
77+
[db close];
78+
}];
79+
[sourceDB close];
80+
}
81+
82+
- (void)copyReporterBackup
83+
{
84+
NSString *reporterBackPath = [[AMAFileUtility persistentPathForApiKey:self.apiKey] stringByAppendingPathComponent:@"data.bak"];
85+
NSString *newDirPath = [[AMAFileUtility persistentPathForApiKey:kAMAMainReporterDBPath] stringByAppendingPathComponent:@"data.bak"];
86+
87+
NSFileManager *fileManager = [NSFileManager defaultManager];
88+
89+
if (![fileManager fileExistsAtPath:reporterBackPath]) {
90+
return;
91+
}
92+
if ([fileManager fileExistsAtPath:newDirPath]) {
93+
return;
94+
}
95+
96+
NSError *error;
97+
if (![fileManager copyItemAtPath:reporterBackPath toPath:newDirPath error:&error]) {
98+
AMALogWarn(@"Failed to copy reporter backup from %@ to %@: %@", reporterBackPath, newDirPath, error);
99+
} else {
100+
AMALogWarn(@"Successfully copied reporter backups from %@ to %@", reporterBackPath, newDirPath);
101+
}
102+
}
103+
104+
@end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
#import <Foundation/Foundation.h>
3+
4+
@class AMAFMDatabase;
5+
6+
@interface AMAMigrationTo580Utils : NSObject
7+
8+
- (instancetype)init NS_UNAVAILABLE;
9+
+ (instancetype)new NS_UNAVAILABLE;
10+
11+
+ (void)migrateTable:(NSString *)tableName
12+
tableScheme:(NSArray *)tableScheme
13+
sourceDB:(AMAFMDatabase *)sourceDB
14+
destinationDB:(AMAFMDatabase *)destinationDB;
15+
16+
+ (void)migrateReporterEvents:(AMAFMDatabase *)sourceDB
17+
destinationDB:(AMAFMDatabase *)destinationDB
18+
apiKey:(NSString *)apiKey;
19+
20+
+ (void)migrateReporterEventHashes:(NSString *)apiKey;
21+
22+
@end
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
2+
#import "AMAMigrationTo580Utils.h"
3+
#import "AMATableDescriptionProvider.h"
4+
#import "AMADatabaseProtocol.h"
5+
#import "AMADatabaseConstants.h"
6+
#import <AppMetricaFMDB/AppMetricaFMDB.h>
7+
#import "AMADatabaseHelper.h"
8+
#import "AMAReporterStoragesContainer.h"
9+
#import "AMAReporterStorage.h"
10+
#import "AMAEventNameHashesStorage.h"
11+
#import "AMAEventStorage+Migration.h"
12+
#import "AMAEventSerializer.h"
13+
#import "AMAEventNameHashesStorageFactory.h"
14+
15+
@implementation AMAMigrationTo580Utils
16+
17+
+ (void)migrateTable:(NSString *)tableName
18+
tableScheme:(NSArray *)tableScheme
19+
sourceDB:(AMAFMDatabase *)sourceDB
20+
destinationDB:(AMAFMDatabase *)destinationDB
21+
{
22+
NSMutableArray *columns = [NSMutableArray array];
23+
NSMutableArray *valueQuestions = [NSMutableArray array];
24+
for (NSDictionary *field in tableScheme) {
25+
[columns addObject:field[kAMASQLName]];
26+
[valueQuestions addObject:@"?"];
27+
}
28+
NSString *joined = [columns componentsJoinedByString:@", "];
29+
NSString *selectQuery = [NSString stringWithFormat:@"SELECT %@ FROM %@;", joined, tableName];
30+
AMAFMResultSet *resultSet = [sourceDB executeQuery:selectQuery];
31+
32+
NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO %@ (%@) VALUES (%@);",
33+
tableName, joined, [valueQuestions componentsJoinedByString:@", "]];
34+
35+
while ([resultSet next]) {
36+
37+
NSMutableArray *columnValues = [NSMutableArray array];
38+
for (NSString *columnName in columns) {
39+
id columnValue = [resultSet objectForColumn:columnName];
40+
41+
[columnValues addObject:(columnValue ?: [NSNull null])];
42+
}
43+
44+
BOOL insertSuccess = [destinationDB executeUpdate:insertQuery withArgumentsInArray:columnValues];
45+
if (insertSuccess == NO) {
46+
AMALogWarn(@"Failed to insert values into table at path: %@ error: %@",
47+
destinationDB.databasePath, [destinationDB lastErrorMessage]);
48+
}
49+
}
50+
[resultSet close];
51+
}
52+
53+
+ (void)migrateReporterEvents:(AMAFMDatabase *)sourceDB
54+
destinationDB:(AMAFMDatabase *)destinationDB
55+
apiKey:(NSString *)apiKey
56+
{
57+
AMAEventSerializer *serializer = [[AMAEventSerializer alloc] init];
58+
NSArray<AMAEvent*> *reporterEvents = [self getEventsInDB:sourceDB eventSerializer:serializer];
59+
60+
[self saveReporterEvents:reporterEvents apiKey:apiKey db:destinationDB];
61+
}
62+
63+
+ (void)migrateReporterEventHashes:(NSString *)apiKey
64+
{
65+
AMAEventNameHashesStorage *migrationStorage = [AMAEventNameHashesStorageFactory storageForApiKey:apiKey main:NO];
66+
AMAEventNameHashesStorage *currentStorage = [AMAEventNameHashesStorageFactory storageForApiKey:apiKey main:YES];
67+
AMAEventNameHashesCollection *oldCollection = [migrationStorage loadCollection];
68+
BOOL result = [currentStorage saveCollection:oldCollection];
69+
if (result == NO) {
70+
AMALogError(@"Failed to save event hashes collection for apiKey: %@", apiKey);
71+
}
72+
}
73+
74+
#pragma mark - Events Migration -
75+
76+
+ (NSArray<AMAEvent*> *)getEventsInDB:(AMAFMDatabase *)db
77+
eventSerializer:(AMAEventSerializer *)eventSerializer
78+
{
79+
NSMutableArray *result = [NSMutableArray array];
80+
NSError *error = nil;
81+
[AMADatabaseHelper enumerateRowsWithFilter:nil
82+
order:nil
83+
valuesArray:@[]
84+
tableName:kAMAEventTableName
85+
limit:INT_MAX
86+
db:db
87+
error:&error
88+
block:^(NSDictionary *dictionary) {
89+
NSError *deserializationError = nil;
90+
AMAEvent *event = [eventSerializer eventForDictionary:dictionary error:&deserializationError];
91+
if (deserializationError != nil) {
92+
AMALogInfo(@"Deserialization error: %@", deserializationError);
93+
}
94+
else if (event != nil) {
95+
[result addObject:event];
96+
}
97+
}];
98+
if (error != nil) {
99+
AMALogInfo(@"Error: %@", error);
100+
}
101+
return [result copy];
102+
}
103+
104+
+ (BOOL)saveReporterEvents:(NSArray<AMAEvent*> *)events
105+
apiKey:(NSString *)apiKey
106+
db:(AMAFMDatabase *)db
107+
{
108+
AMAReporterStoragesContainer *container = [AMAReporterStoragesContainer sharedInstance];
109+
AMAReporterStorage *reporterStorage = [container mainStorageForApiKey:apiKey];
110+
if (reporterStorage == nil) {
111+
AMALogError(@"Failed to create storage for apiKey: %@", apiKey);
112+
return NO;
113+
}
114+
BOOL __block result = NO;
115+
for (AMAEvent *event in events) {
116+
result = [reporterStorage.eventStorage addEvent:event db:db error:nil];
117+
}
118+
return result;
119+
}
120+
121+
@end

AppMetricaCore/Sources/Reporter/AMAReportersContainer.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ - (void)restartPrivacyTimer
5050
@synchronized (self) {
5151
reporters = [self.reporters copy];
5252
}
53-
for (AMAReporter *repoter in reporters.objectEnumerator) {
54-
[repoter restartPrivacyTimer];
53+
for (AMAReporter *reporter in reporters.objectEnumerator) {
54+
[reporter restartPrivacyTimer];
5555
}
5656
}
5757

0 commit comments

Comments
 (0)