@@ -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) {
8692QueryInternal::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
92100QueryInternal::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
97107QueryInternal& QueryInternal::operator =(const QueryInternal& internal) {
@@ -104,15 +114,19 @@ QueryInternal& QueryInternal::operator=(const QueryInternal& internal) {
104114QueryInternal::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
111123QueryInternal& 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
308322QueryInternal* 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
329348QueryInternal* 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
349371QueryInternal* 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
370397QueryInternal* 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
390420QueryInternal* 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) {
407440QueryInternal* 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