summaryrefslogtreecommitdiffstats
path: root/chrome/browser/diagnostics/sqlite_diagnostics.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/diagnostics/sqlite_diagnostics.cc')
-rw-r--r--chrome/browser/diagnostics/sqlite_diagnostics.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/chrome/browser/diagnostics/sqlite_diagnostics.cc b/chrome/browser/diagnostics/sqlite_diagnostics.cc
index fbefc33..e0eeab3 100644
--- a/chrome/browser/diagnostics/sqlite_diagnostics.cc
+++ b/chrome/browser/diagnostics/sqlite_diagnostics.cc
@@ -5,9 +5,16 @@
#include "chrome/browser/diagnostics/sqlite_diagnostics.h"
#include "app/sql/connection.h"
+#include "app/sql/init_status.h"
+#include "app/sql/statement.h"
+#include "base/file_util.h"
#include "base/histogram.h"
#include "base/logging.h"
+#include "base/path_service.h"
#include "base/singleton.h"
+#include "base/string_util.h"
+#include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_paths.h"
namespace {
@@ -47,6 +54,74 @@ class BasicSqliteErrrorHandler : public sql::ErrorDelegate {
}
};
+struct DbTestInfo {
+ const char* test_name;
+ const FilePath::CharType* db_name;
+};
+
+static const DbTestInfo kTestInfo[] = {
+ {"Web Database", chrome::kWebDataFilename},
+ {"Cookies Database", chrome::kCookieFilename},
+ {"History Database", chrome::kHistoryFilename},
+ {"Archived history Database", chrome::kArchivedHistoryFilename},
+ {"Thumbnails Database", chrome::kThumbnailsFilename}
+};
+
+// Generic diagnostic test class for checking sqlite db integrity.
+class SqliteIntegrityTest : public DiagnosticTest {
+ public:
+ explicit SqliteIntegrityTest(int index)
+ : DiagnosticTest(ASCIIToUTF16(kTestInfo[index].test_name)),
+ index_(index) {
+ }
+
+ virtual int GetId() { return 0; }
+
+ virtual bool ExecuteImpl(DiagnosticsModel::Observer* observer) {
+ FilePath path;
+ PathService::Get(chrome::DIR_USER_DATA, &path);
+ path = path.Append(FilePath::FromWStringHack(chrome::kNotSignedInProfile));
+ path = path.Append(kTestInfo[index_].db_name);
+ if (!file_util::PathExists(path)) {
+ RecordFailure(ASCIIToUTF16("File not found"));
+ return true;
+ }
+
+ int errors = 0;
+ { // This block scopes the lifetime of the db objects.
+ sql::Connection db;
+ db.set_exclusive_locking();
+ if (!db.Open(path)) {
+ RecordFailure(ASCIIToUTF16("Cannot open db. Possibly corrupted"));
+ return true;
+ }
+ sql::Statement s(db.GetUniqueStatement("PRAGMA integrity_check;"));
+ if (!s) {
+ RecordFailure(ASCIIToUTF16("Statement failed"));
+ return false;
+ }
+ while (s.Step()) {
+ std::string result(s.ColumnString(0));
+ if ("ok" != result)
+ ++errors;
+ }
+ }
+ // All done. Report to the user.
+ if (errors != 0) {
+ string16 str(ASCIIToUTF16("Database corruption detected :"));
+ str += IntToString16(errors) + ASCIIToUTF16(" errors");
+ RecordFailure(str);
+ return true;
+ }
+ RecordSuccess(ASCIIToUTF16("no corruption detected"));
+ return true;
+ }
+
+ private:
+ int index_;
+ DISALLOW_COPY_AND_ASSIGN(SqliteIntegrityTest);
+};
+
} // namespace
sql::ErrorDelegate* GetErrorHandlerForCookieDb() {
@@ -68,3 +143,24 @@ sql::ErrorDelegate* GetErrorHandlerForTextDb() {
sql::ErrorDelegate* GetErrorHandlerForWebDb() {
return new BasicSqliteErrrorHandler<4>();
}
+
+DiagnosticTest* MakeSqliteWebDbTest() {
+ return new SqliteIntegrityTest(0);
+}
+
+DiagnosticTest* MakeSqliteCookiesDbTest() {
+ return new SqliteIntegrityTest(1);
+}
+
+DiagnosticTest* MakeSqliteHistoryDbTest() {
+ return new SqliteIntegrityTest(2);
+}
+
+DiagnosticTest* MakeSqliteArchivedHistoryDbTest() {
+ return new SqliteIntegrityTest(3);
+}
+
+DiagnosticTest* MakeSqliteThumbnailsDbTest() {
+ return new SqliteIntegrityTest(4);
+}
+