From 453b8f7b96e6d3e5e35bd1f3e14c8592bc84f9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=BAlvio=20Abrah=C3=A3o=20de=20Paula?= Date: Mon, 14 Aug 2023 11:07:07 -0700 Subject: [PATCH] Implement getTableStructure command. Reviewed By: lblasa Differential Revision: D48191484 fbshipit-source-id: 6838590f4e10b4613074e9e9d112a62d4688f739 --- .../Commands/DatabaseGetTableStructure.h | 2 + .../Commands/DatabaseGetTableStructure.m | 11 +++++ .../DatabaseDriver.h | 10 ++-- .../DatabasesManager.m | 45 +++++++++++++++-- .../{ => Mock}/MockDatabaseDescriptor.h | 0 .../{ => Mock}/MockDatabaseDescriptor.m | 0 .../{ => Mock}/MockDatabaseDriver.h | 0 .../Mock/MockDatabaseDriver.m | 49 +++++++++++++++++++ .../MockDatabaseDriver.m | 26 ---------- .../FlipperKitDatabasesPlugin/ObjectMapper.h | 2 +- .../FlipperKitDatabasesPlugin/ObjectMapper.m | 14 ++++-- 11 files changed, 121 insertions(+), 38 deletions(-) rename iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/{ => Mock}/MockDatabaseDescriptor.h (100%) rename iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/{ => Mock}/MockDatabaseDescriptor.m (100%) rename iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/{ => Mock}/MockDatabaseDriver.h (100%) create mode 100644 iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDriver.m delete mode 100644 iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDriver.m diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.h b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.h index 6d2335d9f..82309b1c5 100644 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.h +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.h @@ -30,5 +30,7 @@ @property(nonatomic, copy, readonly) NSString* table; - (instancetype)initWithDatabaseId:(NSInteger)databaseId table:(NSString*)table; ++ (DatabaseGetTableStructureRequest*)getTableStructureRequestFromDictionary: + (NSDictionary*)dictionary; @end diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.m b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.m index 6e24cfaf2..715b616a0 100644 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.m +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Commands/DatabaseGetTableStructure.m @@ -38,4 +38,15 @@ return self; } ++ (DatabaseGetTableStructureRequest*)getTableStructureRequestFromDictionary: + (NSDictionary*)params { + int databaseId = [params[@"databaseId"] integerValue]; + NSString* table = params[@"table"]; + if (databaseId <= 0 || !table) { + return nil; + } + return [[DatabaseGetTableStructureRequest alloc] initWithDatabaseId:databaseId + table:table]; +} + @end diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabaseDriver.h b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabaseDriver.h index 873d5f6bf..929ed29a2 100644 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabaseDriver.h +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabaseDriver.h @@ -8,12 +8,14 @@ #import @protocol DatabaseDescriptor; +@class DatabaseGetTableStructureRequest; +@class DatabaseGetTableStructureResponse; @protocol DatabaseDriver -@property(nonatomic, strong, readonly) id - databaseDescriptor; - - (NSArray>*)getDatabases; - (NSArray*)getTableNames:(id)databaseDescriptor; - +- (DatabaseGetTableStructureResponse*) + getTableStructureWithDatabaseDescriptor: + (id)databaseDescriptor + forTable:(NSString*)tableName; @end diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabasesManager.m b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabasesManager.m index 5bebe3bfc..13a11b53b 100644 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabasesManager.m +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/DatabasesManager.m @@ -77,19 +77,58 @@ } } - NSDictionary* result = [ObjectMapper - databaseListToDictionary:self.databaseDescriptorHolderSet]; + id result = [ObjectMapper + databaseListToFlipperArray:self.databaseDescriptorHolderSet]; [responder success:result]; }]; [self.connection receive:@"getTableData" withBlock:^(NSDictionary* params, id responder){ + }]; [self.connection receive:@"getTableStructure" - withBlock:^(NSDictionary* params, id responder){ + withBlock:^(NSDictionary* params, id responder) { + DatabaseGetTableStructureRequest* request = + [DatabaseGetTableStructureRequest + getTableStructureRequestFromDictionary:params]; + + if (!request) { + NSDictionary* errorResponse = [ObjectMapper + errorWithCode:DatabasesErrorCodesInvalidRequest + message:kDatabasesErrorCodesInvalidRequestMessage]; + [responder error:errorResponse]; + return; + } + + DatabaseDescriptorHolder* descriptorHolder = + self.databaseDescriptorHolders[@(request.databaseId)]; + if (!descriptorHolder) { + NSDictionary* errorResponse = [ObjectMapper + errorWithCode:DatabasesErrorCodesDatabaseInvalid + message:kDatabasesErrorCodesDatabaseInvalidMessage]; + [responder error:errorResponse]; + return; + } + + @try { + DatabaseGetTableStructureResponse* tableStructure = + [descriptorHolder.databaseDriver + getTableStructureWithDatabaseDescriptor: + descriptorHolder.databaseDescriptor + forTable:request.table]; + NSDictionary* response = [ObjectMapper + databaseGetTableStructureResponseToDictionary:tableStructure]; + [responder success:response]; + } @catch (NSException* exception) { + NSDictionary* errorResponse = [ObjectMapper + errorWithCode:DatabasesErrorCodesSqlExecutionException + message:[kDatabasesErrorCodesSqlExecutionExceptionMessage + stringByAppendingString:exception.reason]]; + [responder error:errorResponse]; + } }]; [self.connection diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDescriptor.h b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDescriptor.h similarity index 100% rename from iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDescriptor.h rename to iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDescriptor.h diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDescriptor.m b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDescriptor.m similarity index 100% rename from iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDescriptor.m rename to iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDescriptor.m diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDriver.h b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDriver.h similarity index 100% rename from iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDriver.h rename to iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDriver.h diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDriver.m b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDriver.m new file mode 100644 index 000000000..3d8fb69ae --- /dev/null +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/Mock/MockDatabaseDriver.m @@ -0,0 +1,49 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "MockDatabaseDriver.h" +#import "DatabaseGetTableStructure.h" +#import "MockDatabaseDescriptor.h" + +@implementation MockDatabaseDriver + +- (NSArray>*)getDatabases { + MockDatabaseDescriptor* mockDescriptor = + [[MockDatabaseDescriptor alloc] init]; + return @[ mockDescriptor ]; +} + +- (NSArray*)getTableNames: + (id)databaseDescriptor { + return @[ @"MockTable1", @"MockTable2" ]; +} + +- (DatabaseGetTableStructureResponse*) + getTableStructureWithDatabaseDescriptor: + (id)databaseDescriptor + forTable:(NSString*)tableName { + NSMutableArray* structureColumns = + [NSMutableArray arrayWithObjects:@"id", @"name", @"age", nil]; + NSMutableArray*>* structureValues = + [NSMutableArray arrayWithObjects:@[ @"1", @"John", @"25" ], + @[ @"2", @"Jane", @"30" ], + nil]; + NSMutableArray* indexesColumns = [NSMutableArray + arrayWithObjects:@"index_name", @"unique", @"indexed_column_name", nil]; + NSMutableArray*>* indexesValues = [NSMutableArray + arrayWithObjects:@[ @"index_name1", @"false", @"id,name" ], + @[ @"index_name2", @"true", @"age" ], + nil]; + + return [[DatabaseGetTableStructureResponse alloc] + initWithStructureColumns:[structureColumns copy] + structureValues:[structureValues copy] + indexesColumns:[indexesColumns copy] + indexesValues:[indexesValues copy]]; +} + +@end diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDriver.m b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDriver.m deleted file mode 100644 index d8b8ae324..000000000 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/MockDatabaseDriver.m +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "MockDatabaseDriver.h" -#import "MockDatabaseDescriptor.h" - -@implementation MockDatabaseDriver - -- (NSArray>*)getDatabases { - MockDatabaseDescriptor* mockDescriptor = - [[MockDatabaseDescriptor alloc] init]; - return @[ mockDescriptor ]; -} - -- (NSArray*)getTableNames: - (id)databaseDescriptor { - return @[ @"MockTable1", @"MockTable2" ]; -} - -@synthesize databaseDescriptor; - -@end diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.h b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.h index a67d77611..5e083986d 100644 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.h +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.h @@ -15,7 +15,7 @@ @interface ObjectMapper : NSObject -+ (NSDictionary*)databaseListToDictionary: ++ (NSMutableArray*)databaseListToFlipperArray: (NSMutableSet*)databaseDescriptorHolderSet; + (NSDictionary*)databaseGetTableDataResponseToDictionary: (DatabaseGetTableDataResponse*)response; diff --git a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.m b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.m index fd9d080a0..f63c8f99e 100644 --- a/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.m +++ b/iOS/Plugins/FlipperKitDatabasesPlugin/FlipperKitDatabasesPlugin/ObjectMapper.m @@ -15,9 +15,9 @@ @implementation ObjectMapper -+ (NSDictionary*)databaseListToDictionary: ++ (NSMutableArray*)databaseListToFlipperArray: (NSMutableSet*)databaseDescriptorHolderSet { - NSMutableDictionary* result = [NSMutableDictionary new]; + NSMutableArray* result = [NSMutableArray new]; for (DatabaseDescriptorHolder* holder in databaseDescriptorHolderSet) { NSArray* tables = @@ -25,12 +25,13 @@ NSArray* sortedTableNames = [tables sortedArrayUsingSelector:@selector(compare:)]; NSString* idString = [NSString stringWithFormat:@"%ld", holder.identifier]; + NSDictionary* databaseInfo = @{ @"id" : idString, @"name" : holder.databaseDescriptor.name, @"tables" : sortedTableNames }; - [result setObject:databaseInfo forKey:idString]; + [result addObject:databaseInfo]; } return result; @@ -47,7 +48,12 @@ + (NSDictionary*)databaseGetTableStructureResponseToDictionary: (DatabaseGetTableStructureResponse*)response { - return @{}; + return @{ + @"structureColumns" : response.structureColumns, + @"structureValues" : response.structureValues, + @"indexesColumns" : response.indexesColumns, + @"indexesValues" : response.indexesValues + }; } + (NSDictionary*)databaseGetTableInfoResponseToDictionary: