From a441190635d494f128cf02e07566ae2003af4e08 Mon Sep 17 00:00:00 2001 From: zxu Date: Tue, 6 Feb 2018 13:51:11 -0500 Subject: Implement Firestore DatabaseInfo and port both Database{Id,Info} C++ to the iOS code (#738) * implement Firestore DatabaseInfo in C++ * temporary stash changes; blocking on the massive renaming of .m to .mm * add database_info_test to project * finish port DatabaseId and fix style, modular fixing DatabaseInfo * port DatabaseInfo * remove FSTDatabase{ID,Info} and their tests from project * fix unit test * use namespace alias * use namespace alias, leftover * address more changes * refactoring to use raw pointer instead of value for property * address changes * remove self-> * fix style * remove the name suffix Alloc * fix a bug --- Firestore/Source/API/FIRDocumentSnapshot.mm | 19 +++++++++---- Firestore/Source/API/FIRFirestore+Internal.h | 6 ++-- Firestore/Source/API/FIRFirestore.mm | 41 ++++++++++++++++++---------- Firestore/Source/API/FSTUserDataConverter.h | 11 +++++--- Firestore/Source/API/FSTUserDataConverter.mm | 24 ++++++++++------ 5 files changed, 66 insertions(+), 35 deletions(-) (limited to 'Firestore/Source/API') diff --git a/Firestore/Source/API/FIRDocumentSnapshot.mm b/Firestore/Source/API/FIRDocumentSnapshot.mm index 10709e8..ddf4cca 100644 --- a/Firestore/Source/API/FIRDocumentSnapshot.mm +++ b/Firestore/Source/API/FIRDocumentSnapshot.mm @@ -21,7 +21,6 @@ #import "Firestore/Source/API/FIRFirestore+Internal.h" #import "Firestore/Source/API/FIRSnapshotMetadata+Internal.h" #import "Firestore/Source/API/FIRSnapshotOptions+Internal.h" -#import "Firestore/Source/Model/FSTDatabaseID.h" #import "Firestore/Source/Model/FSTDocument.h" #import "Firestore/Source/Model/FSTDocumentKey.h" #import "Firestore/Source/Model/FSTFieldValue.h" @@ -29,6 +28,12 @@ #import "Firestore/Source/Util/FSTAssert.h" #import "Firestore/Source/Util/FSTUsageValidation.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/util/string_apple.h" + +namespace util = firebase::firestore::util; +using firebase::firestore::model::DatabaseId; + NS_ASSUME_NONNULL_BEGIN @interface FIRDocumentSnapshot () @@ -173,16 +178,18 @@ NS_ASSUME_NONNULL_BEGIN return [self convertedArray:(FSTArrayValue *)value options:options]; } else if ([value isKindOfClass:[FSTReferenceValue class]]) { FSTReferenceValue *ref = (FSTReferenceValue *)value; - FSTDatabaseID *refDatabase = ref.databaseID; - FSTDatabaseID *database = self.firestore.databaseID; - if (![refDatabase isEqualToDatabaseId:database]) { + const DatabaseId *refDatabase = ref.databaseID; + const DatabaseId *database = self.firestore.databaseID; + if (*refDatabase != *database) { // TODO(b/32073923): Log this as a proper warning. NSLog( @"WARNING: Document %@ contains a document reference within a different database " "(%@/%@) which is not supported. It will be treated as a reference within the " "current database (%@/%@) instead.", - self.reference.path, refDatabase.projectID, refDatabase.databaseID, database.projectID, - database.databaseID); + self.reference.path, util::WrapNSStringNoCopy(refDatabase->project_id()), + util::WrapNSStringNoCopy(refDatabase->database_id()), + util::WrapNSStringNoCopy(database->project_id()), + util::WrapNSStringNoCopy(database->database_id())); } return [FIRDocumentReference referenceWithKey:[ref valueWithOptions:options] firestore:self.firestore]; diff --git a/Firestore/Source/API/FIRFirestore+Internal.h b/Firestore/Source/API/FIRFirestore+Internal.h index c2e995a..717a08b 100644 --- a/Firestore/Source/API/FIRFirestore+Internal.h +++ b/Firestore/Source/API/FIRFirestore+Internal.h @@ -16,9 +16,10 @@ #import "FIRFirestore.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + NS_ASSUME_NONNULL_BEGIN -@class FSTDatabaseID; @class FSTDispatchQueue; @class FSTFirestoreClient; @class FSTUserDataConverter; @@ -54,7 +55,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)shutdownWithCompletion:(nullable void (^)(NSError *_Nullable error))completion NS_SWIFT_NAME(shutdown(completion:)); -@property(nonatomic, strong, readonly) FSTDatabaseID *databaseID; +// FIRFirestore ownes the DatabaseId instance. +@property(nonatomic, assign, readonly) const firebase::firestore::model::DatabaseId *databaseID; @property(nonatomic, strong, readonly) FSTFirestoreClient *client; @property(nonatomic, strong, readonly) FSTUserDataConverter *dataConverter; diff --git a/Firestore/Source/API/FIRFirestore.mm b/Firestore/Source/API/FIRFirestore.mm index 10367bd..5e978cc 100644 --- a/Firestore/Source/API/FIRFirestore.mm +++ b/Firestore/Source/API/FIRFirestore.mm @@ -29,9 +29,7 @@ #import "Firestore/Source/API/FSTUserDataConverter.h" #import "Firestore/Source/Auth/FSTCredentialsProvider.h" -#import "Firestore/Source/Core/FSTDatabaseInfo.h" #import "Firestore/Source/Core/FSTFirestoreClient.h" -#import "Firestore/Source/Model/FSTDatabaseID.h" #import "Firestore/Source/Model/FSTDocumentKey.h" #import "Firestore/Source/Model/FSTPath.h" #import "Firestore/Source/Util/FSTAssert.h" @@ -39,13 +37,23 @@ #import "Firestore/Source/Util/FSTLogger.h" #import "Firestore/Source/Util/FSTUsageValidation.h" +#include "Firestore/core/src/firebase/firestore/core/database_info.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/util/string_apple.h" + +namespace util = firebase::firestore::util; +using firebase::firestore::core::DatabaseInfo; +using firebase::firestore::model::DatabaseId; + NS_ASSUME_NONNULL_BEGIN extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; -@interface FIRFirestore () +@interface FIRFirestore () { + /** The actual owned DatabaseId instance is allocated in FIRFirestore. */ + firebase::firestore::model::DatabaseId _databaseID; +} -@property(nonatomic, strong) FSTDatabaseID *databaseID; @property(nonatomic, strong) NSString *persistenceKey; @property(nonatomic, strong) id credentialsProvider; @property(nonatomic, strong) FSTDispatchQueue *workerDispatchQueue; @@ -79,11 +87,13 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; @"Failed to get FirebaseApp instance. Please call FirebaseApp.configure() " @"before using Firestore"); } - return [self firestoreForApp:app database:kDefaultDatabaseID]; + return + [self firestoreForApp:app database:util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId)]; } + (instancetype)firestoreForApp:(FIRApp *)app { - return [self firestoreForApp:app database:kDefaultDatabaseID]; + return + [self firestoreForApp:app database:util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId)]; } // TODO(b/62410906): make this public @@ -97,7 +107,7 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; FSTThrowInvalidArgument( @"database identifier may not be nil. Use '%@' if you want the default " "database", - kDefaultDatabaseID); + util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId)); } NSString *key = [NSString stringWithFormat:@"%@|%@", app.name, database]; @@ -136,7 +146,7 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue firebaseApp:(FIRApp *)app { if (self = [super init]) { - _databaseID = [FSTDatabaseID databaseIDWithProject:projectID database:database]; + _databaseID = DatabaseId(util::MakeStringView(projectID), util::MakeStringView(database)); FSTPreConverterBlock block = ^id _Nullable(id _Nullable input) { if ([input isKindOfClass:[FIRDocumentReference class]]) { FIRDocumentReference *documentReference = (FIRDocumentReference *)input; @@ -147,7 +157,7 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; } }; _dataConverter = - [[FSTUserDataConverter alloc] initWithDatabaseID:_databaseID preConverter:block]; + [[FSTUserDataConverter alloc] initWithDatabaseID:&_databaseID preConverter:block]; _persistenceKey = persistenceKey; _credentialsProvider = credentialsProvider; _workerDispatchQueue = workerDispatchQueue; @@ -193,15 +203,12 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; FSTAssert(_settings.host, @"FirestoreSettings.host cannot be nil."); FSTAssert(_settings.dispatchQueue, @"FirestoreSettings.dispatchQueue cannot be nil."); - FSTDatabaseInfo *databaseInfo = - [FSTDatabaseInfo databaseInfoWithDatabaseID:_databaseID - persistenceKey:_persistenceKey - host:_settings.host - sslEnabled:_settings.sslEnabled]; + const DatabaseInfo database_info(*self.databaseID, util::MakeStringView(_persistenceKey), + util::MakeStringView(_settings.host), _settings.sslEnabled); FSTDispatchQueue *userDispatchQueue = [FSTDispatchQueue queueWith:_settings.dispatchQueue]; - _client = [FSTFirestoreClient clientWithDatabaseInfo:databaseInfo + _client = [FSTFirestoreClient clientWithDatabaseInfo:database_info usePersistence:_settings.persistenceEnabled credentialsProvider:_credentialsProvider userDispatchQueue:userDispatchQueue @@ -312,6 +319,10 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain"; [self.client disableNetworkWithCompletion:completion]; } +- (const DatabaseId *)databaseID { + return &_databaseID; +} + @end NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/API/FSTUserDataConverter.h b/Firestore/Source/API/FSTUserDataConverter.h index 2c52ad8..1058848 100644 --- a/Firestore/Source/API/FSTUserDataConverter.h +++ b/Firestore/Source/API/FSTUserDataConverter.h @@ -16,8 +16,9 @@ #import +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + @class FIRSetOptions; -@class FSTDatabaseID; @class FSTDocumentKey; @class FSTObjectValue; @class FSTFieldMask; @@ -87,10 +88,12 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithKey:(FSTDocumentKey *)key - databaseID:(FSTDatabaseID *)databaseID NS_DESIGNATED_INITIALIZER; + databaseID:(const firebase::firestore::model::DatabaseId *)databaseID + NS_DESIGNATED_INITIALIZER; @property(nonatomic, strong, readonly) FSTDocumentKey *key; -@property(nonatomic, strong, readonly) FSTDatabaseID *databaseID; +// Does not own the DatabaseId instance. +@property(nonatomic, assign, readonly) const firebase::firestore::model::DatabaseId *databaseID; @end @@ -107,7 +110,7 @@ typedef id _Nullable (^FSTPreConverterBlock)(id _Nullable); @interface FSTUserDataConverter : NSObject - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithDatabaseID:(FSTDatabaseID *)databaseID +- (instancetype)initWithDatabaseID:(const firebase::firestore::model::DatabaseId *)databaseID preConverter:(FSTPreConverterBlock)preConverter NS_DESIGNATED_INITIALIZER; /** Parse document data from a non-merge setData call.*/ diff --git a/Firestore/Source/API/FSTUserDataConverter.mm b/Firestore/Source/API/FSTUserDataConverter.mm index 414aadb..80d4625 100644 --- a/Firestore/Source/API/FSTUserDataConverter.mm +++ b/Firestore/Source/API/FSTUserDataConverter.mm @@ -23,7 +23,6 @@ #import "Firestore/Source/API/FIRFirestore+Internal.h" #import "Firestore/Source/API/FIRSetOptions+Internal.h" #import "Firestore/Source/Core/FSTTimestamp.h" -#import "Firestore/Source/Model/FSTDatabaseID.h" #import "Firestore/Source/Model/FSTDocumentKey.h" #import "Firestore/Source/Model/FSTFieldValue.h" #import "Firestore/Source/Model/FSTMutation.h" @@ -31,6 +30,12 @@ #import "Firestore/Source/Util/FSTAssert.h" #import "Firestore/Source/Util/FSTUsageValidation.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "Firestore/core/src/firebase/firestore/util/string_apple.h" + +namespace util = firebase::firestore::util; +using firebase::firestore::model::DatabaseId; + NS_ASSUME_NONNULL_BEGIN static NSString *const RESERVED_FIELD_DESIGNATOR = @"__"; @@ -271,7 +276,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { @implementation FSTDocumentKeyReference -- (instancetype)initWithKey:(FSTDocumentKey *)key databaseID:(FSTDatabaseID *)databaseID { +- (instancetype)initWithKey:(FSTDocumentKey *)key databaseID:(const DatabaseId *)databaseID { self = [super init]; if (self) { _key = key; @@ -285,13 +290,14 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { #pragma mark - FSTUserDataConverter @interface FSTUserDataConverter () -@property(strong, nonatomic, readonly) FSTDatabaseID *databaseID; +// Does not own the DatabaseId instance. +@property(assign, nonatomic, readonly) const DatabaseId *databaseID; @property(strong, nonatomic, readonly) FSTPreConverterBlock preConverter; @end @implementation FSTUserDataConverter -- (instancetype)initWithDatabaseID:(FSTDatabaseID *)databaseID +- (instancetype)initWithDatabaseID:(const DatabaseId *)databaseID preConverter:(FSTPreConverterBlock)preConverter { self = [super init]; if (self) { @@ -540,12 +546,14 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) { } else if ([input isKindOfClass:[FSTDocumentKeyReference class]]) { FSTDocumentKeyReference *reference = input; - if (![reference.databaseID isEqual:self.databaseID]) { - FSTDatabaseID *other = reference.databaseID; + if (*reference.databaseID != *self.databaseID) { + const DatabaseId *other = reference.databaseID; FSTThrowInvalidArgument( @"Document Reference is for database %@/%@ but should be for database %@/%@%@", - other.projectID, other.databaseID, self.databaseID.projectID, self.databaseID.databaseID, - [context fieldDescription]); + util::WrapNSStringNoCopy(other->project_id()), + util::WrapNSStringNoCopy(other->database_id()), + util::WrapNSStringNoCopy(self.databaseID->project_id()), + util::WrapNSStringNoCopy(self.databaseID->database_id()), [context fieldDescription]); } return [FSTReferenceValue referenceValue:reference.key databaseID:self.databaseID]; -- cgit v1.2.3