| Index: components/webdata/common/web_database_backend.cc
|
| diff --git a/components/webdata/common/web_database_backend.cc b/components/webdata/common/web_database_backend.cc
|
| index 7cb343e62f02e5a76ba03a4fff2f999a07a33491..509403552dfaf4cbbb5ea45ba2f11ca1c1a4d3fd 100644
|
| --- a/components/webdata/common/web_database_backend.cc
|
| +++ b/components/webdata/common/web_database_backend.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "components/webdata/common/web_database_backend.h"
|
|
|
| +#include <algorithm>
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| @@ -11,6 +12,7 @@
|
| #include "components/webdata/common/web_data_request_manager.h"
|
| #include "components/webdata/common/web_database.h"
|
| #include "components/webdata/common/web_database_table.h"
|
| +#include "sql/error_delegate_util.h"
|
|
|
| using base::Bind;
|
| using base::FilePath;
|
| @@ -24,6 +26,7 @@ WebDatabaseBackend::WebDatabaseBackend(
|
| request_manager_(new WebDataRequestManager()),
|
| init_status_(sql::INIT_FAILURE),
|
| init_complete_(false),
|
| + should_ignore_db_errors_(false),
|
| delegate_(delegate) {
|
| }
|
|
|
| @@ -35,7 +38,7 @@ void WebDatabaseBackend::AddTable(std::unique_ptr<WebDatabaseTable> table) {
|
| void WebDatabaseBackend::InitDatabase() {
|
| LoadDatabaseIfNecessary();
|
| if (delegate_) {
|
| - delegate_->DBLoaded(init_status_);
|
| + delegate_->DBLoaded(init_status_, db_diagnostics_);
|
| }
|
| }
|
|
|
| @@ -46,15 +49,18 @@ sql::InitStatus WebDatabaseBackend::LoadDatabaseIfNecessary() {
|
| init_complete_ = true;
|
| db_.reset(new WebDatabase());
|
|
|
| - for (ScopedVector<WebDatabaseTable>::iterator it = tables_.begin();
|
| - it != tables_.end(); ++it) {
|
| - db_->AddTable(*it);
|
| - }
|
| + for (const auto& table : tables_)
|
| + db_->AddTable(table);
|
|
|
| + // Unretained to avoid a ref loop since we own |db_|.
|
| + db_->set_error_callback(base::Bind(&WebDatabaseBackend::DatabaseErrorCallback,
|
| + base::Unretained(this)));
|
| + db_diagnostics_.clear();
|
| init_status_ = db_->Init(db_path_);
|
| if (init_status_ != sql::INIT_OK) {
|
| LOG(ERROR) << "Cannot initialize the web database: " << init_status_;
|
| - db_.reset(NULL);
|
| + sql::AppendCorruptFileInfoToDiagnostics(db_path_, &db_diagnostics_);
|
| + db_.reset();
|
| return init_status_;
|
| }
|
|
|
| @@ -113,6 +119,15 @@ WebDatabaseBackend::~WebDatabaseBackend() {
|
| ShutdownDatabase();
|
| }
|
|
|
| +void WebDatabaseBackend::DatabaseErrorCallback(int error,
|
| + sql::Statement* stmt) {
|
| + // We ignore any further error callbacks on the first catastrophic error.
|
| + if (!should_ignore_db_errors_ && sql::IsErrorCatastrophic(error)) {
|
| + should_ignore_db_errors_ = true;
|
| + db_diagnostics_ = db_->GetDiagnosticInfo(error, stmt);
|
| + }
|
| +}
|
| +
|
| void WebDatabaseBackend::Commit() {
|
| DCHECK(db_);
|
| DCHECK_EQ(sql::INIT_OK, init_status_);
|
|
|