diff options
author | zxu <zxu@google.com> | 2018-02-06 13:51:11 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-06 13:51:11 -0500 |
commit | a441190635d494f128cf02e07566ae2003af4e08 (patch) | |
tree | 618e6b0ecdb5d243f6e97f319f98f09dc9ca0a7e /Firestore | |
parent | 7cac9dc47a8c6b7321ebf5fc13fa7140e784c8ca (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')
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()); } |