@@ -55,7 +55,9 @@ static bool ValidateQueryEndpoints(const QueryParams& params, Logger* logger) {
55
55
std::string start_name = GetStartName (params);
56
56
if ((start_name != QueryParamsComparator::kMinKey ) ||
57
57
!(start_node.is_string ())) {
58
- logger->LogWarning (message);
58
+ if (logger) {
59
+ logger->LogWarning (message);
60
+ }
59
61
return false ;
60
62
}
61
63
}
@@ -64,18 +66,22 @@ static bool ValidateQueryEndpoints(const QueryParams& params, Logger* logger) {
64
66
std::string end_name = GetEndName (params);
65
67
if ((end_name != QueryParamsComparator::kMaxKey ) ||
66
68
!(end_node.is_string ())) {
67
- logger->LogWarning (message);
69
+ if (logger) {
70
+ logger->LogWarning (message);
71
+ }
68
72
return false ;
69
73
}
70
74
}
71
75
} else {
72
76
if (params.order_by == QueryParams::kOrderByPriority ) {
73
77
if ((HasStart (params) && !IsValidPriority (GetStartValue (params))) ||
74
78
(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
+ }
79
85
return false ;
80
86
}
81
87
}
@@ -86,12 +92,16 @@ static bool ValidateQueryEndpoints(const QueryParams& params, Logger* logger) {
86
92
QueryInternal::QueryInternal (DatabaseInternal* database,
87
93
const QuerySpec& query_spec)
88
94
: 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
+ }
90
98
}
91
99
92
100
QueryInternal::QueryInternal (const QueryInternal& internal)
93
101
: 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
+ }
95
105
}
96
106
97
107
QueryInternal& QueryInternal::operator =(const QueryInternal& internal) {
@@ -104,15 +114,19 @@ QueryInternal& QueryInternal::operator=(const QueryInternal& internal) {
104
114
QueryInternal::QueryInternal (QueryInternal&& internal)
105
115
: database_(internal.database_),
106
116
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
+ }
109
121
}
110
122
111
123
QueryInternal& QueryInternal::operator =(QueryInternal&& internal) {
112
124
database_ = internal.database_ ;
113
125
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
+ }
116
130
return *this ;
117
131
}
118
132
#endif // defined(FIREBASE_USE_MOVE_OPERATORS) || defined(DOXYGEN)
@@ -306,99 +320,118 @@ QueryInternal* QueryInternal::OrderByValue() {
306
320
}
307
321
308
322
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
+ }
315
332
return nullptr ;
316
333
}
317
334
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
+ }
319
338
return nullptr ;
320
339
}
321
340
QuerySpec spec = query_spec_;
322
341
spec.params .start_at_value = value;
323
- if (!ValidateQueryEndpoints (spec.params , database_-> logger () )) {
342
+ if (!ValidateQueryEndpoints (spec.params , logger)) {
324
343
return nullptr ;
325
344
}
326
345
return new QueryInternal (database_, spec);
327
346
}
328
347
329
348
QueryInternal* QueryInternal::StartAt (const Variant& value,
330
349
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
+ }
337
359
return nullptr ;
338
360
}
339
361
FIREBASE_ASSERT_RETURN (nullptr , child_key != nullptr );
340
362
QuerySpec spec = query_spec_;
341
363
spec.params .start_at_value = value;
342
364
spec.params .start_at_child_key = child_key;
343
- if (!ValidateQueryEndpoints (spec.params , database_-> logger () )) {
365
+ if (!ValidateQueryEndpoints (spec.params , logger)) {
344
366
return nullptr ;
345
367
}
346
368
return new QueryInternal (database_, spec);
347
369
}
348
370
349
371
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
+ }
356
381
return nullptr ;
357
382
}
358
383
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
+ }
360
387
return nullptr ;
361
388
}
362
389
QuerySpec spec = query_spec_;
363
390
spec.params .end_at_value = value;
364
- if (!ValidateQueryEndpoints (spec.params , database_-> logger () )) {
391
+ if (!ValidateQueryEndpoints (spec.params , logger)) {
365
392
return nullptr ;
366
393
}
367
394
return new QueryInternal (database_, spec);
368
395
}
369
396
370
397
QueryInternal* QueryInternal::EndAt (const Variant& value,
371
398
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
+ }
378
408
return nullptr ;
379
409
}
380
410
FIREBASE_ASSERT_RETURN (nullptr , child_key != nullptr );
381
411
QuerySpec spec = query_spec_;
382
412
spec.params .end_at_value = value;
383
413
spec.params .end_at_child_key = child_key;
384
- if (!ValidateQueryEndpoints (spec.params , database_-> logger () )) {
414
+ if (!ValidateQueryEndpoints (spec.params , logger)) {
385
415
return nullptr ;
386
416
}
387
417
return new QueryInternal (database_, spec);
388
418
}
389
419
390
420
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
+ }
397
430
return nullptr ;
398
431
}
399
432
QuerySpec spec = query_spec_;
400
433
spec.params .equal_to_value = value;
401
- if (!ValidateQueryEndpoints (spec.params , database_-> logger () )) {
434
+ if (!ValidateQueryEndpoints (spec.params , logger)) {
402
435
return nullptr ;
403
436
}
404
437
return new QueryInternal (database_, spec);
@@ -407,17 +440,20 @@ QueryInternal* QueryInternal::EqualTo(const Variant& value) {
407
440
QueryInternal* QueryInternal::EqualTo (const Variant& value,
408
441
const char * child_key) {
409
442
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
+ }
416
452
}
417
453
QuerySpec spec = query_spec_;
418
454
spec.params .equal_to_value = value;
419
455
spec.params .equal_to_child_key = child_key;
420
- if (!ValidateQueryEndpoints (spec.params , database_-> logger () )) {
456
+ if (!ValidateQueryEndpoints (spec.params , logger)) {
421
457
return nullptr ;
422
458
}
423
459
return new QueryInternal (database_, spec);
0 commit comments