Skip to content

Commit c8838c9

Browse files
smilesa-maurice
authored andcommitted
Implementation of RT DB C++ log level methods.
Added a way to set the logger verbosity of the RT DB via the C++ interface. PiperOrigin-RevId: 254108819
1 parent 2258911 commit c8838c9

File tree

7 files changed

+124
-12
lines changed

7 files changed

+124
-12
lines changed

database/src/android/database_android.cc

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <jni.h>
1919
#include "app/src/include/firebase/app.h"
2020
#include "app/src/include/firebase/future.h"
21+
#include "app/src/include/firebase/log.h"
2122
#include "app/src/reference_counted_future_impl.h"
2223
#include "app/src/util_android.h"
2324
#include "database/database_resources.h"
@@ -35,6 +36,19 @@ namespace internal {
3536

3637
const char kApiIdentifier[] = "Database";
3738

39+
// clang-format off
40+
#define LOGGER_LEVEL_METHODS(X) \
41+
X(ValueOf, "valueOf", \
42+
"(Ljava/lang/String;)Lcom/google/firebase/database/Logger$Level;", \
43+
util::kMethodTypeStatic)
44+
// clang-format on
45+
METHOD_LOOKUP_DECLARATION(logger_level, LOGGER_LEVEL_METHODS)
46+
47+
METHOD_LOOKUP_DEFINITION(
48+
logger_level,
49+
PROGUARD_KEEP_CLASS "com/google/firebase/database/Logger$Level",
50+
LOGGER_LEVEL_METHODS)
51+
3852
// clang-format off
3953
#define FIREBASE_DATABASE_METHODS(X) \
4054
X(GetInstance, "getInstance", \
@@ -147,7 +161,7 @@ Mutex DatabaseInternal::init_mutex_; // NOLINT
147161
int DatabaseInternal::initialize_count_ = 0;
148162
std::map<jint, Error>* DatabaseInternal::java_error_to_cpp_ = nullptr;
149163

150-
DatabaseInternal::DatabaseInternal(App* app) {
164+
DatabaseInternal::DatabaseInternal(App* app) : log_level_(kLogLevelInfo) {
151165
app_ = nullptr;
152166
if (!Initialize(app)) return;
153167
app_ = app;
@@ -170,7 +184,7 @@ DatabaseInternal::DatabaseInternal(App* app) {
170184
}
171185

172186
DatabaseInternal::DatabaseInternal(App* app, const char* url)
173-
: constructor_url_(url) {
187+
: constructor_url_(url), log_level_(kLogLevelInfo) {
174188
app_ = nullptr;
175189
if (!Initialize(app)) return;
176190
app_ = app;
@@ -213,12 +227,23 @@ static const struct {
213227
{database_error::kFieldCount, kErrorNone}, // sentinel value for end
214228
};
215229

230+
// C++ log levels mapped to Logger.Level enum value names.
231+
const char* kCppLogLevelToLoggerLevelName[] = {
232+
"DEBUG", // kLogLevelVerbose --> Logger.Level.DEBUG
233+
"DEBUG", // kLogLevelDebug --> Logger.Level.DEBUG
234+
"INFO", // kLogLevelInfo --> Logger.Level.INFO
235+
"WARN", // kLogLevelWarning --> Logger.Level.WARN
236+
"ERROR", // kLogLevelError --> Logger.Level.ERROR
237+
"NONE", // kLogLevelAssert --> Logger.Level.NONE
238+
};
239+
216240
bool DatabaseInternal::Initialize(App* app) {
217241
MutexLock init_lock(init_mutex_);
218242
if (initialize_count_ == 0) {
219243
JNIEnv* env = app->GetJNIEnv();
220244
jobject activity = app->activity();
221245
if (!(firebase_database::CacheMethodIds(env, activity) &&
246+
logger_level::CacheMethodIds(env, activity) &&
222247
database_error::CacheMethodIds(env, activity) &&
223248
database_error::CacheFieldIds(env, activity) &&
224249
// Call Initialize on all other RTDB internal classes.
@@ -332,6 +357,7 @@ bool DatabaseInternal::InitializeEmbeddedClasses(App* app) {
332357
void DatabaseInternal::ReleaseClasses(App* app) {
333358
JNIEnv* env = app->GetJNIEnv();
334359
firebase_database::ReleaseClass(env);
360+
logger_level::ReleaseClass(env);
335361
database_error::ReleaseClass(env);
336362

337363
// Call Terminate on all other RTDB internal classes.
@@ -493,6 +519,33 @@ void DatabaseInternal::SetPersistenceEnabled(bool enabled) const {
493519
util::CheckAndClearJniExceptions(env);
494520
}
495521

522+
void DatabaseInternal::set_log_level(LogLevel log_level) {
523+
FIREBASE_ASSERT_RETURN_VOID(log_level <
524+
(sizeof(kCppLogLevelToLoggerLevelName) /
525+
sizeof(kCppLogLevelToLoggerLevelName[0])));
526+
JNIEnv* env = app_->GetJNIEnv();
527+
jstring enum_name = env->NewStringUTF(
528+
kCppLogLevelToLoggerLevelName[log_level]);
529+
if (!util::CheckAndClearJniExceptions(env)) {
530+
jobject log_level_enum_obj = env->CallStaticObjectMethod(
531+
logger_level::GetClass(),
532+
logger_level::GetMethodId(logger_level::kValueOf), enum_name);
533+
if (!util::CheckAndClearJniExceptions(env)) {
534+
env->CallVoidMethod(
535+
obj_,
536+
firebase_database::GetMethodId(firebase_database::kSetLogLevel),
537+
log_level_enum_obj);
538+
if (!util::CheckAndClearJniExceptions(env)) {
539+
log_level_ = log_level;
540+
}
541+
env->DeleteLocalRef(log_level_enum_obj);
542+
}
543+
env->DeleteLocalRef(enum_name);
544+
}
545+
}
546+
547+
LogLevel DatabaseInternal::log_level() const { return log_level_; }
548+
496549
Error DatabaseInternal::ErrorFromResultAndErrorCode(
497550
util::FutureResult result_code, jint error_code) const {
498551
switch (result_code) {

database/src/android/database_android.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "app/src/cleanup_notifier.h"
2323
#include "app/src/future_manager.h"
2424
#include "app/src/include/firebase/app.h"
25+
#include "app/src/include/firebase/log.h"
2526
#include "app/src/mutex.h"
2627
#include "app/src/util_android.h"
2728
#include "database/src/android/database_reference_android.h"
@@ -64,6 +65,14 @@ class DatabaseInternal {
6465

6566
void SetPersistenceEnabled(bool enabled) const;
6667

68+
// Set the logging verbosity.
69+
// kLogLevelDebug and kLogLevelVerbose are interpreted as the same level by
70+
// the Android implementation.
71+
void set_log_level(LogLevel log_level);
72+
73+
// Get the logging verbosity.
74+
LogLevel log_level() const;
75+
6776
// Convert a future result code and error code from a Java DatabaseError into
6877
// a C++ Error enum.
6978
Error ErrorFromResultAndErrorCode(util::FutureResult result_code,
@@ -203,6 +212,8 @@ class DatabaseInternal {
203212
// The url passed to the constructor (or "" if none was passed).
204213
// We keep it so that we can find the database in our cache.
205214
std::string constructor_url_;
215+
216+
LogLevel log_level_;
206217
};
207218

208219
} // namespace internal

database/src/common/database.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,13 @@ void Database::set_persistence_enabled(bool enabled) {
195195
if (internal_) internal_->SetPersistenceEnabled(enabled);
196196
}
197197

198-
#if defined(INTERNAL_EXPERIMENTAL) || defined(SWIG)
199-
void Database::set_log_level(LogLevel level) {
198+
void Database::set_log_level(LogLevel log_level) {
199+
if (internal_) internal_->set_log_level(log_level);
200200
}
201201

202-
LogLevel Database::log_level() const { return kLogLevelInfo; }
203-
#endif // defined(INTERNAL_EXPERIMENTAL) || defined(SWIG)
202+
LogLevel Database::log_level() const {
203+
return internal_ ? internal_->log_level() : kLogLevelInfo;
204+
}
204205

205206
} // namespace database
206207
} // namespace firebase

database/src/desktop/database_desktop.cc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ DatabaseInternal::DatabaseInternal(App* app, const char* url)
6969
cleanup_(),
7070
safe_this_(this),
7171
constructor_url_(url),
72-
repo_(app, this, url) {
72+
repo_(app, this, url),
73+
log_level_(kLogLevelInfo) {
7374
assert(app);
7475
assert(url);
7576

@@ -185,6 +186,12 @@ void DatabaseInternal::SetPersistenceEnabled(bool /*enabled*/) {
185186
LogWarning("Persistence is not currently supported.");
186187
}
187188

189+
void DatabaseInternal::set_log_level(LogLevel log_level) {
190+
log_level_ = log_level;
191+
}
192+
193+
LogLevel DatabaseInternal::log_level() const { return log_level_; }
194+
188195
void DatabaseInternal::SetVerboseLogging(bool /*enable*/) {}
189196

190197
bool DatabaseInternal::RegisterValueListener(

database/src/desktop/database_desktop.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ class DatabaseInternal {
8585

8686
void SetPersistenceEnabled(bool enabled);
8787

88+
// Set the logging verbosity.
89+
void set_log_level(LogLevel log_level);
90+
91+
// Get the logging verbosity.
92+
LogLevel log_level() const;
93+
8894
static void SetVerboseLogging(bool enable);
8995

9096
FutureManager& future_manager() { return future_manager_; }
@@ -189,6 +195,8 @@ class DatabaseInternal {
189195

190196
// The local copy of the repository, for offline support and local caching.
191197
Repo repo_;
198+
199+
LogLevel log_level_;
192200
};
193201

194202
} // namespace internal

database/src/ios/database_ios.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,13 @@ class DatabaseInternal {
8585
// Sets whether pending write data will persist between application exits.
8686
void SetPersistenceEnabled(bool enabled);
8787

88-
static void SetVerboseLogging(bool enable);
88+
// Set the logging verbosity.
89+
// The iOS implementation only enables logging for kLogLevelVerbose &
90+
// kLogLevelDebug, logging is disabled in for all other levels.
91+
void set_log_level(LogLevel log_level);
92+
93+
// Get the logging verbosity.
94+
LogLevel log_level() const;
8995

9096
#ifdef __OBJC__
9197
bool RegisterValueListener(
@@ -180,6 +186,8 @@ class DatabaseInternal {
180186
// The url passed to the constructor (or "" if none was passed).
181187
// We keep it so that we can find the database in our cache.
182188
std::string constructor_url_;
189+
190+
LogLevel log_level_;
183191
};
184192

185193
#pragma clang assume_nonnull end

database/src/ios/database_ios.mm

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "database/src/ios/database_ios.h"
1616

1717
#include "app/src/app_ios.h"
18+
#include "app/src/util.h"
1819
#include "app/src/include/firebase/app.h"
1920
#include "app/src/include/firebase/future.h"
2021
#include "app/src/reference_counted_future_impl.h"
@@ -26,7 +27,7 @@
2627
namespace internal {
2728

2829
DatabaseInternal::DatabaseInternal(App* app)
29-
: app_(app) {
30+
: app_(app), log_level_(kLogLevelInfo) {
3031
@try {
3132
impl_.reset(new FIRDatabasePointer(
3233
[FIRDatabase databaseForApp:static_cast<FIRAppPointer*>(app->data_)->ptr]));
@@ -40,7 +41,7 @@
4041
}
4142

4243
DatabaseInternal::DatabaseInternal(App* app, const char* url)
43-
: app_(app), constructor_url_(url) {
44+
: app_(app), constructor_url_(url), log_level_(kLogLevelInfo) {
4445
@try {
4546
impl_.reset(new FIRDatabasePointer(
4647
[FIRDatabase databaseForApp:static_cast<FIRAppPointer*>(app->data_)->ptr URL:@(url)]));
@@ -104,8 +105,31 @@ new DatabaseReferenceInternal(const_cast<DatabaseInternal*>(this),
104105

105106
void DatabaseInternal::SetPersistenceEnabled(bool enabled) { impl().persistenceEnabled = enabled; }
106107

107-
void DatabaseInternal::SetVerboseLogging(bool enable) {
108-
[FIRDatabase setLoggingEnabled:enable ? YES : NO];
108+
void DatabaseInternal::set_log_level(LogLevel log_level) {
109+
// iOS FIRDatabase only supports logging or not logging. Since the default logging level (Info)
110+
// should be quiet except for notices that can be resolved by the developer fixing their code,
111+
// logging is enabled for only kLogLevelVerbose & kLogLevelDebug.
112+
switch (log_level) {
113+
case kLogLevelVerbose:
114+
FIREBASE_CASE_FALLTHROUGH;
115+
case kLogLevelDebug:
116+
[FIRDatabase setLoggingEnabled:YES];
117+
break;
118+
case kLogLevelInfo:
119+
FIREBASE_CASE_FALLTHROUGH;
120+
case kLogLevelWarning:
121+
FIREBASE_CASE_FALLTHROUGH;
122+
case kLogLevelError:
123+
FIREBASE_CASE_FALLTHROUGH;
124+
case kLogLevelAssert:
125+
[FIRDatabase setLoggingEnabled:NO];
126+
break;
127+
}
128+
log_level_ = log_level;
129+
}
130+
131+
LogLevel DatabaseInternal::log_level() const {
132+
return log_level_;
109133
}
110134

111135
bool DatabaseInternal::RegisterValueListener(

0 commit comments

Comments
 (0)