| Index: chrome/browser/diagnostics/sqlite_diagnostics.cc
|
| diff --git a/chrome/browser/diagnostics/sqlite_diagnostics.cc b/chrome/browser/diagnostics/sqlite_diagnostics.cc
|
| index 81753a87f793d706d43d297f2ce402974e9c400a..2cd1ca14aafdb8fb003e0cf77c76b186bd73c002 100644
|
| --- a/chrome/browser/diagnostics/sqlite_diagnostics.cc
|
| +++ b/chrome/browser/diagnostics/sqlite_diagnostics.cc
|
| @@ -47,12 +47,45 @@ namespace {
|
| // Generic diagnostic test class for checking SQLite database integrity.
|
| class SqliteIntegrityTest : public DiagnosticsTest {
|
| public:
|
| + // These are bit flags, so each value should be a power of two.
|
| + enum Flags {
|
| + NO_FLAGS_SET = 0,
|
| + CRITICAL = 0x01,
|
| + REMOVE_IF_CORRUPT = 0x02,
|
| + };
|
|
|
| - SqliteIntegrityTest(bool critical,
|
| + SqliteIntegrityTest(uint32 flags,
|
| const std::string& id,
|
| const std::string& title,
|
| const base::FilePath& db_path)
|
| - : DiagnosticsTest(id, title), critical_(critical), db_path_(db_path) {}
|
| + : DiagnosticsTest(id, title),
|
| + flags_(flags),
|
| + db_path_(db_path) {}
|
| +
|
| + virtual bool RecoveryImpl(DiagnosticsModel::Observer* observer) OVERRIDE {
|
| + int outcome_code = GetOutcomeCode();
|
| + if (flags_ & REMOVE_IF_CORRUPT) {
|
| + switch (outcome_code) {
|
| + case DIAG_SQLITE_ERROR_HANDLER_CALLED:
|
| + case DIAG_SQLITE_CANNOT_OPEN_DB:
|
| + case DIAG_SQLITE_DB_LOCKED:
|
| + case DIAG_SQLITE_PRAGMA_FAILED:
|
| + case DIAG_SQLITE_DB_CORRUPTED:
|
| + LOG(WARNING) << "Removing broken SQLite database: "
|
| + << db_path_.value();
|
| + base::DeleteFile(db_path_, false);
|
| + break;
|
| + case DIAG_SQLITE_SUCCESS:
|
| + case DIAG_SQLITE_FILE_NOT_FOUND_OK:
|
| + case DIAG_SQLITE_FILE_NOT_FOUND:
|
| + break;
|
| + default:
|
| + DCHECK(false) << "Invalid outcome code: " << outcome_code;
|
| + break;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
|
|
| virtual bool ExecuteImpl(DiagnosticsModel::Observer* observer) OVERRIDE {
|
| // If we're given an absolute path, use it. If not, then assume it's under
|
| @@ -64,7 +97,7 @@ class SqliteIntegrityTest : public DiagnosticsTest {
|
| path = db_path_;
|
|
|
| if (!base::PathExists(path)) {
|
| - if (critical_) {
|
| + if (flags_ & CRITICAL) {
|
| RecordOutcome(DIAG_SQLITE_FILE_NOT_FOUND,
|
| "File not found",
|
| DiagnosticsModel::TEST_FAIL_CONTINUE);
|
| @@ -178,7 +211,7 @@ class SqliteIntegrityTest : public DiagnosticsTest {
|
| DISALLOW_COPY_AND_ASSIGN(ErrorRecorder);
|
| };
|
|
|
| - bool critical_;
|
| + uint32 flags_;
|
| base::FilePath db_path_;
|
| DISALLOW_COPY_AND_ASSIGN(SqliteIntegrityTest);
|
| };
|
| @@ -186,21 +219,21 @@ class SqliteIntegrityTest : public DiagnosticsTest {
|
| } // namespace
|
|
|
| DiagnosticsTest* MakeSqliteWebDbTest() {
|
| - return new SqliteIntegrityTest(true,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::CRITICAL,
|
| kSQLiteIntegrityWebTest,
|
| "Web Database",
|
| base::FilePath(kWebDataFilename));
|
| }
|
|
|
| DiagnosticsTest* MakeSqliteCookiesDbTest() {
|
| - return new SqliteIntegrityTest(true,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::CRITICAL,
|
| kSQLiteIntegrityCookieTest,
|
| "Cookies Database",
|
| base::FilePath(chrome::kCookieFilename));
|
| }
|
|
|
| DiagnosticsTest* MakeSqliteHistoryDbTest() {
|
| - return new SqliteIntegrityTest(true,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::CRITICAL,
|
| kSQLiteIntegrityHistoryTest,
|
| "History Database",
|
| base::FilePath(chrome::kHistoryFilename));
|
| @@ -208,14 +241,14 @@ DiagnosticsTest* MakeSqliteHistoryDbTest() {
|
|
|
| DiagnosticsTest* MakeSqliteArchivedHistoryDbTest() {
|
| return new SqliteIntegrityTest(
|
| - false,
|
| + SqliteIntegrityTest::NO_FLAGS_SET,
|
| kSQLiteIntegrityArchivedHistoryTest,
|
| "Archived History Database",
|
| base::FilePath(chrome::kArchivedHistoryFilename));
|
| }
|
|
|
| DiagnosticsTest* MakeSqliteThumbnailsDbTest() {
|
| - return new SqliteIntegrityTest(false,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::NO_FLAGS_SET,
|
| kSQLiteIntegrityThumbnailsTest,
|
| "Thumbnails Database",
|
| base::FilePath(chrome::kThumbnailsFilename));
|
| @@ -225,7 +258,7 @@ DiagnosticsTest* MakeSqliteAppCacheDbTest() {
|
| base::FilePath appcache_dir(content::kAppCacheDirname);
|
| base::FilePath appcache_db =
|
| appcache_dir.Append(appcache::kAppCacheDatabaseName);
|
| - return new SqliteIntegrityTest(false,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::NO_FLAGS_SET,
|
| kSQLiteIntegrityAppCacheTest,
|
| "Application Cache Database",
|
| appcache_db);
|
| @@ -235,7 +268,7 @@ DiagnosticsTest* MakeSqliteWebDatabaseTrackerDbTest() {
|
| base::FilePath databases_dir(webkit_database::kDatabaseDirectoryName);
|
| base::FilePath tracker_db =
|
| databases_dir.Append(webkit_database::kTrackerDatabaseFileName);
|
| - return new SqliteIntegrityTest(false,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::NO_FLAGS_SET,
|
| kSQLiteIntegrityDatabaseTrackerTest,
|
| "Database Tracker Database",
|
| tracker_db);
|
| @@ -244,7 +277,7 @@ DiagnosticsTest* MakeSqliteWebDatabaseTrackerDbTest() {
|
| #if defined(OS_CHROMEOS)
|
| DiagnosticsTest* MakeSqliteNssCertDbTest() {
|
| base::FilePath home_dir = file_util::GetHomeDir();
|
| - return new SqliteIntegrityTest(false,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::REMOVE_IF_CORRUPT,
|
| kSQLiteIntegrityNSSCertTest,
|
| "NSS Certificate Database",
|
| home_dir.Append(chromeos::kNssCertDbPath));
|
| @@ -252,7 +285,7 @@ DiagnosticsTest* MakeSqliteNssCertDbTest() {
|
|
|
| DiagnosticsTest* MakeSqliteNssKeyDbTest() {
|
| base::FilePath home_dir = file_util::GetHomeDir();
|
| - return new SqliteIntegrityTest(false,
|
| + return new SqliteIntegrityTest(SqliteIntegrityTest::REMOVE_IF_CORRUPT,
|
| kSQLiteIntegrityNSSKeyTest,
|
| "NSS Key Database",
|
| home_dir.Append(chromeos::kNssKeyDbPath));
|
|
|