OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/history/in_memory_history_backend.h" | 5 #include "chrome/browser/history/in_memory_history_backend.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/time.h" | 11 #include "base/time.h" |
12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
14 #include "chrome/browser/history/history_notifications.h" | 14 #include "chrome/browser/history/history_notifications.h" |
15 #include "chrome/browser/history/in_memory_database.h" | 15 #include "chrome/browser/history/in_memory_database.h" |
16 #include "chrome/browser/history/in_memory_url_index.h" | |
17 #include "chrome/browser/history/url_database.h" | 16 #include "chrome/browser/history/url_database.h" |
18 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
19 #include "chrome/common/chrome_notification_types.h" | 18 #include "chrome/common/chrome_notification_types.h" |
20 #include "chrome/common/chrome_switches.h" | |
21 #include "content/common/notification_details.h" | 19 #include "content/common/notification_details.h" |
22 #include "content/common/notification_source.h" | 20 #include "content/common/notification_source.h" |
23 | 21 |
24 namespace history { | 22 namespace history { |
25 | 23 |
26 InMemoryHistoryBackend::InMemoryHistoryBackend() | 24 InMemoryHistoryBackend::InMemoryHistoryBackend() |
27 : profile_(NULL) { | 25 : profile_(NULL) { |
28 } | 26 } |
29 | 27 |
30 InMemoryHistoryBackend::~InMemoryHistoryBackend() { | 28 InMemoryHistoryBackend::~InMemoryHistoryBackend() {} |
31 if (index_.get()) | |
32 index_->ShutDown(); | |
33 } | |
34 | 29 |
35 bool InMemoryHistoryBackend::Init(const FilePath& history_filename, | 30 bool InMemoryHistoryBackend::Init(const FilePath& history_filename, |
36 const FilePath& history_dir, | 31 const FilePath& history_dir, |
37 URLDatabase* db, | 32 URLDatabase* db, |
38 const std::string& languages) { | 33 const std::string& languages) { |
39 db_.reset(new InMemoryDatabase); | 34 db_.reset(new InMemoryDatabase); |
40 bool success = db_->InitFromDisk(history_filename); | 35 return db_->InitFromDisk(history_filename); |
41 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
42 switches::kDisableHistoryQuickProvider)) { | |
43 index_.reset(new InMemoryURLIndex(history_dir)); | |
44 index_->Init(db, languages); | |
45 } | |
46 return success; | |
47 } | 36 } |
48 | 37 |
49 void InMemoryHistoryBackend::AttachToHistoryService(Profile* profile) { | 38 void InMemoryHistoryBackend::AttachToHistoryService(Profile* profile) { |
50 if (!db_.get()) { | 39 if (!db_.get()) { |
51 NOTREACHED(); | 40 NOTREACHED(); |
52 return; | 41 return; |
53 } | 42 } |
54 | 43 |
55 profile_ = profile; | 44 profile_ = profile; |
56 | 45 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 // IDs in the main database. This sucks. Instead of Add and Remove, we should | 111 // IDs in the main database. This sucks. Instead of Add and Remove, we should |
123 // have Sync(), which would take the ID if it's given and add it. | 112 // have Sync(), which would take the ID if it's given and add it. |
124 std::vector<history::URLRow>::const_iterator i; | 113 std::vector<history::URLRow>::const_iterator i; |
125 for (i = details.changed_urls.begin(); | 114 for (i = details.changed_urls.begin(); |
126 i != details.changed_urls.end(); i++) { | 115 i != details.changed_urls.end(); i++) { |
127 URLID id = db_->GetRowForURL(i->url(), NULL); | 116 URLID id = db_->GetRowForURL(i->url(), NULL); |
128 if (id) | 117 if (id) |
129 db_->UpdateURLRow(id, *i); | 118 db_->UpdateURLRow(id, *i); |
130 else | 119 else |
131 id = db_->AddURL(*i); | 120 id = db_->AddURL(*i); |
132 if (index_.get()) | |
133 index_->UpdateURL(id, *i); | |
134 } | 121 } |
135 } | 122 } |
136 | 123 |
137 void InMemoryHistoryBackend::OnURLsDeleted(const URLsDeletedDetails& details) { | 124 void InMemoryHistoryBackend::OnURLsDeleted(const URLsDeletedDetails& details) { |
138 DCHECK(db_.get()); | |
139 | |
140 if (details.all_history) { | 125 if (details.all_history) { |
141 // When all history is deleted, the individual URLs won't be listed. Just | 126 // When all history is deleted, the individual URLs won't be listed. Just |
142 // create a new database to quickly clear everything out. | 127 // create a new database to quickly clear everything out. |
143 db_.reset(new InMemoryDatabase); | 128 db_.reset(new InMemoryDatabase); |
144 if (!db_->InitFromScratch()) | 129 if (!db_->InitFromScratch()) |
145 db_.reset(); | 130 db_.reset(); |
146 if (index_.get()) | |
147 index_->ReloadFromHistory(db_.get(), true); | |
148 return; | 131 return; |
149 } | 132 } |
150 | 133 |
151 // Delete all matching URLs in our database. | 134 // Delete all matching URLs in our database. |
152 for (std::set<GURL>::const_iterator i = details.urls.begin(); | 135 for (std::vector<URLRow>::const_iterator row = details.rows.begin(); |
153 i != details.urls.end(); ++i) { | 136 row != details.rows.end(); ++row) { |
154 URLID id = db_->GetRowForURL(*i, NULL); | 137 // We typically won't have most of them since we only have a subset of |
155 if (id) { | 138 // history, so ignore errors. |
156 // We typically won't have most of them since we only have a subset of | 139 db_->DeleteURLRow(row->id()); |
157 // history, so ignore errors. | |
158 db_->DeleteURLRow(id); | |
159 if (index_.get()) | |
160 index_->DeleteURL(id); | |
161 } | |
162 } | 140 } |
163 } | 141 } |
164 | 142 |
165 void InMemoryHistoryBackend::OnKeywordSearchTermUpdated( | 143 void InMemoryHistoryBackend::OnKeywordSearchTermUpdated( |
166 const KeywordSearchTermDetails& details) { | 144 const KeywordSearchTermDetails& details) { |
167 // The url won't exist for new search terms (as the user hasn't typed it), so | 145 // The url won't exist for new search terms (as the user hasn't typed it), so |
168 // we force it to be added. If we end up adding a URL it won't be | 146 // we force it to be added. If we end up adding a URL it won't be |
169 // autocompleted as the typed count is 0. | 147 // autocompleted as the typed count is 0. |
170 URLRow url_row; | 148 URLRow url_row; |
171 URLID url_id; | 149 URLID url_id; |
(...skipping 15 matching lines...) Expand all Loading... |
187 | 165 |
188 bool InMemoryHistoryBackend::HasKeyword(const GURL& url) { | 166 bool InMemoryHistoryBackend::HasKeyword(const GURL& url) { |
189 URLID id = db_->GetRowForURL(url, NULL); | 167 URLID id = db_->GetRowForURL(url, NULL); |
190 if (!id) | 168 if (!id) |
191 return false; | 169 return false; |
192 | 170 |
193 return db_->GetKeywordSearchTermRow(id, NULL); | 171 return db_->GetKeywordSearchTermRow(id, NULL); |
194 } | 172 } |
195 | 173 |
196 } // namespace history | 174 } // namespace history |
OLD | NEW |