| 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..1408bd2b9d8613ab61a2fbae136ff58bd7375a7e 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,8 +26,8 @@ WebDatabaseBackend::WebDatabaseBackend(
|
| request_manager_(new WebDataRequestManager()),
|
| init_status_(sql::INIT_FAILURE),
|
| init_complete_(false),
|
| - delegate_(delegate) {
|
| -}
|
| + catastrophic_error_occurred_(false),
|
| + delegate_(delegate) {}
|
|
|
| void WebDatabaseBackend::AddTable(std::unique_ptr<WebDatabaseTable> table) {
|
| DCHECK(!db_.get());
|
| @@ -35,7 +37,7 @@ void WebDatabaseBackend::AddTable(std::unique_ptr<WebDatabaseTable> table) {
|
| void WebDatabaseBackend::InitDatabase() {
|
| LoadDatabaseIfNecessary();
|
| if (delegate_) {
|
| - delegate_->DBLoaded(init_status_);
|
| + delegate_->DBLoaded(init_status_, diagnostics_);
|
| }
|
| }
|
|
|
| @@ -46,15 +48,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)));
|
| + 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);
|
| + diagnostics_ += sql::GetCorruptFileDiagnosticsInfo(db_path_);
|
| + db_.reset();
|
| return init_status_;
|
| }
|
|
|
| @@ -113,6 +118,15 @@ WebDatabaseBackend::~WebDatabaseBackend() {
|
| ShutdownDatabase();
|
| }
|
|
|
| +void WebDatabaseBackend::DatabaseErrorCallback(int error,
|
| + sql::Statement* statement) {
|
| + // We ignore any further error callbacks after the first catastrophic error.
|
| + if (!catastrophic_error_occurred_ && sql::IsErrorCatastrophic(error)) {
|
| + catastrophic_error_occurred_ = true;
|
| + diagnostics_ = db_->GetDiagnosticInfo(error, statement);
|
| + }
|
| +}
|
| +
|
| void WebDatabaseBackend::Commit() {
|
| DCHECK(db_);
|
| DCHECK_EQ(sql::INIT_OK, init_status_);
|
|
|