Skip to content

Commit 6dca5e6

Browse files
authored
Port FirestoreSettings to C++. (#2804)
* Creates a C++ api::Settings class as a container for the settings we pass into the core client. * Adds [FIRFirestoreSettings internalSettings] to convert from public API settings to api::Settings. Input validation, etc. still happens in FIRFirestoreSettings.
1 parent bbbaa7b commit 6dca5e6

File tree

11 files changed

+231
-44
lines changed

11 files changed

+231
-44
lines changed

Firestore/Source/API/FIRDocumentSnapshot.mm

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020

2121
#include "Firestore/core/src/firebase/firestore/util/warnings.h"
2222

23-
#import "FIRFirestoreSettings.h"
24-
2523
#import "Firestore/Source/API/FIRDocumentReference+Internal.h"
2624
#import "Firestore/Source/API/FIRFieldPath+Internal.h"
2725
#import "Firestore/Source/API/FIRFirestore+Internal.h"
@@ -32,6 +30,7 @@
3230
#include "Firestore/core/src/firebase/firestore/api/document_snapshot.h"
3331
#include "Firestore/core/src/firebase/firestore/api/firestore.h"
3432
#include "Firestore/core/src/firebase/firestore/api/input_validation.h"
33+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
3534
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
3635
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
3736
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
@@ -184,7 +183,7 @@ - (FSTFieldValueOptions *)optionsForServerTimestampBehavior:
184183
initWithServerTimestampBehavior:InternalServerTimestampBehavior(serverTimestampBehavior)
185184
timestampsInSnapshotsEnabled:_snapshot.firestore()
186185
->settings()
187-
.timestampsInSnapshotsEnabled];
186+
.timestamps_in_snapshots_enabled()];
188187
SUPPRESS_END()
189188
}
190189

Firestore/Source/API/FIRFirestore.mm

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include <string>
2727
#include <utility>
2828

29-
#import "FIRFirestore.h"
29+
#import "FIRFirestoreSettings+Internal.h"
3030

3131
#import "Firestore/Source/API/FIRDocumentReference+Internal.h"
3232
#import "Firestore/Source/API/FIRFirestore+Internal.h"
@@ -40,6 +40,7 @@
4040
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
4141
#include "Firestore/core/src/firebase/firestore/util/async_queue.h"
4242
#include "Firestore/core/src/firebase/firestore/util/delayed_constructor.h"
43+
#include "Firestore/core/src/firebase/firestore/util/executor_libdispatch.h"
4344
#include "Firestore/core/src/firebase/firestore/util/log.h"
4445
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
4546

@@ -65,6 +66,7 @@ @interface FIRFirestore ()
6566

6667
@implementation FIRFirestore {
6768
DelayedConstructor<Firestore> _firestore;
69+
FIRFirestoreSettings *_settings;
6870
}
6971

7072
+ (NSMutableDictionary<NSString *, FIRFirestore *> *)instances {
@@ -160,16 +162,26 @@ - (instancetype)initWithProjectID:(std::string)projectID
160162

161163
_dataConverter = [[FSTUserDataConverter alloc] initWithDatabaseID:&_firestore->database_id()
162164
preConverter:block];
165+
// Use the property setter so the default settings get plumbed into _firestoreClient.
166+
self.settings = [[FIRFirestoreSettings alloc] init];
163167
}
164168
return self;
165169
}
166170

167171
- (FIRFirestoreSettings *)settings {
168-
return _firestore->settings();
172+
// Disallow mutation of our internal settings
173+
return [_settings copy];
169174
}
170175

171176
- (void)setSettings:(FIRFirestoreSettings *)settings {
172-
_firestore->set_settings(settings);
177+
if (![settings isEqual:_settings]) {
178+
_settings = settings;
179+
_firestore->set_settings([settings internalSettings]);
180+
181+
std::unique_ptr<util::Executor> user_executor =
182+
absl::make_unique<util::ExecutorLibdispatch>(settings.dispatchQueue);
183+
_firestore->set_user_executor(std::move(user_executor));
184+
}
173185
}
174186

175187
- (FIRCollectionReference *)collectionWithPath:(NSString *)collectionPath {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright 2019 Google
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#import "FIRFirestoreSettings.h"
18+
19+
#import <Foundation/Foundation.h>
20+
21+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
22+
23+
NS_ASSUME_NONNULL_BEGIN
24+
25+
@interface FIRFirestoreSettings (Internal)
26+
27+
/** Converts this FIRFirestoreSettings instance into an api::Settings object. */
28+
- (firebase::firestore::api::Settings)internalSettings;
29+
30+
@end
31+
32+
NS_ASSUME_NONNULL_END

Firestore/Source/API/FIRFirestoreSettings.mm

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,16 @@
1717
#import "FIRFirestoreSettings.h"
1818

1919
#include "Firestore/core/src/firebase/firestore/api/input_validation.h"
20+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
21+
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
2022
#include "Firestore/core/src/firebase/firestore/util/warnings.h"
23+
#include "absl/memory/memory.h"
2124

2225
NS_ASSUME_NONNULL_BEGIN
2326

27+
using firebase::firestore::api::Settings;
2428
using firebase::firestore::api::ThrowInvalidArgument;
29+
using firebase::firestore::util::MakeString;
2530

2631
static NSString *const kDefaultHost = @"firestore.googleapis.com";
2732
static const BOOL kDefaultSSLEnabled = YES;
@@ -114,6 +119,16 @@ - (void)setCacheSizeBytes:(int64_t)cacheSizeBytes {
114119
_cacheSizeBytes = cacheSizeBytes;
115120
}
116121

122+
- (Settings)internalSettings {
123+
Settings settings;
124+
settings.set_host(MakeString(_host));
125+
settings.set_ssl_enabled(_sslEnabled);
126+
settings.set_persistence_enabled(_persistenceEnabled);
127+
settings.set_timestamps_in_snapshots_enabled(_timestampsInSnapshotsEnabled);
128+
settings.set_cache_size_bytes(_cacheSizeBytes);
129+
return settings;
130+
}
131+
117132
@end
118133

119134
NS_ASSUME_NONNULL_END

Firestore/Source/Core/FSTFirestoreClient.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include "Firestore/core/src/firebase/firestore/api/document_reference.h"
2525
#include "Firestore/core/src/firebase/firestore/api/document_snapshot.h"
26+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
2627
#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
2728
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
2829
#include "Firestore/core/src/firebase/firestore/core/listen_options.h"
@@ -35,7 +36,6 @@
3536

3637
@class FIRDocumentReference;
3738
@class FIRDocumentSnapshot;
38-
@class FIRFirestoreSettings;
3939
@class FIRQuery;
4040
@class FIRQuerySnapshot;
4141
@class FSTDatabaseID;
@@ -66,7 +66,7 @@ NS_ASSUME_NONNULL_BEGIN
6666
* All callbacks and events will be triggered on the provided userExecutor.
6767
*/
6868
+ (instancetype)clientWithDatabaseInfo:(const core::DatabaseInfo &)databaseInfo
69-
settings:(FIRFirestoreSettings *)settings
69+
settings:(const api::Settings &)settings
7070
credentialsProvider:
7171
(auth::CredentialsProvider *)credentialsProvider // no passing ownership
7272
userExecutor:(std::unique_ptr<util::Executor>)userExecutor

Firestore/Source/Core/FSTFirestoreClient.mm

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include <utility>
2323

2424
#import "FIRFirestoreErrors.h"
25-
#import "FIRFirestoreSettings.h"
2625
#import "Firestore/Source/API/FIRDocumentReference+Internal.h"
2726
#import "Firestore/Source/API/FIRDocumentSnapshot+Internal.h"
2827
#import "Firestore/Source/API/FIRFirestore+Internal.h"
@@ -42,6 +41,7 @@
4241
#import "Firestore/Source/Remote/FSTSerializerBeta.h"
4342
#import "Firestore/Source/Util/FSTClasses.h"
4443

44+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
4545
#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
4646
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
4747
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
@@ -60,6 +60,7 @@
6060
using firebase::firestore::FirestoreErrorCode;
6161
using firebase::firestore::api::DocumentReference;
6262
using firebase::firestore::api::DocumentSnapshot;
63+
using firebase::firestore::api::Settings;
6364
using firebase::firestore::api::SnapshotMetadata;
6465
using firebase::firestore::auth::CredentialsProvider;
6566
using firebase::firestore::auth::User;
@@ -97,7 +98,7 @@ @interface FSTFirestoreClient () {
9798
}
9899

99100
- (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo
100-
settings:(FIRFirestoreSettings *)settings
101+
settings:(const Settings &)settings
101102
credentialsProvider:
102103
(CredentialsProvider *)credentialsProvider // no passing ownership
103104
userExecutor:(std::unique_ptr<Executor>)userExecutor
@@ -142,7 +143,7 @@ - (AsyncQueue *)workerQueue {
142143
}
143144

144145
+ (instancetype)clientWithDatabaseInfo:(const DatabaseInfo &)databaseInfo
145-
settings:(FIRFirestoreSettings *)settings
146+
settings:(const Settings &)settings
146147
credentialsProvider:
147148
(CredentialsProvider *)credentialsProvider // no passing ownership
148149
userExecutor:(std::unique_ptr<Executor>)userExecutor
@@ -155,7 +156,7 @@ + (instancetype)clientWithDatabaseInfo:(const DatabaseInfo &)databaseInfo
155156
}
156157

157158
- (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo
158-
settings:(FIRFirestoreSettings *)settings
159+
settings:(const Settings &)settings
159160
credentialsProvider:
160161
(CredentialsProvider *)credentialsProvider // no passing ownership
161162
userExecutor:(std::unique_ptr<Executor>)userExecutor
@@ -199,15 +200,15 @@ - (instancetype)initWithDatabaseInfo:(const DatabaseInfo &)databaseInfo
199200
return self;
200201
}
201202

202-
- (void)initializeWithUser:(const User &)user settings:(FIRFirestoreSettings *)settings {
203+
- (void)initializeWithUser:(const User &)user settings:(const Settings &)settings {
203204
// Do all of our initialization on our own dispatch queue.
204205
_workerQueue->VerifyIsCurrentQueue();
205206
LOG_DEBUG("Initializing. Current user: %s", user.uid());
206207

207208
// Note: The initialization work must all be synchronous (we can't dispatch more work) since
208209
// external write/listen operations could get queued to run before that subsequent work
209210
// completes.
210-
if (settings.isPersistenceEnabled) {
211+
if (settings.persistence_enabled()) {
211212
Path dir = [FSTLevelDB storageDirectoryForDatabaseInfo:*self.databaseInfo
212213
documentsDirectory:[FSTLevelDB documentsDirectory]];
213214

@@ -219,7 +220,7 @@ - (void)initializeWithUser:(const User &)user settings:(FIRFirestoreSettings *)s
219220
Status levelDbStatus =
220221
[FSTLevelDB dbWithDirectory:std::move(dir)
221222
serializer:serializer
222-
lruParams:LruParams::WithCacheSize(settings.cacheSizeBytes)
223+
lruParams:LruParams::WithCacheSize(settings.cache_size_bytes())
223224
ptr:&ldb];
224225
if (!levelDbStatus.ok()) {
225226
// If leveldb fails to start then just throw up our hands: the error is unrecoverable.

Firestore/core/src/firebase/firestore/api/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ cc_select(
3939
cc_library(
4040
firebase_firestore_api
4141
SOURCES
42+
settings.cc
43+
settings.h
4244
snapshot_metadata.cc
4345
snapshot_metadata.h
4446
DEPENDS

Firestore/core/src/firebase/firestore/api/firestore.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <utility>
3030
#include "dispatch/dispatch.h"
3131

32+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
3233
#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
3334
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
3435
#include "Firestore/core/src/firebase/firestore/util/async_queue.h"
@@ -39,7 +40,6 @@ NS_ASSUME_NONNULL_BEGIN
3940
@class FIRApp;
4041
@class FIRCollectionReference;
4142
@class FIRFirestore;
42-
@class FIRFirestoreSettings;
4343
@class FIRQuery;
4444
@class FIRTransaction;
4545
@class FIRWriteBatch;
@@ -86,8 +86,10 @@ class Firestore {
8686
return extension_;
8787
}
8888

89-
FIRFirestoreSettings* settings() const;
90-
void set_settings(FIRFirestoreSettings* settings);
89+
const Settings& settings() const;
90+
void set_settings(const Settings& settings);
91+
92+
void set_user_executor(std::unique_ptr<util::Executor> user_executor);
9193

9294
FIRCollectionReference* GetCollection(absl::string_view collection_path);
9395
DocumentReference GetDocument(absl::string_view document_path);
@@ -111,13 +113,14 @@ class Firestore {
111113
std::string persistence_key_;
112114
FSTFirestoreClient* client_ = nil;
113115

114-
// Ownership will be transferred to `FSTFirestoreClient` as soon as the
115-
// client is created.
116+
// Ownership of these will be transferred to `FSTFirestoreClient` as soon as
117+
// the client is created.
118+
std::unique_ptr<util::Executor> user_executor_;
116119
std::unique_ptr<util::AsyncQueue> worker_queue_;
117120

118121
void* extension_ = nullptr;
119122

120-
FIRFirestoreSettings* settings_ = nil;
123+
Settings settings_;
121124

122125
mutable std::mutex mutex_;
123126
};

Firestore/core/src/firebase/firestore/api/firestore.mm

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
#include "Firestore/core/src/firebase/firestore/api/firestore.h"
1818

19-
#import "FIRFirestoreSettings.h"
2019
#import "Firestore/Source/API/FIRCollectionReference+Internal.h"
2120
#import "Firestore/Source/API/FIRDocumentReference+Internal.h"
2221
#import "Firestore/Source/API/FIRFirestore+Internal.h"
@@ -27,6 +26,7 @@
2726
#import "Firestore/Source/Core/FSTQuery.h"
2827

2928
#include "Firestore/core/src/firebase/firestore/api/document_reference.h"
29+
#include "Firestore/core/src/firebase/firestore/api/settings.h"
3030
#include "Firestore/core/src/firebase/firestore/auth/firebase_credentials_provider_apple.h"
3131
#include "Firestore/core/src/firebase/firestore/core/transaction.h"
3232
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
@@ -61,31 +61,35 @@
6161
persistence_key_{std::move(persistence_key)},
6262
worker_queue_{std::move(worker_queue)},
6363
extension_{extension} {
64-
settings_ = [[FIRFirestoreSettings alloc] init];
6564
}
6665

6766
AsyncQueue* Firestore::worker_queue() {
6867
return [client_ workerQueue];
6968
}
7069

71-
FIRFirestoreSettings* Firestore::settings() const {
70+
const Settings& Firestore::settings() const {
7271
std::lock_guard<std::mutex> lock{mutex_};
73-
// Disallow mutation of our internal settings
74-
return [settings_ copy];
72+
return settings_;
7573
}
7674

77-
void Firestore::set_settings(FIRFirestoreSettings* settings) {
75+
void Firestore::set_settings(const Settings& settings) {
7876
std::lock_guard<std::mutex> lock{mutex_};
79-
// As a special exception, don't throw if the same settings are passed
80-
// repeatedly. This should make it more friendly to create a Firestore
81-
// instance.
82-
if (client_ && ![settings_ isEqual:settings]) {
77+
if (client_) {
8378
HARD_FAIL(
8479
"Firestore instance has already been started and its settings can "
8580
"no longer be changed. You can only set settings before calling any "
8681
"other methods on a Firestore instance.");
8782
}
88-
settings_ = [settings copy];
83+
settings_ = settings;
84+
}
85+
86+
void Firestore::set_user_executor(
87+
std::unique_ptr<util::Executor> user_executor) {
88+
std::lock_guard<std::mutex> lock{mutex_};
89+
HARD_ASSERT(!client_ && user_executor,
90+
"set_user_executor() must be called with a valid executor, "
91+
"before the client is initialized.");
92+
user_executor_ = std::move(user_executor);
8993
}
9094

9195
FIRCollectionReference* Firestore::GetCollection(
@@ -175,24 +179,15 @@
175179
std::lock_guard<std::mutex> lock{mutex_};
176180

177181
if (!client_) {
178-
// These values are validated elsewhere; this is just double-checking:
179-
HARD_ASSERT(settings_.host, "FirestoreSettings.host cannot be nil.");
180-
HARD_ASSERT(settings_.dispatchQueue,
181-
"FirestoreSettings.dispatchQueue cannot be nil.");
182-
183-
DatabaseInfo database_info(database_id_, persistence_key_,
184-
util::MakeString(settings_.host),
185-
settings_.sslEnabled);
186-
187-
std::unique_ptr<Executor> user_executor =
188-
absl::make_unique<ExecutorLibdispatch>(settings_.dispatchQueue);
182+
DatabaseInfo database_info(database_id_, persistence_key_, settings_.host(),
183+
settings_.ssl_enabled());
189184

190185
HARD_ASSERT(worker_queue_, "Expected non-null worker queue");
191186
client_ =
192187
[FSTFirestoreClient clientWithDatabaseInfo:database_info
193188
settings:settings_
194189
credentialsProvider:credentials_provider_.get()
195-
userExecutor:std::move(user_executor)
190+
userExecutor:std::move(user_executor_)
196191
workerQueue:std::move(worker_queue_)];
197192
}
198193
}

0 commit comments

Comments
 (0)