1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/predictors/logged_in_predictor_table.h"
9 #include "base/logging.h"
10 #include "base/metrics/histogram.h"
11 #include "base/strings/stringprintf.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
14 #include "sql/statement.h"
16 using content::BrowserThread
;
22 const char kTableName
[] = "logged_in_predictor";
26 namespace predictors
{
28 LoggedInPredictorTable::LoggedInPredictorTable()
29 : PredictorTableBase() {
32 LoggedInPredictorTable::~LoggedInPredictorTable() {
36 string
LoggedInPredictorTable::GetKey(const GURL
& url
) {
37 return GetKeyFromDomain(url
.host());
41 string
LoggedInPredictorTable::GetKeyFromDomain(const std::string
& domain
) {
42 string
effective_domain(
43 net::registry_controlled_domains::GetDomainAndRegistry(
45 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES
));
46 if (effective_domain
.empty())
47 effective_domain
= domain
;
49 // Strip off a preceding ".", if present.
50 if (!effective_domain
.empty() && effective_domain
[0] == '.')
51 return effective_domain
.substr(1);
52 return effective_domain
;
55 void LoggedInPredictorTable::AddDomainFromURL(const GURL
& url
) {
56 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
57 if (CantAccessDatabase())
60 Statement
statement(DB()->GetCachedStatement(SQL_FROM_HERE
,
61 base::StringPrintf("INSERT OR IGNORE INTO %s (domain, time) VALUES (?,?)",
62 kTableName
).c_str()));
64 statement
.BindString(0, GetKey(url
));
65 statement
.BindInt64(1, base::Time::Now().ToInternalValue());
70 void LoggedInPredictorTable::DeleteDomainFromURL(const GURL
& url
) {
71 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
72 if (CantAccessDatabase())
75 Statement
statement(DB()->GetCachedStatement(SQL_FROM_HERE
,
76 base::StringPrintf("DELETE FROM %s WHERE domain=?", kTableName
).c_str()));
78 statement
.BindString(0, GetKey(url
));
83 void LoggedInPredictorTable::DeleteDomain(const std::string
& domain
) {
84 DeleteDomainFromURL(GURL("http://" + domain
));
87 void LoggedInPredictorTable::HasUserLoggedIn(const GURL
& url
, bool* is_present
,
88 bool* lookup_succeeded
) {
89 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
90 *lookup_succeeded
= false;
91 if (CantAccessDatabase())
94 Statement
statement(DB()->GetCachedStatement(SQL_FROM_HERE
,
95 base::StringPrintf("SELECT count(*) FROM %s WHERE domain=?",
96 kTableName
).c_str()));
98 statement
.BindString(0, GetKey(url
));
100 if (statement
.Step()) {
101 *is_present
= (statement
.ColumnInt(0) > 0);
102 *lookup_succeeded
= true;
106 void LoggedInPredictorTable::DeleteAllCreatedBetween(
107 const base::Time
& delete_begin
, const base::Time
& delete_end
) {
108 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
109 if (CantAccessDatabase())
112 Statement
statement(DB()->GetCachedStatement(SQL_FROM_HERE
,
113 base::StringPrintf("DELETE FROM %s WHERE time >= ? AND time <= ?",
114 kTableName
).c_str()));
116 statement
.BindInt64(0, delete_begin
.ToInternalValue());
117 statement
.BindInt64(1, delete_end
.ToInternalValue());
122 void LoggedInPredictorTable::GetAllData(
123 LoggedInPredictorTable::LoggedInStateMap
* state_map
) {
124 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
125 DCHECK(state_map
!= NULL
);
127 if (CantAccessDatabase())
130 Statement
statement(DB()->GetUniqueStatement(
131 base::StringPrintf("SELECT * FROM %s", kTableName
).c_str()));
133 while (statement
.Step()) {
134 string domain
= statement
.ColumnString(0);
135 int64 value
= statement
.ColumnInt64(1);
136 (*state_map
)[domain
] = value
;
140 void LoggedInPredictorTable::CreateTableIfNonExistent() {
141 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
142 if (CantAccessDatabase())
145 sql::Connection
* db
= DB();
146 if (db
->DoesTableExist(kTableName
))
149 const char* table_creator
=
150 "CREATE TABLE %s (domain TEXT, time INTEGER, PRIMARY KEY(domain))";
152 if (!db
->Execute(base::StringPrintf(table_creator
, kTableName
).c_str()))
156 void LoggedInPredictorTable::LogDatabaseStats() {
157 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB
));
158 if (CantAccessDatabase())
161 Statement
statement(DB()->GetCachedStatement(SQL_FROM_HERE
,
162 base::StringPrintf("SELECT count(*) FROM %s", kTableName
).c_str()));
163 if (statement
.Step())
164 UMA_HISTOGRAM_COUNTS("LoggedInPredictor.TableRowCount",
165 statement
.ColumnInt(0));
168 } // namespace predictors