| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/password_manager/core/browser/statistics_table.h" | 5 #include "components/password_manager/core/browser/statistics_table.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| 11 #include <set> | 11 #include <set> |
| 12 | 12 |
| 13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
| 14 #include "sql/connection.h" | 14 #include "sql/connection.h" |
| 15 #include "sql/statement.h" | 15 #include "sql/statement.h" |
| 16 | 16 |
| 17 namespace password_manager { | 17 namespace password_manager { |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 // Convenience enum for interacting with SQL queries that use all the columns. | 20 // Convenience enum for interacting with SQL queries that use all the columns. |
| 21 enum LoginTableColumns { | 21 enum LoginTableColumns { |
| 22 COLUMN_ORIGIN_DOMAIN = 0, | 22 COLUMN_ORIGIN_DOMAIN = 0, |
| 23 COLUMN_USERNAME, | 23 COLUMN_USERNAME, |
| 24 COLUMN_DISMISSALS, | 24 COLUMN_DISMISSALS, |
| 25 COLUMN_DATE, | 25 COLUMN_DATE, |
| 26 }; | 26 }; |
| 27 | 27 |
| 28 // Iterates through all rows of s constructing a stats vector. |
| 29 std::vector<InteractionsStats> StatementToInteractionsStats(sql::Statement* s) { |
| 30 std::vector<InteractionsStats> results; |
| 31 while (s->Step()) { |
| 32 results.push_back(InteractionsStats()); |
| 33 results.back().origin_domain = GURL(s->ColumnString(COLUMN_ORIGIN_DOMAIN)); |
| 34 results.back().username_value = s->ColumnString16(COLUMN_USERNAME); |
| 35 results.back().dismissal_count = s->ColumnInt(COLUMN_DISMISSALS); |
| 36 results.back().update_time = |
| 37 base::Time::FromInternalValue(s->ColumnInt64(COLUMN_DATE)); |
| 38 } |
| 39 |
| 40 return results; |
| 41 } |
| 42 |
| 28 } // namespace | 43 } // namespace |
| 29 | 44 |
| 30 InteractionsStats::InteractionsStats() = default; | 45 InteractionsStats::InteractionsStats() = default; |
| 31 | 46 |
| 32 bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs) { | 47 bool operator==(const InteractionsStats& lhs, const InteractionsStats& rhs) { |
| 33 return lhs.origin_domain == rhs.origin_domain && | 48 return lhs.origin_domain == rhs.origin_domain && |
| 34 lhs.username_value == rhs.username_value && | 49 lhs.username_value == rhs.username_value && |
| 35 lhs.dismissal_count == rhs.dismissal_count && | 50 lhs.dismissal_count == rhs.dismissal_count && |
| 36 lhs.update_time == rhs.update_time; | 51 lhs.update_time == rhs.update_time; |
| 37 } | 52 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 bool StatisticsTable::RemoveRow(const GURL& domain) { | 114 bool StatisticsTable::RemoveRow(const GURL& domain) { |
| 100 if (!domain.is_valid()) | 115 if (!domain.is_valid()) |
| 101 return false; | 116 return false; |
| 102 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, | 117 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, |
| 103 "DELETE FROM stats WHERE " | 118 "DELETE FROM stats WHERE " |
| 104 "origin_domain = ? ")); | 119 "origin_domain = ? ")); |
| 105 s.BindString(0, domain.spec()); | 120 s.BindString(0, domain.spec()); |
| 106 return s.Run(); | 121 return s.Run(); |
| 107 } | 122 } |
| 108 | 123 |
| 124 std::vector<InteractionsStats> StatisticsTable::GetAllRows() { |
| 125 static constexpr char query[] = |
| 126 "SELECT origin_domain, username_value, " |
| 127 "dismissal_count, update_time FROM stats"; |
| 128 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query)); |
| 129 return StatementToInteractionsStats(&s); |
| 130 } |
| 131 |
| 109 std::vector<InteractionsStats> StatisticsTable::GetRows(const GURL& domain) { | 132 std::vector<InteractionsStats> StatisticsTable::GetRows(const GURL& domain) { |
| 110 if (!domain.is_valid()) | 133 if (!domain.is_valid()) |
| 111 return std::vector<InteractionsStats>(); | 134 return std::vector<InteractionsStats>(); |
| 112 const char query[] = | 135 const char query[] = |
| 113 "SELECT origin_domain, username_value, " | 136 "SELECT origin_domain, username_value, " |
| 114 "dismissal_count, update_time FROM stats WHERE origin_domain == ?"; | 137 "dismissal_count, update_time FROM stats WHERE origin_domain == ?"; |
| 115 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query)); | 138 sql::Statement s(db_->GetCachedStatement(SQL_FROM_HERE, query)); |
| 116 s.BindString(0, domain.spec()); | 139 s.BindString(0, domain.spec()); |
| 117 std::vector<InteractionsStats> result; | 140 return StatementToInteractionsStats(&s); |
| 118 while (s.Step()) { | |
| 119 result.push_back(InteractionsStats()); | |
| 120 result.back().origin_domain = GURL(s.ColumnString(COLUMN_ORIGIN_DOMAIN)); | |
| 121 result.back().username_value = s.ColumnString16(COLUMN_USERNAME); | |
| 122 result.back().dismissal_count = s.ColumnInt(COLUMN_DISMISSALS); | |
| 123 result.back().update_time = | |
| 124 base::Time::FromInternalValue(s.ColumnInt64(COLUMN_DATE)); | |
| 125 } | |
| 126 return result; | |
| 127 } | 141 } |
| 128 | 142 |
| 129 bool StatisticsTable::RemoveStatsByOriginAndTime( | 143 bool StatisticsTable::RemoveStatsByOriginAndTime( |
| 130 const base::Callback<bool(const GURL&)>& origin_filter, | 144 const base::Callback<bool(const GURL&)>& origin_filter, |
| 131 base::Time delete_begin, | 145 base::Time delete_begin, |
| 132 base::Time delete_end) { | 146 base::Time delete_end) { |
| 133 if (delete_end.is_null()) | 147 if (delete_end.is_null()) |
| 134 delete_end = base::Time::Max(); | 148 delete_end = base::Time::Max(); |
| 135 | 149 |
| 136 // All origins. | 150 // All origins. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 origin_delete_statement.BindString(0, origin); | 184 origin_delete_statement.BindString(0, origin); |
| 171 origin_delete_statement.BindInt64(1, delete_begin.ToInternalValue()); | 185 origin_delete_statement.BindInt64(1, delete_begin.ToInternalValue()); |
| 172 origin_delete_statement.BindInt64(2, delete_end.ToInternalValue()); | 186 origin_delete_statement.BindInt64(2, delete_end.ToInternalValue()); |
| 173 success = success && origin_delete_statement.Run(); | 187 success = success && origin_delete_statement.Run(); |
| 174 } | 188 } |
| 175 | 189 |
| 176 return success; | 190 return success; |
| 177 } | 191 } |
| 178 | 192 |
| 179 } // namespace password_manager | 193 } // namespace password_manager |
| OLD | NEW |