Chromium Code Reviews| Index: components/password_manager/core/browser/statistics_table.cc |
| diff --git a/components/password_manager/core/browser/statistics_table.cc b/components/password_manager/core/browser/statistics_table.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..acf30a6d0fe13bdf25d966b9507f271f47465a09 |
| --- /dev/null |
| +++ b/components/password_manager/core/browser/statistics_table.cc |
| @@ -0,0 +1,83 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/password_manager/core/browser/statistics_table.h" |
| + |
| +#include "sql/connection.h" |
| +#include "sql/statement.h" |
| + |
| +namespace password_manager { |
| +namespace { |
|
vabr (Chromium)
2015/04/24 17:36:53
nit: Please add a blank line after the current lin
vasilii
2015/04/24 18:40:48
Done.
|
| +// Convenience enum for interacting with SQL queries that use all the columns. |
| +enum LoginTableColumns { |
| + COLUMN_ORIGIN_DOMAIN = 0, |
| + COLUMN_NOPES, |
| + COLUMN_DISMISSALS, |
| + COLUMN_DATE, |
| +}; |
| +} // namespace |
| + |
| +StatisticsTable::StatisticsTable() : db_(nullptr) { |
| +} |
| + |
| +StatisticsTable::~StatisticsTable() { |
| +} |
| + |
| +bool StatisticsTable::Init(sql::Connection* db) { |
| + db_ = db; |
| + if (!db_->DoesTableExist("stats")) { |
| + const char query[] = |
| + "CREATE TABLE stats (" |
| + "origin_domain VARCHAR NOT NULL PRIMARY KEY, " |
| + "nopes_count INTEGER, " |
| + "dismissal_count INTEGER, " |
| + "start_date INTEGER NOT NULL)"; |
| + if (!db_->Execute(query)) { |
| + NOTREACHED(); |
|
vabr (Chromium)
2015/04/24 17:36:53
Why is this a NOTREACHED? A NOTREACHED should sign
vasilii
2015/04/24 18:40:48
Done.
|
| + return false; |
| + } |
| + } |
| + return true; |
| +} |
| + |
| +bool StatisticsTable::AddRow(const InteractionsStats& stats) { |
| + sql::Statement s(db_->GetCachedStatement( |
| + SQL_FROM_HERE, |
| + "INSERT OR REPLACE INTO stats " |
| + "(origin_domain, nopes_count, dismissal_count, start_date) " |
| + "VALUES (?, ?, ?, ?)")); |
| + s.BindString(COLUMN_ORIGIN_DOMAIN, stats.origin_domain.spec()); |
| + s.BindInt(COLUMN_NOPES, stats.nopes_count); |
| + s.BindInt(COLUMN_DISMISSALS, stats.dismissal_count); |
| + s.BindInt64(COLUMN_DATE, stats.start_date.ToInternalValue()); |
| + return s.Run(); |
| +} |
| + |
| +bool StatisticsTable::RemoveRow(const GURL& domain) { |
| + sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, |
| + "DELETE FROM stats WHERE " |
| + "origin_domain = ? ")); |
| + s.BindString(0, domain.spec()); |
| + return s.Run(); |
| +} |
| + |
| +scoped_ptr<InteractionsStats> StatisticsTable::GetRow(const GURL& domain) { |
| + const char query[] = |
| + "SELECT origin_domain, nopes_count, " |
| + "dismissal_count, start_date FROM stats WHERE origin_domain == ?"; |
| + sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query)); |
| + s.BindString(0, domain.spec()); |
| + if (s.Step()) { |
| + scoped_ptr<InteractionsStats> stats(new InteractionsStats); |
| + stats->origin_domain = GURL(s.ColumnString(COLUMN_ORIGIN_DOMAIN)); |
| + stats->nopes_count = s.ColumnInt(COLUMN_NOPES); |
| + stats->dismissal_count = s.ColumnInt(COLUMN_DISMISSALS); |
| + stats->start_date = |
| + base::Time::FromInternalValue(s.ColumnInt64(COLUMN_DATE)); |
| + return stats.Pass(); |
| + } |
| + return scoped_ptr<InteractionsStats>(); |
| +} |
| + |
| +} // namespace password_manager |