Index: chrome/browser/diagnostics/sqlite_diagnostics.cc |
=================================================================== |
--- chrome/browser/diagnostics/sqlite_diagnostics.cc (revision 28908) |
+++ chrome/browser/diagnostics/sqlite_diagnostics.cc (working copy) |
@@ -4,3 +4,69 @@ |
#include "chrome/browser/diagnostics/sqlite_diagnostics.h" |
+#include "app/sql/connection.h" |
+#include "base/histogram.h" |
+#include "base/logging.h" |
+#include "base/singleton.h" |
+ |
+namespace { |
+ |
+const char* kHistogramNames[] = { |
+ "Sqlite.Cookie.Error", |
+ "Sqlite.History.Error", |
+ "Sqlite.Thumbnail.Error", |
+ "Sqlite.Text.Error", |
+ "Sqlite.Web.Error" |
jar (doing other things)
2009/10/15 06:44:28
Not a big deal... but... Given these will be sorte
|
+}; |
+ |
+// This class handles the exceptional sqlite errors that we might encounter |
+// if for example the db is corrupted. Right now we just generate a UMA |
+// histogram for release and an assert for debug builds. |
+// |
+// Why is it a template you ask? well, that is a funny story. The histograms |
+// need to be singletons that is why they are always static at the function |
+// scope, but we cannot use the Singleton class because they are not default |
+// constructible. The template parameter makes the compiler to create unique |
+// classes that don't share the same static variable. |
+template <size_t unique> |
+class BasicSqliteErrrorHandler : public sql::ErrorDelegate { |
+ public: |
+ |
+ virtual int OnError(int error, sql::Connection* connection, |
+ sql::Statement* stmt) { |
+ NOTREACHED() << "sqlite error " << error; |
+ RecordErrorInHistogram(error); |
+ return error; |
+ } |
+ |
+ private: |
+ static void RecordErrorInHistogram(int error) { |
+ // The histogram values from sqlite result codes go currently from 1 to |
+ // 26 currently but 50 gives them room to grow. |
+ static LinearHistogram histogram(kHistogramNames[unique], 1, 50, 51); |
+ histogram.SetFlags(kUmaTargetedHistogramFlag); |
+ histogram.Add(error); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+sql::ErrorDelegate* GetErrorHandlerForCookieDb() { |
+ return new BasicSqliteErrrorHandler<0>(); |
+} |
+ |
+sql::ErrorDelegate* GetErrorHandlerForHistoryDb() { |
+ return new BasicSqliteErrrorHandler<1>(); |
+} |
+ |
+sql::ErrorDelegate* GetErrorHandlerForThumbnailDb() { |
+ return new BasicSqliteErrrorHandler<2>(); |
+} |
+ |
+sql::ErrorDelegate* GetErrorHandlerForTextDb() { |
+ return new BasicSqliteErrrorHandler<3>(); |
+} |
+ |
+sql::ErrorDelegate* GetErrorHandlerForWebDb() { |
+ return new BasicSqliteErrrorHandler<4>(); |
+} |