Index: components/history/core/browser/history_backend.cc |
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc |
index 4ca3a34a6b09f9fc88bc24bf17be752a1d70a8b6..08a9706789d47820a369d0ba7844747ab8d8ca18 100644 |
--- a/components/history/core/browser/history_backend.cc |
+++ b/components/history/core/browser/history_backend.cc |
@@ -22,6 +22,7 @@ |
#include "base/sequenced_task_runner.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/string_util.h" |
+#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
@@ -68,12 +69,14 @@ using base::TimeTicks; |
namespace history { |
namespace { |
+ |
void RunUnlessCanceled( |
const base::Closure& closure, |
const base::CancelableTaskTracker::IsCanceledCallback& is_canceled) { |
if (!is_canceled.Run()) |
closure.Run(); |
} |
+ |
} // namespace |
// How long we'll wait to do a commit, so that things are batched together. |
@@ -648,7 +651,6 @@ void HistoryBackend::InitImpl( |
history_database_params.download_interrupt_reason_none, |
history_database_params.download_interrupt_reason_crash)); |
- // Unretained to avoid a ref loop with db_. |
db_->set_error_callback(base::Bind(&HistoryBackend::DatabaseErrorCallback, |
base::Unretained(this))); |
@@ -656,10 +658,6 @@ void HistoryBackend::InitImpl( |
switch (status) { |
case sql::INIT_OK: |
break; |
- case sql::INIT_TOO_NEW: |
- delegate_->NotifyProfileError(status); |
- db_.reset(); |
- return; |
case sql::INIT_FAILURE: { |
// A null db_ will cause all calls on this object to notice this error |
// and to not continue. If the error callback scheduled killing the |
@@ -669,7 +667,14 @@ void HistoryBackend::InitImpl( |
if (kill_db) |
KillHistoryDatabase(); |
UMA_HISTOGRAM_BOOLEAN("History.AttemptedToFixProfileError", kill_db); |
- delegate_->NotifyProfileError(status); |
+ } // Falls through. |
+ case sql::INIT_TOO_NEW: { |
+ const std::string corrupted_file_name = |
+ history_name.DirName().BaseName().AsUTF8Unsafe() + "/" + |
+ history_name.BaseName().AsUTF8Unsafe(); |
+ base::StringAppendF(&db_diagnostics_, "Corrupted file: %s\n", |
+ corrupted_file_name.c_str()); |
+ delegate_->NotifyProfileError(status, db_diagnostics_); |
db_.reset(); |
return; |
} |
@@ -2410,6 +2415,9 @@ void HistoryBackend::URLsNoLongerBookmarked(const std::set<GURL>& urls) { |
void HistoryBackend::DatabaseErrorCallback(int error, sql::Statement* stmt) { |
if (!scheduled_kill_db_ && sql::IsErrorCatastrophic(error)) { |
scheduled_kill_db_ = true; |
+ |
+ db_diagnostics_ = db_->GetDiagnosticInfo(error, stmt); |
+ |
// Don't just do the close/delete here, as we are being called by |db| and |
// that seems dangerous. |
// TODO(shess): Consider changing KillHistoryDatabase() to use |