Skip to content

Commit 3b2b1d2

Browse files
author
Alex Ames
committed
Queries and DatabaseReferences no longer require a Database* or Logger*
to operate. This change is makes it easier to properly test SyncPonts in isolation since now we don't need to spin up a whole Database when dealing with the associated References and Queries.
1 parent 7cfcf93 commit 3b2b1d2

File tree

2 files changed

+112
-66
lines changed

2 files changed

+112
-66
lines changed

database/src/desktop/database_reference_desktop.cc

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@
1313
// limitations under the License.
1414

1515
#include "database/src/desktop/database_reference_desktop.h"
16+
1617
#include <stdio.h>
18+
1719
#include <sstream>
20+
1821
#include "app/rest/util.h"
1922
#include "app/src/variant_util.h"
2023
#include "database/src/common/database_reference.h"
2124
#include "database/src/desktop/database_desktop.h"
2225
#include "database/src/desktop/disconnection_desktop.h"
2326
#include "database/src/desktop/util_desktop.h"
24-
2527
#include "flatbuffers/util.h"
2628

2729
namespace firebase {
@@ -37,15 +39,19 @@ const char kVirtualChildKeyPriority[] = ".priority";
3739
DatabaseReferenceInternal::DatabaseReferenceInternal(DatabaseInternal* database,
3840
const Path& path)
3941
: QueryInternal(database, QuerySpec(path)) {
40-
database_->future_manager().AllocFutureApi(&future_api_id_,
41-
kDatabaseReferenceFnCount);
42+
if (database_) {
43+
database_->future_manager().AllocFutureApi(&future_api_id_,
44+
kDatabaseReferenceFnCount);
45+
}
4246
}
4347

4448
DatabaseReferenceInternal::DatabaseReferenceInternal(
4549
const DatabaseReferenceInternal& internal)
4650
: QueryInternal(internal) {
47-
database_->future_manager().AllocFutureApi(&future_api_id_,
48-
kDatabaseReferenceFnCount);
51+
if (database_) {
52+
database_->future_manager().AllocFutureApi(&future_api_id_,
53+
kDatabaseReferenceFnCount);
54+
}
4955
}
5056

5157
DatabaseReferenceInternal& DatabaseReferenceInternal::operator=(
@@ -57,22 +63,26 @@ DatabaseReferenceInternal& DatabaseReferenceInternal::operator=(
5763
#if defined(FIREBASE_USE_MOVE_OPERATORS) || defined(DOXYGEN)
5864
DatabaseReferenceInternal::DatabaseReferenceInternal(
5965
DatabaseReferenceInternal&& internal) {
60-
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
61-
&future_api_id_);
66+
if (database_) {
67+
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
68+
&future_api_id_);
69+
}
6270
QueryInternal::operator=(std::move(internal));
6371
}
6472

6573
DatabaseReferenceInternal& DatabaseReferenceInternal::operator=(
6674
DatabaseReferenceInternal&& internal) {
67-
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
68-
&future_api_id_);
75+
if (database_) {
76+
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
77+
&future_api_id_);
78+
}
6979
QueryInternal::operator=(std::move(internal));
7080
return *this;
7181
}
7282
#endif // defined(FIREBASE_USE_MOVE_OPERATORS) || defined(DOXYGEN)
7383

7484
Database* DatabaseReferenceInternal::GetDatabase() const {
75-
return Database::GetInstance(database_->GetApp());
85+
return database_ ? Database::GetInstance(database_->GetApp()) : nullptr;
7686
}
7787

7888
std::string DatabaseReferenceInternal::GetUrl() const {

database/src/desktop/query_desktop.cc

Lines changed: 92 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ static bool ValidateQueryEndpoints(const QueryParams& params, Logger* logger) {
5555
std::string start_name = GetStartName(params);
5656
if ((start_name != QueryParamsComparator::kMinKey) ||
5757
!(start_node.is_string())) {
58-
logger->LogWarning(message);
58+
if (logger) {
59+
logger->LogWarning(message);
60+
}
5961
return false;
6062
}
6163
}
@@ -64,18 +66,22 @@ static bool ValidateQueryEndpoints(const QueryParams& params, Logger* logger) {
6466
std::string end_name = GetEndName(params);
6567
if ((end_name != QueryParamsComparator::kMaxKey) ||
6668
!(end_node.is_string())) {
67-
logger->LogWarning(message);
69+
if (logger) {
70+
logger->LogWarning(message);
71+
}
6872
return false;
6973
}
7074
}
7175
} else {
7276
if (params.order_by == QueryParams::kOrderByPriority) {
7377
if ((HasStart(params) && !IsValidPriority(GetStartValue(params))) ||
7478
(HasEnd(params) && !IsValidPriority(GetEndValue(params)))) {
75-
logger->LogWarning(
76-
"When using orderByPriority(), values provided to "
77-
"StartAt(), EndAt(), or EqualTo() must be valid "
78-
"priorities.");
79+
if (logger) {
80+
logger->LogWarning(
81+
"When using orderByPriority(), values provided to "
82+
"StartAt(), EndAt(), or EqualTo() must be valid "
83+
"priorities.");
84+
}
7985
return false;
8086
}
8187
}
@@ -86,12 +92,16 @@ static bool ValidateQueryEndpoints(const QueryParams& params, Logger* logger) {
8692
QueryInternal::QueryInternal(DatabaseInternal* database,
8793
const QuerySpec& query_spec)
8894
: database_(database), query_spec_(query_spec) {
89-
database_->future_manager().AllocFutureApi(&future_api_id_, kQueryFnCount);
95+
if (database_) {
96+
database_->future_manager().AllocFutureApi(&future_api_id_, kQueryFnCount);
97+
}
9098
}
9199

92100
QueryInternal::QueryInternal(const QueryInternal& internal)
93101
: database_(internal.database_), query_spec_(internal.query_spec_) {
94-
database_->future_manager().AllocFutureApi(&future_api_id_, kQueryFnCount);
102+
if (database_) {
103+
database_->future_manager().AllocFutureApi(&future_api_id_, kQueryFnCount);
104+
}
95105
}
96106

97107
QueryInternal& QueryInternal::operator=(const QueryInternal& internal) {
@@ -104,15 +114,19 @@ QueryInternal& QueryInternal::operator=(const QueryInternal& internal) {
104114
QueryInternal::QueryInternal(QueryInternal&& internal)
105115
: database_(internal.database_),
106116
query_spec_(std::move(internal.query_spec_)) {
107-
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
108-
&future_api_id_);
117+
if (database_) {
118+
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
119+
&future_api_id_);
120+
}
109121
}
110122

111123
QueryInternal& QueryInternal::operator=(QueryInternal&& internal) {
112124
database_ = internal.database_;
113125
query_spec_ = std::move(internal.query_spec_);
114-
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
115-
&future_api_id_);
126+
if (database_) {
127+
database_->future_manager().MoveFutureApi(&internal.future_api_id_,
128+
&future_api_id_);
129+
}
116130
return *this;
117131
}
118132
#endif // defined(FIREBASE_USE_MOVE_OPERATORS) || defined(DOXYGEN)
@@ -306,99 +320,118 @@ QueryInternal* QueryInternal::OrderByValue() {
306320
}
307321

308322
QueryInternal* QueryInternal::StartAt(const Variant& value) {
309-
Logger* logger = database_->logger();
310-
if (!value.is_numeric() && !value.is_string() && !value.is_bool()) {
311-
logger->LogWarning(
312-
"Query::StartAt(): Only strings, numbers, and boolean values are "
313-
"allowed. (URL = %s)",
314-
query_spec_.path.c_str());
323+
Logger* logger = database_ ? database_->logger() : nullptr;
324+
if (!value.is_null() && !value.is_numeric() && !value.is_string() &&
325+
!value.is_bool()) {
326+
if (logger) {
327+
logger->LogWarning(
328+
"Query::StartAt(): Only strings, numbers, and boolean values are "
329+
"allowed. (URL = %s)",
330+
query_spec_.path.c_str());
331+
}
315332
return nullptr;
316333
}
317334
if (HasStart(query_spec_.params)) {
318-
logger->LogWarning("Can't Call StartAt() or EqualTo() multiple times");
335+
if (logger) {
336+
logger->LogWarning("Can't Call StartAt() or EqualTo() multiple times");
337+
}
319338
return nullptr;
320339
}
321340
QuerySpec spec = query_spec_;
322341
spec.params.start_at_value = value;
323-
if (!ValidateQueryEndpoints(spec.params, database_->logger())) {
342+
if (!ValidateQueryEndpoints(spec.params, logger)) {
324343
return nullptr;
325344
}
326345
return new QueryInternal(database_, spec);
327346
}
328347

329348
QueryInternal* QueryInternal::StartAt(const Variant& value,
330349
const char* child_key) {
331-
Logger* logger = database_->logger();
332-
if (!value.is_numeric() && !value.is_string() && !value.is_bool()) {
333-
logger->LogWarning(
334-
"Query::StartAt: Only strings, numbers, and boolean values are "
335-
"allowed. (URL = %s)",
336-
query_spec_.path.c_str());
350+
Logger* logger = database_ ? database_->logger() : nullptr;
351+
if (!value.is_null() && !value.is_numeric() && !value.is_string() &&
352+
!value.is_bool()) {
353+
if (logger) {
354+
logger->LogWarning(
355+
"Query::StartAt: Only strings, numbers, and boolean values are "
356+
"allowed. (URL = %s)",
357+
query_spec_.path.c_str());
358+
}
337359
return nullptr;
338360
}
339361
FIREBASE_ASSERT_RETURN(nullptr, child_key != nullptr);
340362
QuerySpec spec = query_spec_;
341363
spec.params.start_at_value = value;
342364
spec.params.start_at_child_key = child_key;
343-
if (!ValidateQueryEndpoints(spec.params, database_->logger())) {
365+
if (!ValidateQueryEndpoints(spec.params, logger)) {
344366
return nullptr;
345367
}
346368
return new QueryInternal(database_, spec);
347369
}
348370

349371
QueryInternal* QueryInternal::EndAt(const Variant& value) {
350-
Logger* logger = database_->logger();
351-
if (!value.is_numeric() && !value.is_string() && !value.is_bool()) {
352-
logger->LogWarning(
353-
"Query::EndAt: Only strings, numbers, and boolean values are "
354-
"allowed. (URL = %s)",
355-
query_spec_.path.c_str());
372+
Logger* logger = database_ ? database_->logger() : nullptr;
373+
if (!value.is_null() && !value.is_numeric() && !value.is_string() &&
374+
!value.is_bool()) {
375+
if (logger) {
376+
logger->LogWarning(
377+
"Query::EndAt: Only strings, numbers, and boolean values are "
378+
"allowed. (URL = %s)",
379+
query_spec_.path.c_str());
380+
}
356381
return nullptr;
357382
}
358383
if (HasEnd(query_spec_.params)) {
359-
logger->LogWarning("Can't Call EndAt() or EqualTo() multiple times");
384+
if (logger) {
385+
logger->LogWarning("Can't Call EndAt() or EqualTo() multiple times");
386+
}
360387
return nullptr;
361388
}
362389
QuerySpec spec = query_spec_;
363390
spec.params.end_at_value = value;
364-
if (!ValidateQueryEndpoints(spec.params, database_->logger())) {
391+
if (!ValidateQueryEndpoints(spec.params, logger)) {
365392
return nullptr;
366393
}
367394
return new QueryInternal(database_, spec);
368395
}
369396

370397
QueryInternal* QueryInternal::EndAt(const Variant& value,
371398
const char* child_key) {
372-
Logger* logger = database_->logger();
373-
if (!value.is_numeric() && !value.is_string() && !value.is_bool()) {
374-
logger->LogWarning(
375-
"Query::EndAt: Only strings, numbers, and boolean values are "
376-
"allowed. (URL = %s)",
377-
query_spec_.path.c_str());
399+
Logger* logger = database_ ? database_->logger() : nullptr;
400+
if (!value.is_null() && !value.is_numeric() && !value.is_string() &&
401+
!value.is_bool()) {
402+
if (logger) {
403+
logger->LogWarning(
404+
"Query::EndAt: Only strings, numbers, and boolean values are "
405+
"allowed. (URL = %s)",
406+
query_spec_.path.c_str());
407+
}
378408
return nullptr;
379409
}
380410
FIREBASE_ASSERT_RETURN(nullptr, child_key != nullptr);
381411
QuerySpec spec = query_spec_;
382412
spec.params.end_at_value = value;
383413
spec.params.end_at_child_key = child_key;
384-
if (!ValidateQueryEndpoints(spec.params, database_->logger())) {
414+
if (!ValidateQueryEndpoints(spec.params, logger)) {
385415
return nullptr;
386416
}
387417
return new QueryInternal(database_, spec);
388418
}
389419

390420
QueryInternal* QueryInternal::EqualTo(const Variant& value) {
391-
Logger* logger = database_->logger();
392-
if (!value.is_numeric() && !value.is_string() && !value.is_bool()) {
393-
logger->LogWarning(
394-
"Query::EqualTo: Only strings, numbers, and boolean values are "
395-
"allowed. (URL = %s)",
396-
query_spec_.path.c_str());
421+
Logger* logger = database_ ? database_->logger() : nullptr;
422+
if (!value.is_null() && !value.is_numeric() && !value.is_string() &&
423+
!value.is_bool()) {
424+
if (logger) {
425+
logger->LogWarning(
426+
"Query::EqualTo: Only strings, numbers, and boolean values are "
427+
"allowed. (URL = %s)",
428+
query_spec_.path.c_str());
429+
}
397430
return nullptr;
398431
}
399432
QuerySpec spec = query_spec_;
400433
spec.params.equal_to_value = value;
401-
if (!ValidateQueryEndpoints(spec.params, database_->logger())) {
434+
if (!ValidateQueryEndpoints(spec.params, logger)) {
402435
return nullptr;
403436
}
404437
return new QueryInternal(database_, spec);
@@ -407,17 +440,20 @@ QueryInternal* QueryInternal::EqualTo(const Variant& value) {
407440
QueryInternal* QueryInternal::EqualTo(const Variant& value,
408441
const char* child_key) {
409442
Logger* logger = database_->logger();
410-
if (!value.is_numeric() && !value.is_string() && !value.is_bool()) {
411-
logger->LogWarning(
412-
"Query::EqualTo: Only strings, numbers, and boolean values are "
413-
"allowed. (URL = %s)",
414-
query_spec_.path.c_str());
415-
return nullptr;
443+
if (!value.is_null() && !value.is_numeric() && !value.is_string() &&
444+
!value.is_bool()) {
445+
if (logger) {
446+
logger->LogWarning(
447+
"Query::EqualTo: Only strings, numbers, and boolean values are "
448+
"allowed. (URL = %s)",
449+
query_spec_.path.c_str());
450+
return nullptr;
451+
}
416452
}
417453
QuerySpec spec = query_spec_;
418454
spec.params.equal_to_value = value;
419455
spec.params.equal_to_child_key = child_key;
420-
if (!ValidateQueryEndpoints(spec.params, database_->logger())) {
456+
if (!ValidateQueryEndpoints(spec.params, logger)) {
421457
return nullptr;
422458
}
423459
return new QueryInternal(database_, spec);

0 commit comments

Comments
 (0)