diff options
Diffstat (limited to 'Firestore/Source')
25 files changed, 243 insertions, 393 deletions
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<FSTCredentialsProvider> 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 <Foundation/Foundation.h> +#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]; diff --git a/Firestore/Source/Core/FSTDatabaseInfo.h b/Firestore/Source/Core/FSTDatabaseInfo.h deleted file mode 100644 index fae884f..0000000 --- a/Firestore/Source/Core/FSTDatabaseInfo.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import <Foundation/Foundation.h> - -@class FSTDatabaseID; - -NS_ASSUME_NONNULL_BEGIN - -/** FSTDatabaseInfo contains data about the database. */ -@interface FSTDatabaseInfo : NSObject - -/** - * Creates and returns a new FSTDatabaseInfo. - * - * @param databaseID The project/database to use. - * @param persistenceKey A unique identifier for this Firestore's local storage. Usually derived - * from -[FIRApp appName]. - * @param host The hostname of the datastore backend. - * @param sslEnabled Whether to use SSL when connecting. - * @return A new instance of FSTDatabaseInfo. - */ -+ (instancetype)databaseInfoWithDatabaseID:(FSTDatabaseID *)databaseID - persistenceKey:(NSString *)persistenceKey - host:(NSString *)host - sslEnabled:(BOOL)sslEnabled; - -/** The database info. */ -@property(nonatomic, strong, readonly) FSTDatabaseID *databaseID; - -/** The application name, taken from FIRApp. */ -@property(nonatomic, copy, readonly) NSString *persistenceKey; - -/** The hostname of the backend. */ -@property(nonatomic, copy, readonly) NSString *host; - -/** Whether to use SSL when connecting. */ -@property(nonatomic, readonly, getter=isSSLEnabled) BOOL sslEnabled; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Core/FSTDatabaseInfo.mm b/Firestore/Source/Core/FSTDatabaseInfo.mm deleted file mode 100644 index 2dbe61a..0000000 --- a/Firestore/Source/Core/FSTDatabaseInfo.mm +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "Firestore/Source/Core/FSTDatabaseInfo.h" - -#import "Firestore/Source/Model/FSTDatabaseID.h" - -NS_ASSUME_NONNULL_BEGIN - -#pragma mark - FSTDatabaseInfo - -@implementation FSTDatabaseInfo - -#pragma mark - Constructors - -+ (instancetype)databaseInfoWithDatabaseID:(FSTDatabaseID *)databaseID - persistenceKey:(NSString *)persistenceKey - host:(NSString *)host - sslEnabled:(BOOL)sslEnabled { - return [[FSTDatabaseInfo alloc] initWithDatabaseID:databaseID - persistenceKey:persistenceKey - host:host - sslEnabled:sslEnabled]; -} - -/** - * Designated initializer. - * - * @param databaseID The database in the datastore. - * @param persistenceKey A unique identifier for this Firestore's local storage. Usually derived - * from -[FIRApp appName]. - * @param host The Firestore server hostname. - * @param sslEnabled Whether to use SSL when connecting. - */ -- (instancetype)initWithDatabaseID:(FSTDatabaseID *)databaseID - persistenceKey:(NSString *)persistenceKey - host:(NSString *)host - sslEnabled:(BOOL)sslEnabled { - if (self = [super init]) { - _databaseID = databaseID; - _persistenceKey = [persistenceKey copy]; - _host = [host copy]; - _sslEnabled = sslEnabled; - } - return self; -} - -#pragma mark - NSObject methods - -- (NSString *)description { - return [NSString - stringWithFormat:@"<FSTDatabaseInfo: databaseID:%@ host:%@>", self.databaseID, self.host]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Core/FSTFirestoreClient.h b/Firestore/Source/Core/FSTFirestoreClient.h index 0ecf2f6..56101ab 100644 --- a/Firestore/Source/Core/FSTFirestoreClient.h +++ b/Firestore/Source/Core/FSTFirestoreClient.h @@ -20,8 +20,9 @@ #import "Firestore/Source/Core/FSTViewSnapshot.h" #import "Firestore/Source/Remote/FSTRemoteStore.h" -@class FSTDatabaseID; -@class FSTDatabaseInfo; +#include "Firestore/core/src/firebase/firestore/core/database_info.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + @class FSTDispatchQueue; @class FSTDocument; @class FSTListenOptions; @@ -45,7 +46,7 @@ NS_ASSUME_NONNULL_BEGIN * * All callbacks and events will be triggered on the provided userDispatchQueue. */ -+ (instancetype)clientWithDatabaseInfo:(FSTDatabaseInfo *)databaseInfo ++ (instancetype)clientWithDatabaseInfo:(const firebase::firestore::core::DatabaseInfo &)databaseInfo usePersistence:(BOOL)usePersistence credentialsProvider:(id<FSTCredentialsProvider>)credentialsProvider userDispatchQueue:(FSTDispatchQueue *)userDispatchQueue @@ -80,7 +81,8 @@ NS_ASSUME_NONNULL_BEGIN completion:(FSTVoidIDErrorBlock)completion; /** The database ID of the databaseInfo this client was initialized with. */ -@property(nonatomic, strong, readonly) FSTDatabaseID *databaseID; +// Ownes a DatabaseInfo instance, which contains the id here. +@property(nonatomic, assign, readonly) const firebase::firestore::model::DatabaseId *databaseID; /** * Dispatch queue for user callbacks / events. This will often be the "Main Dispatch Queue" of the diff --git a/Firestore/Source/Core/FSTFirestoreClient.mm b/Firestore/Source/Core/FSTFirestoreClient.mm index 5986b5b..1961460 100644 --- a/Firestore/Source/Core/FSTFirestoreClient.mm +++ b/Firestore/Source/Core/FSTFirestoreClient.mm @@ -17,7 +17,6 @@ #import "Firestore/Source/Core/FSTFirestoreClient.h" #import "Firestore/Source/Auth/FSTCredentialsProvider.h" -#import "Firestore/Source/Core/FSTDatabaseInfo.h" #import "Firestore/Source/Core/FSTEventManager.h" #import "Firestore/Source/Core/FSTSyncEngine.h" #import "Firestore/Source/Core/FSTTransaction.h" @@ -35,16 +34,26 @@ #import "Firestore/Source/Util/FSTDispatchQueue.h" #import "Firestore/Source/Util/FSTLogger.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" + +using firebase::firestore::core::DatabaseInfo; +using firebase::firestore::model::DatabaseId; + NS_ASSUME_NONNULL_BEGIN -@interface FSTFirestoreClient () -- (instancetype)initWithDatabaseInfo:(FSTDatabaseInfo *)databaseInfo +@interface FSTFirestoreClient () { + DatabaseInfo _databaseInfo; +} + +- (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo usePersistence:(BOOL)usePersistence credentialsProvider:(id<FSTCredentialsProvider>)credentialsProvider userDispatchQueue:(FSTDispatchQueue *)userDispatchQueue workerDispatchQueue:(FSTDispatchQueue *)queue NS_DESIGNATED_INITIALIZER; -@property(nonatomic, strong, readonly) FSTDatabaseInfo *databaseInfo; +@property(nonatomic, assign, readonly) const DatabaseInfo *databaseInfo; @property(nonatomic, strong, readonly) FSTEventManager *eventManager; @property(nonatomic, strong, readonly) id<FSTPersistence> persistence; @property(nonatomic, strong, readonly) FSTSyncEngine *syncEngine; @@ -65,7 +74,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation FSTFirestoreClient -+ (instancetype)clientWithDatabaseInfo:(FSTDatabaseInfo *)databaseInfo ++ (instancetype)clientWithDatabaseInfo:(const DatabaseInfo &)databaseInfo usePersistence:(BOOL)usePersistence credentialsProvider:(id<FSTCredentialsProvider>)credentialsProvider userDispatchQueue:(FSTDispatchQueue *)userDispatchQueue @@ -77,7 +86,7 @@ NS_ASSUME_NONNULL_BEGIN workerDispatchQueue:workerDispatchQueue]; } -- (instancetype)initWithDatabaseInfo:(FSTDatabaseInfo *)databaseInfo +- (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo usePersistence:(BOOL)usePersistence credentialsProvider:(id<FSTCredentialsProvider>)credentialsProvider userDispatchQueue:(FSTDispatchQueue *)userDispatchQueue @@ -130,11 +139,11 @@ NS_ASSUME_NONNULL_BEGIN // enabled. garbageCollector = [[FSTNoOpGarbageCollector alloc] init]; - NSString *dir = [FSTLevelDB storageDirectoryForDatabaseInfo:self.databaseInfo + NSString *dir = [FSTLevelDB storageDirectoryForDatabaseInfo:*self.databaseInfo documentsDirectory:[FSTLevelDB documentsDirectory]]; FSTSerializerBeta *remoteSerializer = - [[FSTSerializerBeta alloc] initWithDatabaseID:self.databaseInfo.databaseID]; + [[FSTSerializerBeta alloc] initWithDatabaseID:&self.databaseInfo->database_id()]; FSTLocalSerializer *serializer = [[FSTLocalSerializer alloc] initWithRemoteSerializer:remoteSerializer]; @@ -291,8 +300,12 @@ NS_ASSUME_NONNULL_BEGIN }]; } -- (FSTDatabaseID *)databaseID { - return self.databaseInfo.databaseID; +- (const DatabaseInfo *)databaseInfo { + return &_databaseInfo; +} + +- (const DatabaseId *)databaseID { + return &_databaseInfo.database_id(); } @end diff --git a/Firestore/Source/Core/FSTSyncEngine.mm b/Firestore/Source/Core/FSTSyncEngine.mm index d82cc99..d6ee956 100644 --- a/Firestore/Source/Core/FSTSyncEngine.mm +++ b/Firestore/Source/Core/FSTSyncEngine.mm @@ -42,6 +42,8 @@ #include "Firestore/core/src/firebase/firestore/core/target_id_generator.h" +using firebase::firestore::core::TargetIdGenerator; + NS_ASSUME_NONNULL_BEGIN // Limbo documents don't use persistence, and are eagerly GC'd. So, listens for them don't need @@ -148,7 +150,7 @@ static const FSTListenSequenceNumber kIrrelevantSequenceNumber = -1; @implementation FSTSyncEngine { /** Used for creating the FSTTargetIDs for the listens used to resolve limbo documents. */ - firebase::firestore::core::TargetIdGenerator _targetIdGenerator; + TargetIdGenerator _targetIdGenerator; } - (instancetype)initWithLocalStore:(FSTLocalStore *)localStore @@ -168,8 +170,7 @@ static const FSTListenSequenceNumber kIrrelevantSequenceNumber = -1; [_limboCollector addGarbageSource:_limboDocumentRefs]; _mutationCompletionBlocks = [NSMutableDictionary dictionary]; - _targetIdGenerator = - firebase::firestore::core::TargetIdGenerator::SyncEngineTargetIdGenerator(0); + _targetIdGenerator = TargetIdGenerator::SyncEngineTargetIdGenerator(0); _currentUser = initialUser; } return self; diff --git a/Firestore/Source/Local/FSTLevelDB.h b/Firestore/Source/Local/FSTLevelDB.h index 520557a..77abb3d 100644 --- a/Firestore/Source/Local/FSTLevelDB.h +++ b/Firestore/Source/Local/FSTLevelDB.h @@ -19,9 +19,9 @@ #include <memory> #import "Firestore/Source/Local/FSTPersistence.h" +#include "Firestore/core/src/firebase/firestore/core/database_info.h" #include "leveldb/db.h" -@class FSTDatabaseInfo; @class FSTLocalSerializer; NS_ASSUME_NONNULL_BEGIN @@ -50,7 +50,8 @@ NS_ASSUME_NONNULL_BEGIN * will be created. Usually just +[FSTLevelDB documentsDir]. * @return A storage directory unique to the instance identified by databaseInfo. */ -+ (NSString *)storageDirectoryForDatabaseInfo:(FSTDatabaseInfo *)databaseInfo ++ (NSString *)storageDirectoryForDatabaseInfo: + (const firebase::firestore::core::DatabaseInfo &)databaseInfo documentsDirectory:(NSString *)documentsDirectory; /** diff --git a/Firestore/Source/Local/FSTLevelDB.mm b/Firestore/Source/Local/FSTLevelDB.mm index d163ed5..7fb3a66 100644 --- a/Firestore/Source/Local/FSTLevelDB.mm +++ b/Firestore/Source/Local/FSTLevelDB.mm @@ -19,18 +19,24 @@ #include <leveldb/db.h> #import "FIRFirestoreErrors.h" -#import "Firestore/Source/Core/FSTDatabaseInfo.h" #import "Firestore/Source/Local/FSTLevelDBMigrations.h" #import "Firestore/Source/Local/FSTLevelDBMutationQueue.h" #import "Firestore/Source/Local/FSTLevelDBQueryCache.h" #import "Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.h" #import "Firestore/Source/Local/FSTWriteGroup.h" #import "Firestore/Source/Local/FSTWriteGroupTracker.h" -#import "Firestore/Source/Model/FSTDatabaseID.h" #import "Firestore/Source/Remote/FSTSerializerBeta.h" #import "Firestore/Source/Util/FSTAssert.h" #import "Firestore/Source/Util/FSTLogger.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 static NSString *const kReservedPathComponent = @"firestore"; @@ -89,7 +95,7 @@ using leveldb::WriteOptions; #endif } -+ (NSString *)storageDirectoryForDatabaseInfo:(FSTDatabaseInfo *)databaseInfo ++ (NSString *)storageDirectoryForDatabaseInfo:(const DatabaseInfo &)databaseInfo documentsDirectory:(NSString *)documentsDirectory { // Use two different path formats: // @@ -99,11 +105,14 @@ using leveldb::WriteOptions; // projectIDs are DNS-compatible names and cannot contain dots so there's // no danger of collisions. NSString *directory = documentsDirectory; - directory = [directory stringByAppendingPathComponent:databaseInfo.persistenceKey]; - - NSString *segment = databaseInfo.databaseID.projectID; - if (![databaseInfo.databaseID isDefaultDatabase]) { - segment = [NSString stringWithFormat:@"%@.%@", segment, databaseInfo.databaseID.databaseID]; + directory = [directory + stringByAppendingPathComponent:util::WrapNSStringNoCopy(databaseInfo.persistence_key())]; + + NSString *segment = util::WrapNSStringNoCopy(databaseInfo.database_id().project_id()); + if (!databaseInfo.database_id().IsDefaultDatabase()) { + segment = [NSString + stringWithFormat:@"%@.%@", segment, + util::WrapNSStringNoCopy(databaseInfo.database_id().database_id())]; } directory = [directory stringByAppendingPathComponent:segment]; diff --git a/Firestore/Source/Local/FSTLevelDBMutationQueue.mm b/Firestore/Source/Local/FSTLevelDBMutationQueue.mm index dbe58e8..85f163d 100644 --- a/Firestore/Source/Local/FSTLevelDBMutationQueue.mm +++ b/Firestore/Source/Local/FSTLevelDBMutationQueue.mm @@ -38,6 +38,7 @@ NS_ASSUME_NONNULL_BEGIN +namespace util = firebase::firestore::util; using Firestore::StringView; using leveldb::DB; using leveldb::Iterator; @@ -162,7 +163,7 @@ static ReadOptions StandardReadOptions() { while (moreUserIDs) { // Compute the first key after the last mutation for nextUserID. auto userEnd = [FSTLevelDBMutationKey keyPrefixWithUserID:nextUserID]; - userEnd = firebase::firestore::util::PrefixSuccessor(userEnd); + userEnd = util::PrefixSuccessor(userEnd); // Seek to that key with the intent of finding the boundary between nextUserID's mutations // and the one after that (if any). diff --git a/Firestore/Source/Local/FSTLocalStore.mm b/Firestore/Source/Local/FSTLocalStore.mm index fa77e37..d30177a 100644 --- a/Firestore/Source/Local/FSTLocalStore.mm +++ b/Firestore/Source/Local/FSTLocalStore.mm @@ -43,6 +43,8 @@ #include "Firestore/core/src/firebase/firestore/core/target_id_generator.h" +using firebase::firestore::core::TargetIdGenerator; + NS_ASSUME_NONNULL_BEGIN @interface FSTLocalStore () @@ -92,7 +94,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation FSTLocalStore { /** Used to generate targetIDs for queries tracked locally. */ - firebase::firestore::core::TargetIdGenerator _targetIDGenerator; + TargetIdGenerator _targetIDGenerator; } - (instancetype)initWithPersistence:(id<FSTPersistence>)persistence @@ -115,8 +117,7 @@ NS_ASSUME_NONNULL_BEGIN _targetIDs = [NSMutableDictionary dictionary]; _heldBatchResults = [NSMutableArray array]; - _targetIDGenerator = - firebase::firestore::core::TargetIdGenerator::LocalStoreTargetIdGenerator(0); + _targetIDGenerator = TargetIdGenerator::LocalStoreTargetIdGenerator(0); } return self; } @@ -154,8 +155,7 @@ NS_ASSUME_NONNULL_BEGIN [self.queryCache start]; FSTTargetID targetID = [self.queryCache highestTargetID]; - _targetIDGenerator = - firebase::firestore::core::TargetIdGenerator::LocalStoreTargetIdGenerator(targetID); + _targetIDGenerator = TargetIdGenerator::LocalStoreTargetIdGenerator(targetID); FSTListenSequenceNumber sequenceNumber = [self.queryCache highestListenSequenceNumber]; self.listenSequence = [[FSTListenSequence alloc] initStartingAfter:sequenceNumber]; } diff --git a/Firestore/Source/Model/FSTDatabaseID.h b/Firestore/Source/Model/FSTDatabaseID.h deleted file mode 100644 index 442e764..0000000 --- a/Firestore/Source/Model/FSTDatabaseID.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import <Foundation/Foundation.h> - -NS_ASSUME_NONNULL_BEGIN - -/** FSTDatabaseID represents a particular database in the datastore. */ -@interface FSTDatabaseID : NSObject - -/** - * Creates and returns a new FSTDatabaseID. - * @param projectID The project for the database. - * @param databaseID The database in the project to use. - * @return A new instance of FSTDatabaseID. - */ -+ (instancetype)databaseIDWithProject:(NSString *)projectID database:(NSString *)databaseID; - -/** The project. */ -@property(nonatomic, copy, readonly) NSString *projectID; - -/** The database. */ -@property(nonatomic, copy, readonly) NSString *databaseID; - -/** Whether this is the default database of the project. */ -- (BOOL)isDefaultDatabase; - -- (NSComparisonResult)compare:(FSTDatabaseID *)other; -- (BOOL)isEqualToDatabaseId:(FSTDatabaseID *)databaseID; - -@end - -extern NSString *const kDefaultDatabaseID; - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Model/FSTDatabaseID.mm b/Firestore/Source/Model/FSTDatabaseID.mm deleted file mode 100644 index bff5855..0000000 --- a/Firestore/Source/Model/FSTDatabaseID.mm +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "Firestore/Source/Model/FSTDatabaseID.h" - -#import "Firestore/Source/Util/FSTAssert.h" - -NS_ASSUME_NONNULL_BEGIN - -/** The default name for "unset" database ID in resource names. */ -NSString *const kDefaultDatabaseID = @"(default)"; - -#pragma mark - FSTDatabaseID - -@implementation FSTDatabaseID - -+ (instancetype)databaseIDWithProject:(NSString *)projectID database:(NSString *)databaseID { - return [[FSTDatabaseID alloc] initWithProject:projectID database:databaseID]; -} - -/** - * Designated initializer. - * - * @param projectID The project for the database. - * @param databaseID The database in the datastore. - */ -- (instancetype)initWithProject:(NSString *)projectID database:(NSString *)databaseID { - if (self = [super init]) { - FSTAssert(databaseID, @"databaseID cannot be nil"); - _projectID = [projectID copy]; - _databaseID = [databaseID copy]; - } - return self; -} - -- (BOOL)isEqual:(id)other { - if (other == self) return YES; - if (![[other class] isEqual:[self class]]) return NO; - - return [self isEqualToDatabaseId:other]; -} - -- (NSUInteger)hash { - NSUInteger hash = [self.projectID hash]; - hash = hash * 31u + [self.databaseID hash]; - return hash; -} - -- (NSString *)description { - return [NSString - stringWithFormat:@"<FSTDatabaseID: project:%@ database:%@>", self.projectID, self.databaseID]; -} - -- (NSComparisonResult)compare:(FSTDatabaseID *)other { - NSComparisonResult cmp = [self.projectID compare:other.projectID]; - return cmp == NSOrderedSame ? [self.databaseID compare:other.databaseID] : cmp; -} - -- (BOOL)isDefaultDatabase { - return [self.databaseID isEqualToString:kDefaultDatabaseID]; -} - -- (BOOL)isEqualToDatabaseId:(FSTDatabaseID *)databaseID { - if (self == databaseID) return YES; - if (databaseID == nil) return NO; - if (self.projectID != databaseID.projectID && - ![self.projectID isEqualToString:databaseID.projectID]) - return NO; - if (self.databaseID != databaseID.databaseID && - ![self.databaseID isEqualToString:databaseID.databaseID]) - return NO; - return YES; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/Model/FSTFieldValue.h b/Firestore/Source/Model/FSTFieldValue.h index 93fd5c4..c8118c6 100644 --- a/Firestore/Source/Model/FSTFieldValue.h +++ b/Firestore/Source/Model/FSTFieldValue.h @@ -18,7 +18,8 @@ #import "Firestore/third_party/Immutable/FSTImmutableSortedDictionary.h" -@class FSTDatabaseID; +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + @class FSTDocumentKey; @class FSTFieldPath; @class FSTTimestamp; @@ -208,9 +209,11 @@ typedef NS_ENUM(NSInteger, FSTServerTimestampBehavior) { * A reference value stored in Firestore. */ @interface FSTReferenceValue : FSTFieldValue <FSTDocumentKey *> -+ (instancetype)referenceValue:(FSTDocumentKey *)value databaseID:(FSTDatabaseID *)databaseID; ++ (instancetype)referenceValue:(FSTDocumentKey *)value + databaseID:(const firebase::firestore::model::DatabaseId *)databaseID; - (FSTDocumentKey *)valueWithOptions:(FSTFieldValueOptions *)options; -@property(nonatomic, strong, readonly) FSTDatabaseID *databaseID; +// Does not own this DatabaseId. +@property(nonatomic, assign, readonly) const firebase::firestore::model::DatabaseId *databaseID; @end /** diff --git a/Firestore/Source/Model/FSTFieldValue.mm b/Firestore/Source/Model/FSTFieldValue.mm index 8ffc98e..3f3548c 100644 --- a/Firestore/Source/Model/FSTFieldValue.mm +++ b/Firestore/Source/Model/FSTFieldValue.mm @@ -22,12 +22,16 @@ #import "Firestore/Source/API/FIRGeoPoint+Internal.h" #import "Firestore/Source/API/FIRSnapshotOptions+Internal.h" #import "Firestore/Source/Core/FSTTimestamp.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" #import "Firestore/Source/Util/FSTClasses.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; using firebase::firestore::util::Comparator; using firebase::firestore::util::CompareMixedNumber; using firebase::firestore::util::DoubleBitwiseEquals; @@ -650,11 +654,11 @@ static NSComparisonResult CompareBytes(NSData *left, NSData *right) { @implementation FSTReferenceValue -+ (instancetype)referenceValue:(FSTDocumentKey *)value databaseID:(FSTDatabaseID *)databaseID { ++ (instancetype)referenceValue:(FSTDocumentKey *)value databaseID:(const DatabaseId *)databaseID { return [[FSTReferenceValue alloc] initWithValue:value databaseID:databaseID]; } -- (id)initWithValue:(FSTDocumentKey *)value databaseID:(FSTDatabaseID *)databaseID { +- (id)initWithValue:(FSTDocumentKey *)value databaseID:(const DatabaseId *)databaseID { self = [super init]; if (self) { _key = value; @@ -680,12 +684,11 @@ static NSComparisonResult CompareBytes(NSData *left, NSData *right) { } FSTReferenceValue *otherRef = (FSTReferenceValue *)other; - return [self.key isEqualToKey:otherRef.key] && - [self.databaseID isEqualToDatabaseId:otherRef.databaseID]; + return [self.key isEqualToKey:otherRef.key] && *self.databaseID == *otherRef.databaseID; } - (NSUInteger)hash { - NSUInteger result = [self.databaseID hash]; + NSUInteger result = self.databaseID->Hash(); result = 31 * result + [self.key hash]; return result; } @@ -693,7 +696,13 @@ static NSComparisonResult CompareBytes(NSData *left, NSData *right) { - (NSComparisonResult)compare:(FSTFieldValue *)other { if ([other isKindOfClass:[FSTReferenceValue class]]) { FSTReferenceValue *ref = (FSTReferenceValue *)other; - NSComparisonResult cmp = [self.databaseID compare:ref.databaseID]; + NSComparisonResult cmp = [util::WrapNSStringNoCopy(self.databaseID->project_id()) + compare:util::WrapNSStringNoCopy(ref.databaseID->project_id())]; + if (cmp != NSOrderedSame) { + return cmp; + } + cmp = [util::WrapNSStringNoCopy(self.databaseID->database_id()) + compare:util::WrapNSStringNoCopy(ref.databaseID->database_id())]; return cmp != NSOrderedSame ? cmp : [self.key compare:ref.key]; } else { return [self defaultCompare:other]; diff --git a/Firestore/Source/Remote/FSTDatastore.h b/Firestore/Source/Remote/FSTDatastore.h index 13d9eda..9edaf96 100644 --- a/Firestore/Source/Remote/FSTDatastore.h +++ b/Firestore/Source/Remote/FSTDatastore.h @@ -18,7 +18,9 @@ #import "Firestore/Source/Core/FSTTypes.h" -@class FSTDatabaseInfo; +#include "Firestore/core/src/firebase/firestore/core/database_info.h" +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + @class FSTDocumentKey; @class FSTDispatchQueue; @class FSTMutation; @@ -33,7 +35,6 @@ @class GRXWriter; @protocol FSTCredentialsProvider; -@class FSTDatabaseID; NS_ASSUME_NONNULL_BEGIN @@ -52,13 +53,13 @@ NS_ASSUME_NONNULL_BEGIN @interface FSTDatastore : NSObject /** Creates a new Datastore instance with the given database info. */ -+ (instancetype)datastoreWithDatabase:(FSTDatabaseInfo *)database ++ (instancetype)datastoreWithDatabase:(const firebase::firestore::core::DatabaseInfo *)databaseInfo workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials; - (instancetype)init __attribute__((unavailable("Use a static constructor method."))); -- (instancetype)initWithDatabaseInfo:(FSTDatabaseInfo *)databaseInfo +- (instancetype)initWithDatabaseInfo:(const firebase::firestore::core::DatabaseInfo *)databaseInfo workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials NS_DESIGNATED_INITIALIZER; @@ -81,7 +82,7 @@ NS_ASSUME_NONNULL_BEGIN /** Adds headers to the RPC including any OAuth access token if provided .*/ + (void)prepareHeadersForRPC:(GRPCCall *)rpc - databaseID:(FSTDatabaseID *)databaseID + databaseID:(const firebase::firestore::model::DatabaseId *)databaseID token:(nullable NSString *)token; /** Looks up a list of documents in datastore. */ @@ -99,7 +100,8 @@ NS_ASSUME_NONNULL_BEGIN - (FSTWriteStream *)createWriteStream; /** The name of the database and the backend. */ -@property(nonatomic, strong, readonly) FSTDatabaseInfo *databaseInfo; +// Does not own this DatabaseInfo. +@property(nonatomic, assign, readonly) const firebase::firestore::core::DatabaseInfo *databaseInfo; @end diff --git a/Firestore/Source/Remote/FSTDatastore.mm b/Firestore/Source/Remote/FSTDatastore.mm index 02d868c..8017c58 100644 --- a/Firestore/Source/Remote/FSTDatastore.mm +++ b/Firestore/Source/Remote/FSTDatastore.mm @@ -23,9 +23,7 @@ #import "Firestore/Source/API/FIRFirestore+Internal.h" #import "Firestore/Source/API/FIRFirestoreVersion.h" #import "Firestore/Source/Auth/FSTCredentialsProvider.h" -#import "Firestore/Source/Core/FSTDatabaseInfo.h" #import "Firestore/Source/Local/FSTLocalStore.h" -#import "Firestore/Source/Model/FSTDatabaseID.h" #import "Firestore/Source/Model/FSTDocument.h" #import "Firestore/Source/Model/FSTDocumentKey.h" #import "Firestore/Source/Model/FSTMutation.h" @@ -37,6 +35,14 @@ #import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.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 // GRPC does not publicly declare a means of disabling SSL, which we need for testing. Firestore @@ -71,7 +77,7 @@ typedef GRPCProtoCall * (^RPCFactory)(void); @implementation FSTDatastore -+ (instancetype)datastoreWithDatabase:(FSTDatabaseInfo *)databaseInfo ++ (instancetype)datastoreWithDatabase:(const DatabaseInfo *)databaseInfo workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials { return [[FSTDatastore alloc] initWithDatabaseInfo:databaseInfo @@ -79,25 +85,29 @@ typedef GRPCProtoCall * (^RPCFactory)(void); credentials:credentials]; } -- (instancetype)initWithDatabaseInfo:(FSTDatabaseInfo *)databaseInfo +- (instancetype)initWithDatabaseInfo:(const DatabaseInfo *)databaseInfo workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials { if (self = [super init]) { _databaseInfo = databaseInfo; - if (!databaseInfo.isSSLEnabled) { - GRPCHost *hostConfig = [GRPCHost hostWithAddress:databaseInfo.host]; + NSString *host = util::WrapNSStringNoCopy(databaseInfo->host()); + if (!databaseInfo->ssl_enabled()) { + GRPCHost *hostConfig = [GRPCHost hostWithAddress:host]; hostConfig.secure = NO; } - _service = [GCFSFirestore serviceWithHost:databaseInfo.host]; + _service = [GCFSFirestore serviceWithHost:host]; _workerDispatchQueue = workerDispatchQueue; _credentials = credentials; - _serializer = [[FSTSerializerBeta alloc] initWithDatabaseID:databaseInfo.databaseID]; + _serializer = [[FSTSerializerBeta alloc] initWithDatabaseID:&databaseInfo->database_id()]; } return self; } - (NSString *)description { - return [NSString stringWithFormat:@"<FSTDatastore: %@>", self.databaseInfo]; + return [NSString + stringWithFormat:@"<FSTDatastore: <DatabaseInfo: database_id:%@ host:%@>>", + util::WrapNSStringNoCopy(self.databaseInfo->database_id().database_id()), + util::WrapNSStringNoCopy(self.databaseInfo->host())]; } /** @@ -168,9 +178,10 @@ typedef GRPCProtoCall * (^RPCFactory)(void); } /** Returns the string to be used as google-cloud-resource-prefix header value. */ -+ (NSString *)googleCloudResourcePrefixForDatabaseID:(FSTDatabaseID *)databaseID { - return [NSString - stringWithFormat:@"projects/%@/databases/%@", databaseID.projectID, databaseID.databaseID]; ++ (NSString *)googleCloudResourcePrefixForDatabaseID:(const DatabaseId *)databaseID { + return [NSString stringWithFormat:@"projects/%@/databases/%@", + util::WrapNSStringNoCopy(databaseID->project_id()), + util::WrapNSStringNoCopy(databaseID->database_id())]; } /** * Takes a dictionary of (HTTP) response headers and returns the set of whitelisted headers @@ -298,7 +309,7 @@ typedef GRPCProtoCall * (^RPCFactory)(void); } else { GRPCProtoCall *rpc = rpcFactory(); [FSTDatastore prepareHeadersForRPC:rpc - databaseID:self.databaseInfo.databaseID + databaseID:&self.databaseInfo->database_id() token:result.token]; [rpc start]; } @@ -322,7 +333,7 @@ typedef GRPCProtoCall * (^RPCFactory)(void); /** Adds headers to the RPC including any OAuth access token if provided .*/ + (void)prepareHeadersForRPC:(GRPCCall *)rpc - databaseID:(FSTDatabaseID *)databaseID + databaseID:(const DatabaseId *)databaseID token:(nullable NSString *)token { rpc.oauth2AccessToken = token; rpc.requestHeaders[kXGoogAPIClientHeader] = [FSTDatastore googAPIClientHeaderValue]; diff --git a/Firestore/Source/Remote/FSTRemoteStore.h b/Firestore/Source/Remote/FSTRemoteStore.h index 18331ff..b5dd204 100644 --- a/Firestore/Source/Remote/FSTRemoteStore.h +++ b/Firestore/Source/Remote/FSTRemoteStore.h @@ -19,7 +19,6 @@ #import "Firestore/Source/Core/FSTTypes.h" #import "Firestore/Source/Model/FSTDocumentVersionDictionary.h" -@class FSTDatabaseInfo; @class FSTDatastore; @class FSTDocumentKey; @class FSTLocalStore; diff --git a/Firestore/Source/Remote/FSTSerializerBeta.h b/Firestore/Source/Remote/FSTSerializerBeta.h index 973f866..03e6d14 100644 --- a/Firestore/Source/Remote/FSTSerializerBeta.h +++ b/Firestore/Source/Remote/FSTSerializerBeta.h @@ -16,7 +16,8 @@ #import <Foundation/Foundation.h> -@class FSTDatabaseID; +#include "Firestore/core/src/firebase/firestore/model/database_id.h" + @class FSTDocumentKey; @class FSTFieldValue; @class FSTMaybeDocument; @@ -57,7 +58,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithDatabaseID:(FSTDatabaseID *)databaseID NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithDatabaseID:(const firebase::firestore::model::DatabaseId *)databaseID + NS_DESIGNATED_INITIALIZER; - (GPBTimestamp *)encodedTimestamp:(FSTTimestamp *)timestamp; - (FSTTimestamp *)decodedTimestamp:(GPBTimestamp *)timestamp; diff --git a/Firestore/Source/Remote/FSTSerializerBeta.mm b/Firestore/Source/Remote/FSTSerializerBeta.mm index cf200ca..35ab637 100644 --- a/Firestore/Source/Remote/FSTSerializerBeta.mm +++ b/Firestore/Source/Remote/FSTSerializerBeta.mm @@ -34,7 +34,6 @@ #import "Firestore/Source/Core/FSTSnapshotVersion.h" #import "Firestore/Source/Core/FSTTimestamp.h" #import "Firestore/Source/Local/FSTQueryData.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" @@ -45,15 +44,22 @@ #import "Firestore/Source/Remote/FSTWatchChange.h" #import "Firestore/Source/Util/FSTAssert.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 FSTSerializerBeta () -@property(nonatomic, strong, readonly) FSTDatabaseID *databaseID; +// Does not own this DatabaseId. +@property(nonatomic, assign, readonly) const DatabaseId *databaseID; @end @implementation FSTSerializerBeta -- (instancetype)initWithDatabaseID:(FSTDatabaseID *)databaseID { +- (instancetype)initWithDatabaseID:(const DatabaseId *)databaseID { self = [super init]; if (self) { _databaseID = databaseID; @@ -103,14 +109,16 @@ NS_ASSUME_NONNULL_BEGIN - (FSTDocumentKey *)decodedDocumentKey:(NSString *)name { FSTResourcePath *path = [self decodedResourcePathWithDatabaseID:name]; - FSTAssert([[path segmentAtIndex:1] isEqualToString:self.databaseID.projectID], + FSTAssert([[path segmentAtIndex:1] + isEqualToString:util::WrapNSStringNoCopy(self.databaseID->project_id())], @"Tried to deserialize key from different project."); - FSTAssert([[path segmentAtIndex:3] isEqualToString:self.databaseID.databaseID], + FSTAssert([[path segmentAtIndex:3] + isEqualToString:util::WrapNSStringNoCopy(self.databaseID->database_id())], @"Tried to deserialize key from different datbase."); return [FSTDocumentKey keyWithPath:[self localResourcePathForQualifiedResourcePath:path]]; } -- (NSString *)encodedResourcePathForDatabaseID:(FSTDatabaseID *)databaseID +- (NSString *)encodedResourcePathForDatabaseID:(const DatabaseId *)databaseID path:(FSTResourcePath *)path { return [[[[self encodedResourcePathForDatabaseID:databaseID] pathByAppendingSegment:@"documents"] pathByAppendingPath:path] canonicalString]; @@ -139,9 +147,11 @@ NS_ASSUME_NONNULL_BEGIN } } -- (FSTResourcePath *)encodedResourcePathForDatabaseID:(FSTDatabaseID *)databaseID { - return [FSTResourcePath - pathWithSegments:@[ @"projects", databaseID.projectID, @"databases", databaseID.databaseID ]]; +- (FSTResourcePath *)encodedResourcePathForDatabaseID:(const DatabaseId *)databaseID { + return [FSTResourcePath pathWithSegments:@[ + @"projects", util::WrapNSStringNoCopy(databaseID->project_id()), @"databases", + util::WrapNSStringNoCopy(databaseID->database_id()) + ]]; } - (FSTResourcePath *)localResourcePathForQualifiedResourcePath:(FSTResourcePath *)resourceName { @@ -295,8 +305,13 @@ NS_ASSUME_NONNULL_BEGIN return result; } -- (GCFSValue *)encodedReferenceValueForDatabaseID:(FSTDatabaseID *)databaseID +- (GCFSValue *)encodedReferenceValueForDatabaseID:(const DatabaseId *)databaseID key:(FSTDocumentKey *)key { + FSTAssert(*databaseID == *self.databaseID, @"Database %@:%@ cannot encode reference from %@:%@", + util::WrapNSStringNoCopy(self.databaseID->project_id()), + util::WrapNSStringNoCopy(self.databaseID->database_id()), + util::WrapNSStringNoCopy(databaseID->project_id()), + util::WrapNSStringNoCopy(databaseID->database_id())); GCFSValue *result = [GCFSValue message]; result.referenceValue = [self encodedResourcePathForDatabaseID:databaseID path:key.path]; return result; @@ -306,10 +321,16 @@ NS_ASSUME_NONNULL_BEGIN FSTResourcePath *path = [self decodedResourcePathWithDatabaseID:resourceName]; NSString *project = [path segmentAtIndex:1]; NSString *database = [path segmentAtIndex:3]; - FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:project database:database]; FSTDocumentKey *key = [FSTDocumentKey keyWithPath:[self localResourcePathForQualifiedResourcePath:path]]; - return [FSTReferenceValue referenceValue:key databaseID:databaseID]; + + const DatabaseId database_id(util::MakeStringView(project), util::MakeStringView(database)); + FSTAssert(database_id == *self.databaseID, @"Database %@:%@ cannot encode reference from %@:%@", + util::WrapNSStringNoCopy(self.databaseID->project_id()), + util::WrapNSStringNoCopy(self.databaseID->database_id()), + util::WrapNSStringNoCopy(database_id.project_id()), + util::WrapNSStringNoCopy(database_id.database_id())); + return [FSTReferenceValue referenceValue:key databaseID:self.databaseID]; } - (GCFSArrayValue *)encodedArrayValue:(FSTArrayValue *)arrayValue { diff --git a/Firestore/Source/Remote/FSTStream.h b/Firestore/Source/Remote/FSTStream.h index 546aa3d..c390dbb 100644 --- a/Firestore/Source/Remote/FSTStream.h +++ b/Firestore/Source/Remote/FSTStream.h @@ -18,7 +18,8 @@ #import "Firestore/Source/Core/FSTTypes.h" -@class FSTDatabaseInfo; +#include "Firestore/core/src/firebase/firestore/core/database_info.h" + @class FSTDocumentKey; @class FSTDispatchQueue; @class FSTMutation; @@ -88,7 +89,7 @@ NS_ASSUME_NONNULL_BEGIN */ @interface FSTStream <__covariant FSTStreamDelegate> : NSObject -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials responseMessageClass:(Class)responseMessageClass NS_DESIGNATED_INITIALIZER; @@ -197,12 +198,12 @@ NS_ASSUME_NONNULL_BEGIN /** * Initializes the watch stream with its dependencies. */ -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; @@ -271,12 +272,12 @@ NS_ASSUME_NONNULL_BEGIN /** * Initializes the write stream with its dependencies. */ -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials serializer:(FSTSerializerBeta *)serializer; -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; diff --git a/Firestore/Source/Remote/FSTStream.mm b/Firestore/Source/Remote/FSTStream.mm index dc7d01e..e5cbf87 100644 --- a/Firestore/Source/Remote/FSTStream.mm +++ b/Firestore/Source/Remote/FSTStream.mm @@ -22,9 +22,7 @@ #import "FIRFirestoreErrors.h" #import "Firestore/Source/API/FIRFirestore+Internal.h" #import "Firestore/Source/Auth/FSTCredentialsProvider.h" -#import "Firestore/Source/Core/FSTDatabaseInfo.h" #import "Firestore/Source/Local/FSTQueryData.h" -#import "Firestore/Source/Model/FSTDatabaseID.h" #import "Firestore/Source/Model/FSTMutation.h" #import "Firestore/Source/Remote/FSTBufferedWriter.h" #import "Firestore/Source/Remote/FSTExponentialBackoff.h" @@ -37,6 +35,14 @@ #import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.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; + /** * Initial backoff time in seconds after an error. * Set to 1s according to https://cloud.google.com/apis/design/errors. @@ -93,12 +99,12 @@ typedef NS_ENUM(NSInteger, FSTStreamState) { /** * Initializes the watch stream with its dependencies. */ -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE; @@ -114,7 +120,8 @@ typedef NS_ENUM(NSInteger, FSTStreamState) { @interface FSTStream () <GRXWriteable> -@property(nonatomic, strong, readonly) FSTDatabaseInfo *databaseInfo; +// Does not own this DatabaseInfo. +@property(nonatomic, assign, readonly) const DatabaseInfo *databaseInfo; @property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue; @property(nonatomic, strong, readonly) id<FSTCredentialsProvider> credentials; @property(nonatomic, unsafe_unretained, readonly) Class responseMessageClass; @@ -194,7 +201,7 @@ typedef NS_ENUM(NSInteger, FSTStreamState) { /** The time a stream stays open after it is marked idle. */ static const NSTimeInterval kIdleTimeout = 60.0; -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials responseMessageClass:(Class)responseMessageClass { @@ -276,7 +283,7 @@ static const NSTimeInterval kIdleTimeout = 60.0; self.requestsWriter = [[FSTBufferedWriter alloc] init]; _rpc = [self createRPCWithRequestsWriter:self.requestsWriter]; [FSTDatastore prepareHeadersForRPC:_rpc - databaseID:self.databaseInfo.databaseID + databaseID:&self.databaseInfo->database_id() token:token.token]; FSTAssert(_callbackFilter == nil, @"GRX Filter must be nil"); _callbackFilter = [[FSTCallbackFilter alloc] initWithStream:self]; @@ -592,7 +599,7 @@ static const NSTimeInterval kIdleTimeout = 60.0; @implementation FSTWatchStream -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials serializer:(FSTSerializerBeta *)serializer { @@ -607,7 +614,7 @@ static const NSTimeInterval kIdleTimeout = 60.0; } - (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { - return [[GRPCCall alloc] initWithHost:self.databaseInfo.host + return [[GRPCCall alloc] initWithHost:util::WrapNSStringNoCopy(self.databaseInfo->host()) path:@"/google.firestore.v1beta1.Firestore/Listen" requestsWriter:requestsWriter]; } @@ -675,7 +682,7 @@ static const NSTimeInterval kIdleTimeout = 60.0; @implementation FSTWriteStream -- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database +- (instancetype)initWithDatabase:(const DatabaseInfo *)database workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue credentials:(id<FSTCredentialsProvider>)credentials serializer:(FSTSerializerBeta *)serializer { @@ -690,7 +697,7 @@ static const NSTimeInterval kIdleTimeout = 60.0; } - (GRPCCall *)createRPCWithRequestsWriter:(GRXWriter *)requestsWriter { - return [[GRPCCall alloc] initWithHost:self.databaseInfo.host + return [[GRPCCall alloc] initWithHost:util::WrapNSStringNoCopy(self.databaseInfo->host()) path:@"/google.firestore.v1beta1.Firestore/Write" requestsWriter:requestsWriter]; } |