aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Firestore/Source')
-rw-r--r--Firestore/Source/API/FIRDocumentSnapshot.mm19
-rw-r--r--Firestore/Source/API/FIRFirestore+Internal.h6
-rw-r--r--Firestore/Source/API/FIRFirestore.mm41
-rw-r--r--Firestore/Source/API/FSTUserDataConverter.h11
-rw-r--r--Firestore/Source/API/FSTUserDataConverter.mm24
-rw-r--r--Firestore/Source/Core/FSTDatabaseInfo.h55
-rw-r--r--Firestore/Source/Core/FSTDatabaseInfo.mm70
-rw-r--r--Firestore/Source/Core/FSTFirestoreClient.h10
-rw-r--r--Firestore/Source/Core/FSTFirestoreClient.mm33
-rw-r--r--Firestore/Source/Core/FSTSyncEngine.mm7
-rw-r--r--Firestore/Source/Local/FSTLevelDB.h5
-rw-r--r--Firestore/Source/Local/FSTLevelDB.mm25
-rw-r--r--Firestore/Source/Local/FSTLevelDBMutationQueue.mm3
-rw-r--r--Firestore/Source/Local/FSTLocalStore.mm10
-rw-r--r--Firestore/Source/Model/FSTDatabaseID.h48
-rw-r--r--Firestore/Source/Model/FSTDatabaseID.mm90
-rw-r--r--Firestore/Source/Model/FSTFieldValue.h9
-rw-r--r--Firestore/Source/Model/FSTFieldValue.mm23
-rw-r--r--Firestore/Source/Remote/FSTDatastore.h14
-rw-r--r--Firestore/Source/Remote/FSTDatastore.mm39
-rw-r--r--Firestore/Source/Remote/FSTRemoteStore.h1
-rw-r--r--Firestore/Source/Remote/FSTSerializerBeta.h6
-rw-r--r--Firestore/Source/Remote/FSTSerializerBeta.mm45
-rw-r--r--Firestore/Source/Remote/FSTStream.h13
-rw-r--r--Firestore/Source/Remote/FSTStream.mm29
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];
}