aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore
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
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')
-rw-r--r--Firestore/Example/Firestore.xcodeproj/project.pbxproj12
-rw-r--r--Firestore/Example/Tests/Core/FSTDatabaseInfoTests.mm59
-rw-r--r--Firestore/Example/Tests/Core/FSTQueryTests.mm10
-rw-r--r--Firestore/Example/Tests/Integration/FSTDatastoreTests.mm22
-rw-r--r--Firestore/Example/Tests/Integration/FSTStreamTests.mm27
-rw-r--r--Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm14
-rw-r--r--Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.mm13
-rw-r--r--Firestore/Example/Tests/Model/FSTDatabaseIDTests.mm45
-rw-r--r--Firestore/Example/Tests/Model/FSTFieldValueTests.mm22
-rw-r--r--Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm20
-rw-r--r--Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm35
-rw-r--r--Firestore/Example/Tests/Util/FSTHelpers.mm21
-rw-r--r--Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm19
-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
-rw-r--r--Firestore/core/src/firebase/firestore/core/CMakeLists.txt5
-rw-r--r--Firestore/core/src/firebase/firestore/core/database_info.cc36
-rw-r--r--Firestore/core/src/firebase/firestore/core/database_info.h79
-rw-r--r--Firestore/core/src/firebase/firestore/model/database_id.cc4
-rw-r--r--Firestore/core/src/firebase/firestore/model/database_id.h25
-rw-r--r--Firestore/core/src/firebase/firestore/util/string_apple.h5
-rw-r--r--Firestore/core/test/firebase/firestore/core/CMakeLists.txt1
-rw-r--r--Firestore/core/test/firebase/firestore/core/database_info_test.cc48
-rw-r--r--Firestore/core/test/firebase/firestore/model/database_id_test.cc2
47 files changed, 574 insertions, 586 deletions
diff --git a/Firestore/Example/Firestore.xcodeproj/project.pbxproj b/Firestore/Example/Firestore.xcodeproj/project.pbxproj
index 4a8f4fb..b475963 100644
--- a/Firestore/Example/Firestore.xcodeproj/project.pbxproj
+++ b/Firestore/Example/Firestore.xcodeproj/project.pbxproj
@@ -60,7 +60,6 @@
5492E063202154B900B64F25 /* FSTViewSnapshotTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E05C202154B800B64F25 /* FSTViewSnapshotTest.mm */; };
5492E064202154B900B64F25 /* FSTQueryListenerTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E05D202154B900B64F25 /* FSTQueryListenerTests.mm */; };
5492E065202154B900B64F25 /* FSTViewTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E05E202154B900B64F25 /* FSTViewTests.mm */; };
- 5492E066202154B900B64F25 /* FSTDatabaseInfoTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E05F202154B900B64F25 /* FSTDatabaseInfoTests.mm */; };
5492E067202154B900B64F25 /* FSTEventManagerTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E060202154B900B64F25 /* FSTEventManagerTests.mm */; };
5492E068202154B900B64F25 /* FSTQueryTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E061202154B900B64F25 /* FSTQueryTests.mm */; };
5492E072202154D600B64F25 /* FIRQueryTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E069202154D500B64F25 /* FIRQueryTests.mm */; };
@@ -99,7 +98,6 @@
5492E0B12021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E09C2021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm */; };
5492E0B92021555100B64F25 /* FSTDocumentKeyTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B22021555000B64F25 /* FSTDocumentKeyTests.mm */; };
5492E0BA2021555100B64F25 /* FSTDocumentSetTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */; };
- 5492E0BB2021555100B64F25 /* FSTDatabaseIDTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B42021555100B64F25 /* FSTDatabaseIDTests.mm */; };
5492E0BC2021555100B64F25 /* FSTPathTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B52021555100B64F25 /* FSTPathTests.mm */; };
5492E0BD2021555100B64F25 /* FSTDocumentTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B62021555100B64F25 /* FSTDocumentTests.mm */; };
5492E0BE2021555100B64F25 /* FSTMutationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B72021555100B64F25 /* FSTMutationTests.mm */; };
@@ -141,6 +139,7 @@
AB380CFE201A2F4500D97691 /* string_util_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB380CFC201A2EE200D97691 /* string_util_test.cc */; };
AB380D02201BC69F00D97691 /* bits_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB380D01201BC69F00D97691 /* bits_test.cc */; };
AB380D04201BC6E400D97691 /* ordered_code_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB380D03201BC6E400D97691 /* ordered_code_test.cc */; };
+ AB38D93020236E21000A432D /* database_info_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB38D92E20235D22000A432D /* database_info_test.cc */; };
AB7BAB342012B519001E0872 /* geo_point_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB7BAB332012B519001E0872 /* geo_point_test.cc */; };
ABE6637A201FA81900ED349A /* database_id_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = AB71064B201FA60300344F18 /* database_id_test.cc */; };
ABF6506C201131F8005F2C74 /* timestamp_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = ABF6506B201131F8005F2C74 /* timestamp_test.cc */; };
@@ -238,7 +237,6 @@
5492E05C202154B800B64F25 /* FSTViewSnapshotTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTViewSnapshotTest.mm; sourceTree = "<group>"; };
5492E05D202154B900B64F25 /* FSTQueryListenerTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTQueryListenerTests.mm; sourceTree = "<group>"; };
5492E05E202154B900B64F25 /* FSTViewTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTViewTests.mm; sourceTree = "<group>"; };
- 5492E05F202154B900B64F25 /* FSTDatabaseInfoTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDatabaseInfoTests.mm; sourceTree = "<group>"; };
5492E060202154B900B64F25 /* FSTEventManagerTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTEventManagerTests.mm; sourceTree = "<group>"; };
5492E061202154B900B64F25 /* FSTQueryTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTQueryTests.mm; sourceTree = "<group>"; };
5492E069202154D500B64F25 /* FIRQueryTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FIRQueryTests.mm; sourceTree = "<group>"; };
@@ -282,7 +280,6 @@
5492E09C2021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTRemoteDocumentCacheTests.mm; sourceTree = "<group>"; };
5492E0B22021555000B64F25 /* FSTDocumentKeyTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentKeyTests.mm; sourceTree = "<group>"; };
5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentSetTests.mm; sourceTree = "<group>"; };
- 5492E0B42021555100B64F25 /* FSTDatabaseIDTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDatabaseIDTests.mm; sourceTree = "<group>"; };
5492E0B52021555100B64F25 /* FSTPathTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTPathTests.mm; sourceTree = "<group>"; };
5492E0B62021555100B64F25 /* FSTDocumentTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentTests.mm; sourceTree = "<group>"; };
5492E0B72021555100B64F25 /* FSTMutationTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTMutationTests.mm; sourceTree = "<group>"; };
@@ -336,6 +333,7 @@
AB380CFC201A2EE200D97691 /* string_util_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_util_test.cc; path = ../../core/test/firebase/firestore/util/string_util_test.cc; sourceTree = "<group>"; };
AB380D01201BC69F00D97691 /* bits_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bits_test.cc; path = ../../core/test/firebase/firestore/util/bits_test.cc; sourceTree = "<group>"; };
AB380D03201BC6E400D97691 /* ordered_code_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ordered_code_test.cc; path = ../../core/test/firebase/firestore/util/ordered_code_test.cc; sourceTree = "<group>"; };
+ AB38D92E20235D22000A432D /* database_info_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = database_info_test.cc; sourceTree = "<group>"; };
AB71064B201FA60300344F18 /* database_id_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = database_id_test.cc; sourceTree = "<group>"; };
AB7BAB332012B519001E0872 /* geo_point_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = geo_point_test.cc; path = ../../core/test/firebase/firestore/geo_point_test.cc; sourceTree = "<group>"; };
ABF6506B201131F8005F2C74 /* timestamp_test.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = timestamp_test.cc; sourceTree = "<group>"; };
@@ -579,6 +577,7 @@
isa = PBXGroup;
children = (
AB380CF82019382300D97691 /* target_id_generator_test.cc */,
+ AB38D92E20235D22000A432D /* database_info_test.cc */,
);
name = core;
path = ../../core/test/firebase/firestore/core;
@@ -642,7 +641,6 @@
DE51B17B1F0D48AC0013853F /* Model */ = {
isa = PBXGroup;
children = (
- 5492E0B42021555100B64F25 /* FSTDatabaseIDTests.mm */,
5492E0B22021555000B64F25 /* FSTDocumentKeyTests.mm */,
5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */,
5492E0B62021555100B64F25 /* FSTDocumentTests.mm */,
@@ -727,7 +725,6 @@
DE51B1A81F0D48AC0013853F /* Core */ = {
isa = PBXGroup;
children = (
- 5492E05F202154B900B64F25 /* FSTDatabaseInfoTests.mm */,
5492E060202154B900B64F25 /* FSTEventManagerTests.mm */,
5492E05D202154B900B64F25 /* FSTQueryListenerTests.mm */,
5492E061202154B900B64F25 /* FSTQueryTests.mm */,
@@ -1256,7 +1253,6 @@
54740A581FC914F000713A1A /* autoid_test.cc in Sources */,
548DB927200D590300E00ABC /* assert_test.cc in Sources */,
5492E0A62021552D00B64F25 /* FSTPersistenceTestHelpers.mm in Sources */,
- 5492E066202154B900B64F25 /* FSTDatabaseInfoTests.mm in Sources */,
5492E0A12021552D00B64F25 /* FSTMemoryLocalStoreTests.mm in Sources */,
5436F32420008FAD006E51E3 /* string_printf_test.cc in Sources */,
5492E067202154B900B64F25 /* FSTEventManagerTests.mm in Sources */,
@@ -1283,7 +1279,6 @@
5492E0BD2021555100B64F25 /* FSTDocumentTests.mm in Sources */,
5492E0B92021555100B64F25 /* FSTDocumentKeyTests.mm in Sources */,
DE2EF0871F3D0B6E003D0CDC /* FSTImmutableSortedSet+Testing.m in Sources */,
- 5492E0BB2021555100B64F25 /* FSTDatabaseIDTests.mm in Sources */,
5492E0C82021557E00B64F25 /* FSTDatastoreTests.mm in Sources */,
5492E065202154B900B64F25 /* FSTViewTests.mm in Sources */,
5492E03C2021401F00B64F25 /* XCTestCase+Await.mm in Sources */,
@@ -1304,6 +1299,7 @@
548DB929200D59F600E00ABC /* comparison_test.cc in Sources */,
5492E03D2021401F00B64F25 /* FSTAssertTests.mm in Sources */,
5492E062202154B900B64F25 /* FSTTimestampTests.mm in Sources */,
+ AB38D93020236E21000A432D /* database_info_test.cc in Sources */,
5492E052202154AB00B64F25 /* FIRGeoPointTests.mm in Sources */,
5492E0C72021557E00B64F25 /* FSTSerializerBetaTests.mm in Sources */,
5492E03520213FFC00B64F25 /* FSTSpecTests.mm in Sources */,
diff --git a/Firestore/Example/Tests/Core/FSTDatabaseInfoTests.mm b/Firestore/Example/Tests/Core/FSTDatabaseInfoTests.mm
deleted file mode 100644
index c7cf22a..0000000
--- a/Firestore/Example/Tests/Core/FSTDatabaseInfoTests.mm
+++ /dev/null
@@ -1,59 +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 <XCTest/XCTest.h>
-
-#import "Firestore/Source/Model/FSTDatabaseID.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface FSTDatabaseInfoTests : XCTestCase
-@end
-
-@implementation FSTDatabaseInfoTests
-
-- (void)testConstructor {
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:@"p" database:@"d"];
- FSTDatabaseInfo *databaseInfo = [FSTDatabaseInfo databaseInfoWithDatabaseID:databaseID
- persistenceKey:@"pk"
- host:@"h"
- sslEnabled:YES];
- XCTAssertEqualObjects(databaseInfo.databaseID.projectID, @"p");
- XCTAssertEqualObjects(databaseInfo.databaseID.databaseID, @"d");
- XCTAssertEqualObjects(databaseInfo.persistenceKey, @"pk");
- XCTAssertEqualObjects(databaseInfo.host, @"h");
- XCTAssertEqual(databaseInfo.sslEnabled, YES);
-}
-
-- (void)testDefaultDatabase {
- FSTDatabaseID *databaseID =
- [FSTDatabaseID databaseIDWithProject:@"p" database:kDefaultDatabaseID];
- FSTDatabaseInfo *databaseInfo = [FSTDatabaseInfo databaseInfoWithDatabaseID:databaseID
- persistenceKey:@"pk"
- host:@"h"
- sslEnabled:YES];
- XCTAssertEqualObjects(databaseInfo.databaseID.projectID, @"p");
- XCTAssertEqualObjects(databaseInfo.databaseID.databaseID, @"(default)");
- XCTAssertEqualObjects(databaseInfo.persistenceKey, @"pk");
- XCTAssertEqualObjects(databaseInfo.host, @"h");
- XCTAssertEqual(databaseInfo.sslEnabled, YES);
-}
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/Firestore/Example/Tests/Core/FSTQueryTests.mm b/Firestore/Example/Tests/Core/FSTQueryTests.mm
index 3d2bd82..8acefb5 100644
--- a/Firestore/Example/Tests/Core/FSTQueryTests.mm
+++ b/Firestore/Example/Tests/Core/FSTQueryTests.mm
@@ -19,13 +19,18 @@
#import <XCTest/XCTest.h>
#import "Firestore/Source/API/FIRFirestore+Internal.h"
-#import "Firestore/Source/Model/FSTDatabaseID.h"
#import "Firestore/Source/Model/FSTDocument.h"
#import "Firestore/Source/Model/FSTDocumentKey.h"
#import "Firestore/Source/Model/FSTPath.h"
#import "Firestore/Example/Tests/Util/FSTHelpers.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
/** Convenience methods for building test queries. */
@@ -304,6 +309,7 @@ NS_ASSUME_NONNULL_BEGIN
[query queryByAddingSortOrder:[FSTSortOrder sortOrderWithFieldPath:FSTTestFieldPath(@"sort")
ascending:YES]];
+ NSString *defaultDatabaseID = util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId);
// clang-format off
NSArray<FSTDocument *> *docs = @[
FSTTestDoc(@"collection/1", 0, @{@"sort": [NSNull null]}, NO),
@@ -320,7 +326,7 @@ NS_ASSUME_NONNULL_BEGIN
FSTTestDoc(@"collection/1", 0, @{@"sort": @"ab"}, NO),
FSTTestDoc(@"collection/1", 0, @{@"sort": @"b"}, NO),
FSTTestDoc(@"collection/1", 0, @{@"sort":
- FSTTestRef(@"project", kDefaultDatabaseID, @"collection/id1")}, NO),
+ FSTTestRef(@"project", defaultDatabaseID, @"collection/id1")}, NO),
];
// clang-format on
diff --git a/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm b/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm
index bf56367..36b0494 100644
--- a/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm
+++ b/Firestore/Example/Tests/Integration/FSTDatastoreTests.mm
@@ -23,13 +23,11 @@
#import "Firestore/Source/API/FIRDocumentReference+Internal.h"
#import "Firestore/Source/API/FSTUserDataConverter.h"
#import "Firestore/Source/Auth/FSTEmptyCredentialsProvider.h"
-#import "Firestore/Source/Core/FSTDatabaseInfo.h"
#import "Firestore/Source/Core/FSTFirestoreClient.h"
#import "Firestore/Source/Core/FSTQuery.h"
#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/FSTDocumentKey.h"
#import "Firestore/Source/Model/FSTFieldValue.h"
#import "Firestore/Source/Model/FSTMutation.h"
@@ -43,6 +41,14 @@
#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.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
@interface FSTRemoteStore (Tests)
@@ -137,6 +143,7 @@ NS_ASSUME_NONNULL_BEGIN
FSTLocalStore *_localStore;
id<FSTCredentialsProvider> _credentials;
+ DatabaseInfo _databaseInfo;
FSTDatastore *_datastore;
FSTRemoteStore *_remoteStore;
}
@@ -154,13 +161,10 @@ NS_ASSUME_NONNULL_BEGIN
[GRPCCall useInsecureConnectionsForHost:settings.host];
}
- FSTDatabaseID *databaseID =
- [FSTDatabaseID databaseIDWithProject:projectID database:kDefaultDatabaseID];
+ DatabaseId database_id(util::MakeStringView(projectID), DatabaseId::kDefaultDatabaseId);
- FSTDatabaseInfo *databaseInfo = [FSTDatabaseInfo databaseInfoWithDatabaseID:databaseID
- persistenceKey:@"test-key"
- host:settings.host
- sslEnabled:settings.sslEnabled];
+ _databaseInfo = DatabaseInfo(database_id, "test-key", util::MakeStringView(settings.host),
+ settings.sslEnabled);
_testWorkerQueue = [FSTDispatchQueue
queueWith:dispatch_queue_create("com.google.firestore.FSTDatastoreTestsWorkerQueue",
@@ -168,7 +172,7 @@ NS_ASSUME_NONNULL_BEGIN
_credentials = [[FSTEmptyCredentialsProvider alloc] init];
- _datastore = [FSTDatastore datastoreWithDatabase:databaseInfo
+ _datastore = [FSTDatastore datastoreWithDatabase:&_databaseInfo
workerDispatchQueue:_testWorkerQueue
credentials:_credentials];
diff --git a/Firestore/Example/Tests/Integration/FSTStreamTests.mm b/Firestore/Example/Tests/Integration/FSTStreamTests.mm
index bbdf372..6259aff 100644
--- a/Firestore/Example/Tests/Integration/FSTStreamTests.mm
+++ b/Firestore/Example/Tests/Integration/FSTStreamTests.mm
@@ -22,12 +22,18 @@
#import "Firestore/Example/Tests/Util/FSTIntegrationTestCase.h"
#import "Firestore/Example/Tests/Util/FSTTestDispatchQueue.h"
#import "Firestore/Source/Auth/FSTEmptyCredentialsProvider.h"
-#import "Firestore/Source/Core/FSTDatabaseInfo.h"
-#import "Firestore/Source/Model/FSTDatabaseID.h"
#import "Firestore/Source/Remote/FSTDatastore.h"
#import "Firestore/Source/Remote/FSTStream.h"
#import "Firestore/Source/Util/FSTAssert.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;
+
/** Exposes otherwise private methods for testing. */
@interface FSTStream (Testing)
- (void)writesFinishedWithError:(NSError *_Nullable)error;
@@ -128,7 +134,7 @@
@implementation FSTStreamTests {
dispatch_queue_t _testQueue;
FSTTestDispatchQueue *_workerDispatchQueue;
- FSTDatabaseInfo *_databaseInfo;
+ DatabaseInfo _databaseInfo;
FSTEmptyCredentialsProvider *_credentials;
FSTStreamStatusDelegate *_delegate;
@@ -140,17 +146,14 @@
[super setUp];
FIRFirestoreSettings *settings = [FSTIntegrationTestCase settings];
- FSTDatabaseID *databaseID =
- [FSTDatabaseID databaseIDWithProject:[FSTIntegrationTestCase projectID]
- database:kDefaultDatabaseID];
+ DatabaseId database_id(util::MakeStringView([FSTIntegrationTestCase projectID]),
+ DatabaseId::kDefaultDatabaseId);
_testQueue = dispatch_queue_create("FSTStreamTestWorkerQueue", DISPATCH_QUEUE_SERIAL);
_workerDispatchQueue = [[FSTTestDispatchQueue alloc] initWithQueue:_testQueue];
- _databaseInfo = [FSTDatabaseInfo databaseInfoWithDatabaseID:databaseID
- persistenceKey:@"test-key"
- host:settings.host
- sslEnabled:settings.sslEnabled];
+ _databaseInfo = DatabaseInfo(database_id, "test-key", util::MakeStringView(settings.host),
+ settings.sslEnabled);
_credentials = [[FSTEmptyCredentialsProvider alloc] init];
_delegate = [[FSTStreamStatusDelegate alloc] initWithTestCase:self queue:_workerDispatchQueue];
@@ -159,14 +162,14 @@
}
- (FSTWriteStream *)setUpWriteStream {
- FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:_databaseInfo
+ FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo
workerDispatchQueue:_workerDispatchQueue
credentials:_credentials];
return [datastore createWriteStream];
}
- (FSTWatchStream *)setUpWatchStream {
- FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:_databaseInfo
+ FSTDatastore *datastore = [[FSTDatastore alloc] initWithDatabaseInfo:&_databaseInfo
workerDispatchQueue:_workerDispatchQueue
credentials:_credentials];
return [datastore createWatchStream];
diff --git a/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm b/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm
index 95b9b11..1b55795 100644
--- a/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm
+++ b/Firestore/Example/Tests/Local/FSTLocalSerializerTests.mm
@@ -31,7 +31,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"
@@ -42,6 +41,11 @@
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
+#include "Firestore/core/src/firebase/firestore/model/database_id.h"
+#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
+
+using firebase::firestore::model::DatabaseId;
+
NS_ASSUME_NONNULL_BEGIN
@interface FSTSerializerBeta (Test)
@@ -52,7 +56,9 @@ NS_ASSUME_NONNULL_BEGIN
- (GCFSValue *)encodedString:(NSString *)value;
@end
-@interface FSTLocalSerializerTests : XCTestCase
+@interface FSTLocalSerializerTests : XCTestCase {
+ DatabaseId _databaseId;
+}
@property(nonatomic, strong) FSTLocalSerializer *serializer;
@property(nonatomic, strong) FSTSerializerBeta *remoteSerializer;
@@ -62,8 +68,8 @@ NS_ASSUME_NONNULL_BEGIN
@implementation FSTLocalSerializerTests
- (void)setUp {
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:@"p" database:@"d"];
- self.remoteSerializer = [[FSTSerializerBeta alloc] initWithDatabaseID:databaseID];
+ _databaseId = DatabaseId("p", "d");
+ self.remoteSerializer = [[FSTSerializerBeta alloc] initWithDatabaseID:&_databaseId];
self.serializer = [[FSTLocalSerializer alloc] initWithRemoteSerializer:self.remoteSerializer];
}
diff --git a/Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.mm b/Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.mm
index e9e129d..b59a062 100644
--- a/Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.mm
+++ b/Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.mm
@@ -19,9 +19,13 @@
#import "Firestore/Source/Local/FSTLevelDB.h"
#import "Firestore/Source/Local/FSTLocalSerializer.h"
#import "Firestore/Source/Local/FSTMemoryPersistence.h"
-#import "Firestore/Source/Model/FSTDatabaseID.h"
#import "Firestore/Source/Remote/FSTSerializerBeta.h"
+#include "Firestore/core/src/firebase/firestore/model/database_id.h"
+#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
+
+using firebase::firestore::model::DatabaseId;
+
NS_ASSUME_NONNULL_BEGIN
@implementation FSTPersistenceTestHelpers
@@ -43,10 +47,11 @@ NS_ASSUME_NONNULL_BEGIN
}
+ (FSTLevelDB *)levelDBPersistence {
- NSString *dir = [self levelDBDir];
+ // This owns the DatabaseIds since we do not have FirestoreClient instance to own them.
+ static DatabaseId database_id{"p", "d"};
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:@"p" database:@"d"];
- FSTSerializerBeta *remoteSerializer = [[FSTSerializerBeta alloc] initWithDatabaseID:databaseID];
+ NSString *dir = [self levelDBDir];
+ FSTSerializerBeta *remoteSerializer = [[FSTSerializerBeta alloc] initWithDatabaseID:&database_id];
FSTLocalSerializer *serializer =
[[FSTLocalSerializer alloc] initWithRemoteSerializer:remoteSerializer];
FSTLevelDB *db = [[FSTLevelDB alloc] initWithDirectory:dir serializer:serializer];
diff --git a/Firestore/Example/Tests/Model/FSTDatabaseIDTests.mm b/Firestore/Example/Tests/Model/FSTDatabaseIDTests.mm
deleted file mode 100644
index cb1b19d..0000000
--- a/Firestore/Example/Tests/Model/FSTDatabaseIDTests.mm
+++ /dev/null
@@ -1,45 +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 <XCTest/XCTest.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface FSTDatabaseIDTests : XCTestCase
-@end
-
-@implementation FSTDatabaseIDTests
-
-- (void)testConstructor {
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:@"p" database:@"d"];
- XCTAssertEqualObjects(databaseID.projectID, @"p");
- XCTAssertEqualObjects(databaseID.databaseID, @"d");
- XCTAssertFalse([databaseID isDefaultDatabase]);
-}
-
-- (void)testDefaultDatabase {
- FSTDatabaseID *databaseID =
- [FSTDatabaseID databaseIDWithProject:@"p" database:kDefaultDatabaseID];
- XCTAssertEqualObjects(databaseID.projectID, @"p");
- XCTAssertEqualObjects(databaseID.databaseID, @"(default)");
- XCTAssertTrue([databaseID isDefaultDatabase]);
-}
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/Firestore/Example/Tests/Model/FSTFieldValueTests.mm b/Firestore/Example/Tests/Model/FSTFieldValueTests.mm
index 56b885f..52d5a4e 100644
--- a/Firestore/Example/Tests/Model/FSTFieldValueTests.mm
+++ b/Firestore/Example/Tests/Model/FSTFieldValueTests.mm
@@ -22,13 +22,18 @@
#import "Firestore/Source/API/FIRFirestore+Internal.h"
#import "Firestore/Source/API/FSTUserDataConverter.h"
#import "Firestore/Source/Core/FSTTimestamp.h"
-#import "Firestore/Source/Model/FSTDatabaseID.h"
#import "Firestore/Source/Model/FSTFieldValue.h"
#import "Firestore/Source/Model/FSTPath.h"
#import "Firestore/Example/Tests/API/FSTAPIHelpers.h"
#import "Firestore/Example/Tests/Util/FSTHelpers.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;
+
/** Helper to wrap the values in a set of equality groups using FSTTestFieldValue(). */
NSArray *FSTWrapGroups(NSArray *groups) {
NSMutableArray *wrapped = [NSMutableArray array];
@@ -249,14 +254,15 @@ union DoubleBits {
- (void)testWrapResourceNames {
NSArray *values = @[
- FSTTestRef(@"project", kDefaultDatabaseID, @"foo/bar"),
- FSTTestRef(@"project", kDefaultDatabaseID, @"foo/baz")
+ FSTTestRef(@"project", util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId), @"foo/bar"),
+ FSTTestRef(@"project", util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId), @"foo/baz")
];
for (FSTDocumentKeyReference *value in values) {
FSTFieldValue *wrapped = FSTTestFieldValue(value);
XCTAssertEqualObjects([wrapped class], [FSTReferenceValue class]);
XCTAssertEqualObjects([wrapped value], value.key);
- XCTAssertEqualObjects(((FSTDatabaseID *)wrapped).databaseID, value.databaseID);
+ XCTAssertTrue(*((FSTReferenceValue *)wrapped).databaseID ==
+ *(const DatabaseId *)(value.databaseID));
}
}
@@ -417,6 +423,7 @@ union DoubleBits {
}
- (void)testValueEquality {
+ DatabaseId database_id = DatabaseId("project", DatabaseId::kDefaultDatabaseId);
NSArray *groups = @[
@[ FSTTestFieldValue(@YES), [FSTBooleanValue booleanValue:YES] ],
@[ FSTTestFieldValue(@NO), [FSTBooleanValue booleanValue:NO] ],
@@ -459,10 +466,9 @@ union DoubleBits {
],
@[ FSTTestFieldValue(FSTTestGeoPoint(1, 0)) ],
@[
- [FSTReferenceValue referenceValue:FSTTestDocKey(@"coll/doc1")
- databaseID:[FSTDatabaseID databaseIDWithProject:@"project"
- database:kDefaultDatabaseID]],
- FSTTestFieldValue(FSTTestRef(@"project", kDefaultDatabaseID, @"coll/doc1"))
+ [FSTReferenceValue referenceValue:FSTTestDocKey(@"coll/doc1") databaseID:&database_id],
+ FSTTestFieldValue(FSTTestRef(
+ @"project", util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId), @"coll/doc1"))
],
@[ FSTTestRef(@"project", @"(default)", @"coll/doc2") ],
@[ FSTTestFieldValue(@[ @"foo", @"bar" ]), FSTTestFieldValue(@[ @"foo", @"bar" ]) ],
diff --git a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
index de4a07a..48e5546 100644
--- a/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
+++ b/Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
@@ -35,7 +35,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"
@@ -47,6 +46,12 @@
#import "Firestore/Example/Tests/API/FSTAPIHelpers.h"
#import "Firestore/Example/Tests/Util/FSTHelpers.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 (Test)
@@ -79,15 +84,18 @@ NS_ASSUME_NONNULL_BEGIN
}
@end
-@interface FSTSerializerBetaTests : XCTestCase
+@interface FSTSerializerBetaTests : XCTestCase {
+ DatabaseId _databaseId;
+}
+
@property(nonatomic, strong) FSTSerializerBeta *serializer;
@end
@implementation FSTSerializerBetaTests
- (void)setUp {
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:@"p" database:@"d"];
- self.serializer = [[FSTSerializerBeta alloc] initWithDatabaseID:databaseID];
+ _databaseId = DatabaseId("p", "d");
+ self.serializer = [[FSTSerializerBeta alloc] initWithDatabaseID:&_databaseId];
}
- (void)testEncodesNull {
@@ -231,7 +239,9 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)testEncodesResourceNames {
- FSTDocumentKeyReference *reference = FSTTestRef(@"project", kDefaultDatabaseID, @"foo/bar");
+ FSTDocumentKeyReference *reference =
+ FSTTestRef(@"project", util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId), @"foo/bar");
+ _databaseId = DatabaseId("project", DatabaseId::kDefaultDatabaseId);
GCFSValue *proto = [GCFSValue message];
proto.referenceValue = @"projects/project/databases/(default)/documents/foo/bar";
diff --git a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm
index 9a1d719..d3c4171 100644
--- a/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm
+++ b/Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm
@@ -17,10 +17,8 @@
#import "Firestore/Example/Tests/SpecTests/FSTMockDatastore.h"
#import "Firestore/Source/Auth/FSTEmptyCredentialsProvider.h"
-#import "Firestore/Source/Core/FSTDatabaseInfo.h"
#import "Firestore/Source/Core/FSTSnapshotVersion.h"
#import "Firestore/Source/Local/FSTQueryData.h"
-#import "Firestore/Source/Model/FSTDatabaseID.h"
#import "Firestore/Source/Model/FSTMutation.h"
#import "Firestore/Source/Remote/FSTSerializerBeta.h"
#import "Firestore/Source/Remote/FSTStream.h"
@@ -29,6 +27,13 @@
#import "Firestore/Example/Tests/Remote/FSTWatchChange+Testing.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;
+
@class GRPCProtoCall;
NS_ASSUME_NONNULL_BEGIN
@@ -42,12 +47,12 @@ NS_ASSUME_NONNULL_BEGIN
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
serializer:(FSTSerializerBeta *)serializer NS_UNAVAILABLE;
-- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database
+- (instancetype)initWithDatabase:(const DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
credentials:(id<FSTCredentialsProvider>)credentials
responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE;
@@ -168,12 +173,12 @@ NS_ASSUME_NONNULL_BEGIN
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
serializer:(FSTSerializerBeta *)serializer NS_UNAVAILABLE;
-- (instancetype)initWithDatabase:(FSTDatabaseInfo *)database
+- (instancetype)initWithDatabase:(const DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
credentials:(id<FSTCredentialsProvider>)credentials
responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE;
@@ -281,15 +286,13 @@ NS_ASSUME_NONNULL_BEGIN
@implementation FSTMockDatastore
+ (instancetype)mockDatastoreWithWorkerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue {
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:@"project" database:@"database"];
- FSTDatabaseInfo *databaseInfo = [FSTDatabaseInfo databaseInfoWithDatabaseID:databaseID
- persistenceKey:@"persistence"
- host:@"host"
- sslEnabled:NO];
+ // This owns the DatabaseInfos since we do not have FirestoreClient instance to own them.
+ static DatabaseInfo database_info{DatabaseId{"project", "database"}, "persistence", "host",
+ false};
FSTEmptyCredentialsProvider *credentials = [[FSTEmptyCredentialsProvider alloc] init];
- return [[FSTMockDatastore alloc] initWithDatabaseInfo:databaseInfo
+ return [[FSTMockDatastore alloc] initWithDatabaseInfo:&database_info
workerDispatchQueue:workerDispatchQueue
credentials:credentials];
}
@@ -297,24 +300,24 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Overridden FSTDatastore methods.
- (FSTWatchStream *)createWatchStream {
- FSTAssert(self.databaseInfo, @"DatabaseInfo must not be nil");
+ // FSTAssert(self.databaseInfo, @"DatabaseInfo must not be nil");
self.watchStream = [[FSTMockWatchStream alloc]
initWithDatastore:self
workerDispatchQueue:self.workerDispatchQueue
credentials:self.credentials
serializer:[[FSTSerializerBeta alloc]
- initWithDatabaseID:self.databaseInfo.databaseID]];
+ initWithDatabaseID:&self.databaseInfo->database_id()]];
return self.watchStream;
}
- (FSTWriteStream *)createWriteStream {
- FSTAssert(self.databaseInfo, @"DatabaseInfo must not be nil");
+ // FSTAssert(self.databaseInfo, @"DatabaseInfo must not be nil");
self.writeStream = [[FSTMockWriteStream alloc]
initWithDatastore:self
workerDispatchQueue:self.workerDispatchQueue
credentials:self.credentials
serializer:[[FSTSerializerBeta alloc]
- initWithDatabaseID:self.databaseInfo.databaseID]];
+ initWithDatabaseID:&self.databaseInfo->database_id()]];
return self.writeStream;
}
diff --git a/Firestore/Example/Tests/Util/FSTHelpers.mm b/Firestore/Example/Tests/Util/FSTHelpers.mm
index 64fe213..406d4dd 100644
--- a/Firestore/Example/Tests/Util/FSTHelpers.mm
+++ b/Firestore/Example/Tests/Util/FSTHelpers.mm
@@ -17,6 +17,7 @@
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
#include <inttypes.h>
+#include <vector>
#import <FirebaseFirestore/FIRFieldPath.h>
#import <FirebaseFirestore/FIRGeoPoint.h>
@@ -30,7 +31,6 @@
#import "Firestore/Source/Core/FSTViewSnapshot.h"
#import "Firestore/Source/Local/FSTLocalViewChanges.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/FSTDocumentSet.h"
@@ -41,6 +41,12 @@
#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
/** A string sentinel that can be used with FSTTestPatchMutation() to mark a field for deletion. */
@@ -100,10 +106,10 @@ FSTFieldPath *FSTTestFieldPath(NSString *field) {
}
FSTFieldValue *FSTTestFieldValue(id _Nullable value) {
- FSTDatabaseID *databaseID =
- [FSTDatabaseID databaseIDWithProject:@"project" database:kDefaultDatabaseID];
+ // This owns the DatabaseIds since we do not have FirestoreClient instance to own them.
+ static DatabaseId database_id{"project", DatabaseId::kDefaultDatabaseId};
FSTUserDataConverter *converter =
- [[FSTUserDataConverter alloc] initWithDatabaseID:databaseID
+ [[FSTUserDataConverter alloc] initWithDatabaseID:&database_id
preConverter:^id _Nullable(id _Nullable input) {
return input;
}];
@@ -167,8 +173,11 @@ FSTResourcePath *FSTTestPath(NSString *path) {
}
FSTDocumentKeyReference *FSTTestRef(NSString *projectID, NSString *database, NSString *path) {
- FSTDatabaseID *databaseID = [FSTDatabaseID databaseIDWithProject:projectID database:database];
- return [[FSTDocumentKeyReference alloc] initWithKey:FSTTestDocKey(path) databaseID:databaseID];
+ // This owns the DatabaseIds since we do not have FirestoreClient instance to own them.
+ static std::vector<DatabaseId> database_ids;
+ database_ids.emplace_back(util::MakeStringView(projectID), util::MakeStringView(database));
+ return [[FSTDocumentKeyReference alloc] initWithKey:FSTTestDocKey(path)
+ databaseID:&database_ids.back()];
}
FSTQuery *FSTTestQuery(NSString *path) {
diff --git a/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm b/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm
index ef15056..df591b0 100644
--- a/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm
+++ b/Firestore/Example/Tests/Util/FSTIntegrationTestCase.mm
@@ -27,12 +27,16 @@
#import "Firestore/Source/Auth/FSTEmptyCredentialsProvider.h"
#import "Firestore/Source/Core/FSTFirestoreClient.h"
#import "Firestore/Source/Local/FSTLevelDB.h"
-#import "Firestore/Source/Model/FSTDatabaseID.h"
#import "Firestore/Source/Util/FSTDispatchQueue.h"
#import "Firestore/Example/Tests/Util/FSTEventAccumulator.h"
#import "Firestore/Example/Tests/Util/FSTTestDispatchQueue.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::CreateAutoId;
NS_ASSUME_NONNULL_BEGIN
@@ -137,12 +141,13 @@ NS_ASSUME_NONNULL_BEGIN
FIRSetLoggerLevel(FIRLoggerLevelDebug);
// HACK: FIRFirestore expects a non-nil app, but for tests we cheat.
FIRApp *app = nil;
- FIRFirestore *firestore = [[FIRFirestore alloc] initWithProjectID:projectID
- database:kDefaultDatabaseID
- persistenceKey:persistenceKey
- credentialsProvider:credentialsProvider
- workerDispatchQueue:workerDispatchQueue
- firebaseApp:app];
+ FIRFirestore *firestore = [[FIRFirestore alloc]
+ initWithProjectID:projectID
+ database:util::WrapNSStringNoCopy(DatabaseId::kDefaultDatabaseId)
+ persistenceKey:persistenceKey
+ credentialsProvider:credentialsProvider
+ workerDispatchQueue:workerDispatchQueue
+ firebaseApp:app];
firestore.settings = [FSTIntegrationTestCase settings];
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];
}
diff --git a/Firestore/core/src/firebase/firestore/core/CMakeLists.txt b/Firestore/core/src/firebase/firestore/core/CMakeLists.txt
index a62985c..cf3cafe 100644
--- a/Firestore/core/src/firebase/firestore/core/CMakeLists.txt
+++ b/Firestore/core/src/firebase/firestore/core/CMakeLists.txt
@@ -15,6 +15,11 @@
cc_library(
firebase_firestore_core
SOURCES
+ database_info.cc
+ database_info.h
target_id_generator.cc
target_id_generator.h
+ DEPENDS
+ absl_strings
+ firebase_firestore_model
)
diff --git a/Firestore/core/src/firebase/firestore/core/database_info.cc b/Firestore/core/src/firebase/firestore/core/database_info.cc
new file mode 100644
index 0000000..b83da37
--- /dev/null
+++ b/Firestore/core/src/firebase/firestore/core/database_info.cc
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2018 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.
+ */
+
+#include "Firestore/core/src/firebase/firestore/core/database_info.h"
+
+namespace firebase {
+namespace firestore {
+namespace core {
+
+DatabaseInfo::DatabaseInfo(
+ const firebase::firestore::model::DatabaseId& database_id,
+ const absl::string_view persistence_key,
+ const absl::string_view host,
+ bool ssl_enabled)
+ : database_id_(database_id),
+ persistence_key_(persistence_key),
+ host_(host),
+ ssl_enabled_(ssl_enabled) {
+}
+
+} // namespace core
+} // namespace firestore
+} // namespace firebase
diff --git a/Firestore/core/src/firebase/firestore/core/database_info.h b/Firestore/core/src/firebase/firestore/core/database_info.h
new file mode 100644
index 0000000..2e1303e
--- /dev/null
+++ b/Firestore/core/src/firebase/firestore/core/database_info.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2018 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.
+ */
+
+#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_DATABASE_INFO_H_
+#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_DATABASE_INFO_H_
+
+#include <string>
+
+#include "Firestore/core/src/firebase/firestore/model/database_id.h"
+#include "absl/strings/string_view.h"
+
+namespace firebase {
+namespace firestore {
+namespace core {
+
+/** DatabaseInfo contains data about the database. */
+class DatabaseInfo {
+ public:
+#if defined(__OBJC__)
+ // For objective-c++ initialization; to be removed after migration.
+ // Do NOT use in C++ code.
+ DatabaseInfo() = default;
+#endif // defined(__OBJC__)
+
+ /**
+ * Creates a new DatabaseInfo.
+ *
+ * @param database_id The project/database to use.
+ * @param persistence_key A unique identifier for this Firestore's local
+ * storage. Usually derived from -[FIRApp appName].
+ * @param host The hostname of the datastore backend.
+ * @param ssl_enabled Whether to use SSL when connecting.
+ */
+ DatabaseInfo(const firebase::firestore::model::DatabaseId& database_id,
+ const absl::string_view persistence_key,
+ const absl::string_view host,
+ bool ssl_enabled);
+
+ const firebase::firestore::model::DatabaseId& database_id() const {
+ return database_id_;
+ }
+
+ const std::string& persistence_key() const {
+ return persistence_key_;
+ }
+
+ const std::string& host() const {
+ return host_;
+ }
+
+ bool ssl_enabled() const {
+ return ssl_enabled_;
+ }
+
+ private:
+ firebase::firestore::model::DatabaseId database_id_;
+ std::string persistence_key_;
+ std::string host_;
+ bool ssl_enabled_;
+};
+
+} // namespace core
+} // namespace firestore
+} // namespace firebase
+
+#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_DATABASE_INFO_H_
diff --git a/Firestore/core/src/firebase/firestore/model/database_id.cc b/Firestore/core/src/firebase/firestore/model/database_id.cc
index af12d30..d7e8a85 100644
--- a/Firestore/core/src/firebase/firestore/model/database_id.cc
+++ b/Firestore/core/src/firebase/firestore/model/database_id.cc
@@ -31,10 +31,6 @@ DatabaseId::DatabaseId(const absl::string_view project_id,
FIREBASE_ASSERT(!database_id.empty());
}
-bool DatabaseId::IsDefaultDatabase() {
- return database_id_ == kDefaultDatabaseId;
-}
-
} // namespace model
} // namespace firestore
} // namespace firebase
diff --git a/Firestore/core/src/firebase/firestore/model/database_id.h b/Firestore/core/src/firebase/firestore/model/database_id.h
index 48c547c..648f982 100644
--- a/Firestore/core/src/firebase/firestore/model/database_id.h
+++ b/Firestore/core/src/firebase/firestore/model/database_id.h
@@ -17,6 +17,8 @@
#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_
#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_
+#include <stdint.h>
+
#include <string>
#include "absl/strings/string_view.h"
@@ -31,6 +33,12 @@ class DatabaseId {
/** The default name for "unset" database ID in resource names. */
static constexpr const char* kDefaultDatabaseId = "(default)";
+#if defined(__OBJC__)
+ // For objective-c++ initialization; to be removed after migration.
+ // Do NOT use in C++ code.
+ DatabaseId() = default;
+#endif // defined(__OBJC__)
+
/**
* Creates and returns a new DatabaseId.
*
@@ -49,13 +57,24 @@ class DatabaseId {
}
/** Whether this is the default database of the project. */
- bool IsDefaultDatabase();
+ bool IsDefaultDatabase() const {
+ return database_id_ == kDefaultDatabaseId;
+ }
+
+#if defined(__OBJC__)
+ // For objective-c++ hash; to be removed after migration.
+ // Do NOT use in C++ code.
+ uint64_t Hash() const {
+ std::hash<std::string> hash_fn;
+ return hash_fn(project_id_) * 31u + hash_fn(database_id_);
+ }
+#endif // defined(__OBJC__)
friend bool operator<(const DatabaseId& lhs, const DatabaseId& rhs);
private:
- const std::string project_id_;
- const std::string database_id_;
+ std::string project_id_;
+ std::string database_id_;
};
/** Compares against another DatabaseId. */
diff --git a/Firestore/core/src/firebase/firestore/util/string_apple.h b/Firestore/core/src/firebase/firestore/util/string_apple.h
index 108ade7..fe2a487 100644
--- a/Firestore/core/src/firebase/firestore/util/string_apple.h
+++ b/Firestore/core/src/firebase/firestore/util/string_apple.h
@@ -37,6 +37,11 @@ inline NSString* WrapNSStringNoCopy(const char* c_str) {
freeWhenDone:NO];
}
+// Translates a string_view to the equivalent NSString without making a copy.
+inline NSString* WrapNSStringNoCopy(const absl::string_view str) {
+ return WrapNSStringNoCopy(str.data());
+}
+
// Creates an absl::string_view wrapper for the contents of the given NSString.
inline absl::string_view MakeStringView(NSString* str) {
return absl::string_view(
diff --git a/Firestore/core/test/firebase/firestore/core/CMakeLists.txt b/Firestore/core/test/firebase/firestore/core/CMakeLists.txt
index 34993aa..5b4c55a 100644
--- a/Firestore/core/test/firebase/firestore/core/CMakeLists.txt
+++ b/Firestore/core/test/firebase/firestore/core/CMakeLists.txt
@@ -15,6 +15,7 @@
cc_test(
firebase_firestore_core_test
SOURCES
+ database_info_test.cc
target_id_generator_test.cc
DEPENDS
firebase_firestore_core
diff --git a/Firestore/core/test/firebase/firestore/core/database_info_test.cc b/Firestore/core/test/firebase/firestore/core/database_info_test.cc
new file mode 100644
index 0000000..d865105
--- /dev/null
+++ b/Firestore/core/test/firebase/firestore/core/database_info_test.cc
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018 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.
+ */
+
+#include "Firestore/core/src/firebase/firestore/core/database_info.h"
+
+#include "gtest/gtest.h"
+
+namespace firebase {
+namespace firestore {
+namespace core {
+
+using firebase::firestore::model::DatabaseId;
+
+TEST(DatabaseInfo, Getter) {
+ DatabaseInfo info(DatabaseId("project id", "database id"), "key",
+ "http://host", true);
+ EXPECT_EQ(DatabaseId("project id", "database id"), info.database_id());
+ EXPECT_EQ("key", info.persistence_key());
+ EXPECT_EQ("http://host", info.host());
+ EXPECT_TRUE(info.ssl_enabled());
+}
+
+TEST(DatabaseInfo, DefaultDatabase) {
+ DatabaseInfo info(DatabaseId("project id", DatabaseId::kDefaultDatabaseId),
+ "key", "http://host", false);
+ EXPECT_EQ("project id", info.database_id().project_id());
+ EXPECT_EQ("(default)", info.database_id().database_id());
+ EXPECT_EQ("key", info.persistence_key());
+ EXPECT_EQ("http://host", info.host());
+ EXPECT_FALSE(info.ssl_enabled());
+}
+
+} // namespace core
+} // namespace firestore
+} // namespace firebase
diff --git a/Firestore/core/test/firebase/firestore/model/database_id_test.cc b/Firestore/core/test/firebase/firestore/model/database_id_test.cc
index e9c9439..16b0e6b 100644
--- a/Firestore/core/test/firebase/firestore/model/database_id_test.cc
+++ b/Firestore/core/test/firebase/firestore/model/database_id_test.cc
@@ -32,7 +32,7 @@ TEST(DatabaseId, Constructor) {
TEST(DatabaseId, DefaultDb) {
DatabaseId id("p", DatabaseId::kDefaultDatabaseId);
EXPECT_EQ("p", id.project_id());
- EXPECT_EQ(DatabaseId::kDefaultDatabaseId, id.database_id());
+ EXPECT_EQ("(default)", id.database_id());
EXPECT_TRUE(id.IsDefaultDatabase());
}