aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source/API
diff options
context:
space:
mode:
authorGravatar zxu <zxu@google.com>2018-02-06 13:51:11 -0500
committerGravatar GitHub <noreply@github.com>2018-02-06 13:51:11 -0500
commita441190635d494f128cf02e07566ae2003af4e08 (patch)
tree618e6b0ecdb5d243f6e97f319f98f09dc9ca0a7e /Firestore/Source/API
parent7cac9dc47a8c6b7321ebf5fc13fa7140e784c8ca (diff)
Implement Firestore DatabaseInfo and port both Database{Id,Info} C++ to the iOS code (#738)
* implement Firestore DatabaseInfo in C++ * temporary stash changes; blocking on the massive renaming of .m to .mm * add database_info_test to project * finish port DatabaseId and fix style, modular fixing DatabaseInfo * port DatabaseInfo * remove FSTDatabase{ID,Info} and their tests from project * fix unit test * use namespace alias * use namespace alias, leftover * address more changes * refactoring to use raw pointer instead of value for property * address changes * remove self-> * fix style * remove the name suffix Alloc * fix a bug
Diffstat (limited to 'Firestore/Source/API')
-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
5 files changed, 66 insertions, 35 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];