Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: chrome/browser/predictors/logged_in_predictor_table.cc

Issue 14065014: Add the LoggedIn Predictor, to detect which websites a user is likely (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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.
4
5 #include "chrome/browser/predictors/logged_in_predictor_table.h"
6
7 #include <algorithm>
8 #include <utility>
9 #include "base/logging.h"
10 #include "base/metrics/histogram.h"
11 #include "base/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"
15
16 using content::BrowserThread;
17 using sql::Statement;
18 using std::string;
19
20 namespace {
21
22 const char kTableName[] = "logged_in_predictor";
23
24 } // namespace
25
26 namespace predictors {
27
28 LoggedInPredictorTable::LoggedInPredictorTable()
29 : PredictorTableBase() {
30 }
31
32 LoggedInPredictorTable::~LoggedInPredictorTable() {
33 }
34
35 string LoggedInPredictorTable::GetKey(const GURL& url) const {
36 string effective_domain(
37 net::RegistryControlledDomainService::GetDomainAndRegistry(url.host()));
38 if (effective_domain.empty())
39 effective_domain = url.host();
40
41 // Strip off a preceding ".", if present.
42 if (!effective_domain.empty() && effective_domain[0] == '.')
43 return effective_domain.substr(1);
44 return effective_domain;
45 }
46
47 void LoggedInPredictorTable::Add(const GURL& url) {
48 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
49 if (CantAccessDatabase())
50 return;
51
52 Statement statement(DB()->GetCachedStatement(SQL_FROM_HERE,
53 base::StringPrintf("INSERT OR IGNORE INTO %s (domain, time) VALUES (?,?)",
54 kTableName).c_str()));
55
56 statement.BindString(0, GetKey(url));
57 statement.BindInt64(1, base::Time::Now().ToInternalValue());
58
59 statement.Run();
60 }
61
62 void LoggedInPredictorTable::HasUserLoggedIn(const GURL& url, bool* is_present,
63 bool* lookup_succeeded) {
64 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
65 *lookup_succeeded = false;
66 if (CantAccessDatabase())
67 return;
68
69 Statement statement(DB()->GetCachedStatement(SQL_FROM_HERE,
70 base::StringPrintf("SELECT count(*) FROM %s WHERE domain=?",
71 kTableName).c_str()));
72
73 statement.BindString(0, GetKey(url));
74
75 if (statement.Step()) {
76 *is_present = (statement.ColumnInt(0) > 0);
77 *lookup_succeeded = true;
78 }
79 }
80
81 void LoggedInPredictorTable::DeleteAllCreatedBetween(
82 const base::Time& delete_begin, const base::Time& delete_end) {
83 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
84 if (CantAccessDatabase())
85 return;
86
87 Statement statement(DB()->GetCachedStatement(SQL_FROM_HERE,
88 base::StringPrintf("DELETE FROM %s WHERE time >= ? AND time <= ?",
89 kTableName).c_str()));
90
91 statement.BindInt64(0, delete_begin.ToInternalValue());
92 statement.BindInt64(1, delete_end.ToInternalValue());
93
94 statement.Run();
95 }
96
97 void LoggedInPredictorTable::CreateTableIfNonExistent() {
98 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
99 if (CantAccessDatabase())
100 return;
101
102 sql::Connection* db = DB();
103 if (db->DoesTableExist(kTableName))
104 return;
105
106 const char* table_creator =
107 "CREATE TABLE %s (domain TEXT, time INTEGER, PRIMARY KEY(domain))";
108
109 if (!db->Execute(base::StringPrintf(table_creator, kTableName).c_str()))
110 ResetDB();
111 }
112
113 void LoggedInPredictorTable::LogDatabaseStats() {
114 CHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
115 if (CantAccessDatabase())
116 return;
117
118 Statement statement(DB()->GetCachedStatement(SQL_FROM_HERE,
119 base::StringPrintf("SELECT count(*) FROM %s", kTableName).c_str()));
120 if (statement.Step())
121 UMA_HISTOGRAM_COUNTS("LoggedInPredictor.TableRowCount",
122 statement.ColumnInt(0));
123 }
124
125 } // namespace predictors
OLDNEW
« no previous file with comments | « chrome/browser/predictors/logged_in_predictor_table.h ('k') | chrome/browser/predictors/predictor_database.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698