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

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

Issue 2321343002: Redirect handling in resource prefetch predictor (Closed)
Patch Set: Redirects database schema changed Created 4 years, 3 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/predictors/resource_prefetch_predictor_tables.h" 5 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/metrics/histogram_macros.h" 14 #include "base/metrics/histogram_macros.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
17 #include "sql/meta_table.h" 17 #include "sql/meta_table.h"
18 #include "sql/statement.h" 18 #include "sql/statement.h"
19 #include "sql/transaction.h" 19 #include "sql/transaction.h"
20 20
21 using content::BrowserThread; 21 using content::BrowserThread;
22 using sql::Statement; 22 using sql::Statement;
23 23
24 namespace { 24 namespace {
25 25
26 using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow; 26 using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow;
27 using RedirectRow = predictors::ResourcePrefetchPredictorTables::RedirectRow;
28 using RedirectData = predictors::ResourcePrefetchPredictorTables::RedirectData;
27 29
28 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; 30 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
29 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 31 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url_resource";
30 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; 32 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata";
31 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 33 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
34 const char kHostResourceTableName[] =
35 "resource_prefetch_predictor_host_resource";
32 const char kHostMetadataTableName[] = 36 const char kHostMetadataTableName[] =
33 "resource_prefetch_predictor_host_metadata"; 37 "resource_prefetch_predictor_host_metadata";
38 const char kHostRedirectTableName[] =
39 "resource_prefetch_predictor_host_redirect";
34 40
35 const char kCreateGlobalMetadataStatementTemplate[] = 41 const char kCreateGlobalMetadataStatementTemplate[] =
36 "CREATE TABLE %s ( " 42 "CREATE TABLE %s ( "
37 "key TEXT, value INTEGER, " 43 "key TEXT, value INTEGER, "
38 "PRIMARY KEY (key))"; 44 "PRIMARY KEY (key))";
39 const char kCreateResourceTableStatementTemplate[] = 45 const char kCreateResourceTableStatementTemplate[] =
40 "CREATE TABLE %s ( " 46 "CREATE TABLE %s ( "
41 "main_page_url TEXT, " 47 "main_page_url TEXT, "
42 "resource_url TEXT, " 48 "resource_url TEXT, "
43 "proto BLOB, " 49 "proto BLOB, "
44 "PRIMARY KEY(main_page_url, resource_url))"; 50 "PRIMARY KEY(main_page_url, resource_url))";
45 const char kCreateMetadataTableStatementTemplate[] = 51 const char kCreateMetadataTableStatementTemplate[] =
46 "CREATE TABLE %s ( " 52 "CREATE TABLE %s ( "
47 "main_page_url TEXT, " 53 "main_page_url TEXT, "
48 "last_visit_time INTEGER, " 54 "last_visit_time INTEGER, "
49 "PRIMARY KEY(main_page_url))"; 55 "PRIMARY KEY(main_page_url))";
56 const char kCreateRedirectTableStatementTemplate[] =
57 "CREATE TABLE %s ( "
58 "main_page_url TEXT, "
59 "proto BLOB, "
60 "PRIMARY KEY(main_page_url))";
50 61
51 const char kInsertResourceTableStatementTemplate[] = 62 const char kInsertResourceTableStatementTemplate[] =
52 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; 63 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)";
64 const char kInsertRedirectTableStatementTemplate[] =
65 "INSERT INTO %s (main_page_url, proto) VALUES (?,?)";
53 const char kInsertMetadataTableStatementTemplate[] = 66 const char kInsertMetadataTableStatementTemplate[] =
54 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; 67 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)";
55 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; 68 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?";
56 69
57 void BindResourceRowToStatement(const ResourceRow& row, 70 void BindResourceRowToStatement(const ResourceRow& row,
58 const std::string& primary_key, 71 const std::string& primary_key,
59 Statement* statement) { 72 Statement* statement) {
60 chrome_browser_predictors::ResourceData proto; 73 chrome_browser_predictors::ResourceData proto;
61 row.ToProto(&proto); 74 row.ToProto(&proto);
62 int size = proto.ByteSize(); 75 int size = proto.ByteSize();
63 std::vector<char> proto_buffer(size); 76 std::vector<char> proto_buffer(size);
64 proto.SerializeToArray(&proto_buffer[0], size); 77 proto.SerializeToArray(&proto_buffer[0], size);
65 78
66 statement->BindString(0, primary_key); 79 statement->BindString(0, primary_key);
67 statement->BindString(1, row.resource_url.spec()); 80 statement->BindString(1, row.resource_url.spec());
68 statement->BindBlob(2, &proto_buffer[0], size); 81 statement->BindBlob(2, &proto_buffer[0], size);
69 } 82 }
70 83
84 void BindRedirectDataToStatement(const RedirectData& data,
85 Statement* statement) {
86 chrome_browser_predictors::RedirectProto proto;
87 data.ToProto(&proto);
88 int size = proto.ByteSize();
89 std::vector<char> proto_buffer(size);
90 proto.SerializeToArray(&proto_buffer[0], size);
91
92 statement->BindString(0, data.primary_key);
93 statement->BindBlob(1, &proto_buffer[0], size);
94 }
95
71 bool StepAndInitializeResourceRow(Statement* statement, 96 bool StepAndInitializeResourceRow(Statement* statement,
72 ResourceRow* row, 97 ResourceRow* row,
73 std::string* primary_key) { 98 std::string* primary_key) {
74 if (!statement->Step()) 99 if (!statement->Step())
75 return false; 100 return false;
76 101
77 *primary_key = statement->ColumnString(0); 102 *primary_key = statement->ColumnString(0);
78 103
79 int size = statement->ColumnByteLength(2); 104 int size = statement->ColumnByteLength(2);
80 const void* data = statement->ColumnBlob(2); 105 const void* data = statement->ColumnBlob(2);
81 DCHECK(data); 106 DCHECK(data);
82 chrome_browser_predictors::ResourceData proto; 107 chrome_browser_predictors::ResourceData proto;
83 proto.ParseFromArray(data, size); 108 proto.ParseFromArray(data, size);
84 ResourceRow::FromProto(proto, row); 109 ResourceRow::FromProto(proto, row);
85 110
86 GURL resource_url(statement->ColumnString(1)); 111 GURL resource_url(statement->ColumnString(1));
87 DCHECK(resource_url == row->resource_url); 112 DCHECK(resource_url == row->resource_url);
88 113
89 return true; 114 return true;
90 } 115 }
91 116
117 bool StepAndInitializeRedirectData(Statement* statement,
118 RedirectData* redirect_data,
119 std::string* primary_key) {
120 if (!statement->Step())
121 return false;
122
123 *primary_key = statement->ColumnString(0);
124 redirect_data->primary_key = *primary_key;
125
126 int size = statement->ColumnByteLength(1);
127 const void* data = statement->ColumnBlob(1);
128 DCHECK(data);
129 chrome_browser_predictors::RedirectProto proto;
130 proto.ParseFromArray(data, size);
131 RedirectData::FromProto(proto, redirect_data);
132
133 return true;
134 }
135
92 } // namespace 136 } // namespace
93 137
94 namespace predictors { 138 namespace predictors {
95 139
96 ResourceRow::ResourceRow() 140 ResourceRow::ResourceRow()
97 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), 141 : resource_type(content::RESOURCE_TYPE_LAST_TYPE),
98 number_of_hits(0), 142 number_of_hits(0),
99 number_of_misses(0), 143 number_of_misses(0),
100 consecutive_misses(0), 144 consecutive_misses(0),
101 average_position(0.0), 145 average_position(0.0),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 return resource_url == rhs.resource_url && 205 return resource_url == rhs.resource_url &&
162 resource_type == rhs.resource_type && 206 resource_type == rhs.resource_type &&
163 number_of_hits == rhs.number_of_hits && 207 number_of_hits == rhs.number_of_hits &&
164 number_of_misses == rhs.number_of_misses && 208 number_of_misses == rhs.number_of_misses &&
165 consecutive_misses == rhs.consecutive_misses && 209 consecutive_misses == rhs.consecutive_misses &&
166 average_position == rhs.average_position && priority == rhs.priority && 210 average_position == rhs.average_position && priority == rhs.priority &&
167 has_validators == rhs.has_validators && 211 has_validators == rhs.has_validators &&
168 always_revalidate == rhs.always_revalidate && score == rhs.score; 212 always_revalidate == rhs.always_revalidate && score == rhs.score;
169 } 213 }
170 214
215 // static
216 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) {
217 row->resource_url = GURL(proto.resource_url());
218 row->resource_type =
219 static_cast<content::ResourceType>(proto.resource_type());
220 row->number_of_hits = proto.number_of_hits();
221 row->number_of_misses = proto.number_of_misses();
222 row->consecutive_misses = proto.consecutive_misses();
223 row->average_position = proto.average_position();
224 row->priority = static_cast<net::RequestPriority>(proto.priority());
225 row->has_validators = proto.has_validators();
226 row->always_revalidate = proto.always_revalidate();
227 row->UpdateScore();
228 }
229
171 void ResourceRow::ToProto(ResourceData* resource_data) const { 230 void ResourceRow::ToProto(ResourceData* resource_data) const {
172 using chrome_browser_predictors::ResourceData_Priority; 231 using chrome_browser_predictors::ResourceData_Priority;
173 using chrome_browser_predictors::ResourceData_ResourceType; 232 using chrome_browser_predictors::ResourceData_ResourceType;
174 233
175 resource_data->set_resource_url(resource_url.spec()); 234 resource_data->set_resource_url(resource_url.spec());
176 resource_data->set_resource_type( 235 resource_data->set_resource_type(
177 static_cast<ResourceData_ResourceType>(resource_type)); 236 static_cast<ResourceData_ResourceType>(resource_type));
178 resource_data->set_number_of_hits(number_of_hits); 237 resource_data->set_number_of_hits(number_of_hits);
179 resource_data->set_number_of_misses(number_of_misses); 238 resource_data->set_number_of_misses(number_of_misses);
180 resource_data->set_consecutive_misses(consecutive_misses); 239 resource_data->set_consecutive_misses(consecutive_misses);
181 resource_data->set_average_position(average_position); 240 resource_data->set_average_position(average_position);
182 resource_data->set_priority(static_cast<ResourceData_Priority>(priority)); 241 resource_data->set_priority(static_cast<ResourceData_Priority>(priority));
183 resource_data->set_has_validators(has_validators); 242 resource_data->set_has_validators(has_validators);
184 resource_data->set_always_revalidate(always_revalidate); 243 resource_data->set_always_revalidate(always_revalidate);
185 } 244 }
186 245
187 // static 246 // static
188 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) { 247 void ResourcePrefetchPredictorTables::SortResourceRows(
189 row->resource_url = GURL(proto.resource_url()); 248 std::vector<ResourceRow>* rows) {
190 row->resource_type =
191 static_cast<content::ResourceType>(proto.resource_type());
192 row->number_of_hits = proto.number_of_hits();
193 row->number_of_misses = proto.number_of_misses();
194 row->consecutive_misses = proto.consecutive_misses();
195 row->average_position = proto.average_position();
196 row->priority = static_cast<net::RequestPriority>(proto.priority());
197 row->has_validators = proto.has_validators();
198 row->always_revalidate = proto.always_revalidate();
199 row->UpdateScore();
200 }
201
202 // static
203 void ResourcePrefetchPredictorTables::SortResourceRows(ResourceRows* rows) {
204 std::sort(rows->begin(), rows->end(), 249 std::sort(rows->begin(), rows->end(),
205 [](const ResourceRow& x, const ResourceRow& y) { 250 [](const ResourceRow& x, const ResourceRow& y) {
206 return x.score > y.score; 251 return x.score > y.score;
207 }); 252 });
208 } 253 }
209 254
210 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( 255 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
211 PrefetchKeyType i_key_type, 256 PrefetchKeyType i_key_type,
212 const std::string& i_primary_key) 257 const std::string& i_primary_key)
213 : key_type(i_key_type), 258 : key_type(i_key_type),
(...skipping 10 matching lines...) Expand all
224 269
225 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { 270 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() {
226 } 271 }
227 272
228 bool ResourcePrefetchPredictorTables::PrefetchData::operator==( 273 bool ResourcePrefetchPredictorTables::PrefetchData::operator==(
229 const PrefetchData& rhs) const { 274 const PrefetchData& rhs) const {
230 return key_type == rhs.key_type && primary_key == rhs.primary_key && 275 return key_type == rhs.key_type && primary_key == rhs.primary_key &&
231 resources == rhs.resources; 276 resources == rhs.resources;
232 } 277 }
233 278
279 RedirectRow::RedirectRow()
280 : number_of_hits(0),
281 number_of_misses(0),
282 consecutive_misses(0),
283 score(0.0) {}
284
285 RedirectRow::RedirectRow(const RedirectRow& other)
286 : url(other.url),
287 number_of_hits(other.number_of_hits),
288 number_of_misses(other.number_of_misses),
289 consecutive_misses(other.consecutive_misses),
290 score(other.score) {}
291
292 RedirectRow::RedirectRow(const std::string& i_url,
293 size_t i_number_of_hits,
294 size_t i_number_of_misses,
295 size_t i_consecutive_misses)
296 : url(i_url),
297 number_of_hits(i_number_of_hits),
298 number_of_misses(i_number_of_misses),
299 consecutive_misses(i_consecutive_misses),
300 score(0.0) {}
301
302 void RedirectRow::UpdateScore() {
303 // TODO(alexilin): invent some scoring
304 }
305
306 bool RedirectRow::operator==(const RedirectRow& rhs) const {
307 return url == rhs.url && number_of_hits == rhs.number_of_hits &&
308 number_of_misses == rhs.number_of_misses &&
309 consecutive_misses == rhs.consecutive_misses;
310 }
311
312 // static
313 void RedirectRow::FromProto(const RedirectStat& proto, RedirectRow* row) {
314 row->url = proto.url();
315 row->number_of_hits = proto.number_of_hits();
316 row->number_of_misses = proto.number_of_misses();
317 row->consecutive_misses = proto.consecutive_misses();
318 row->UpdateScore();
319 }
320
321 void RedirectRow::ToProto(RedirectStat* redirect_stat) const {
322 redirect_stat->set_url(url);
323 redirect_stat->set_number_of_hits(number_of_hits);
324 redirect_stat->set_number_of_misses(number_of_misses);
325 redirect_stat->set_consecutive_misses(consecutive_misses);
326 }
327
328 // static
329 void ResourcePrefetchPredictorTables::SortRedirectRows(
330 std::vector<RedirectRow>* rows) {
331 std::sort(rows->begin(), rows->end(),
332 [](const RedirectRow& x, const RedirectRow& y) {
333 return x.score > y.score;
334 });
335 }
336
337 ResourcePrefetchPredictorTables::RedirectData::RedirectData(
338 PrefetchKeyType i_key_type,
339 const std::string& i_primary_key)
340 : key_type(i_key_type), primary_key(i_primary_key) {}
341
342 ResourcePrefetchPredictorTables::RedirectData::RedirectData(
343 const RedirectData& other)
344 : key_type(other.key_type),
345 primary_key(other.primary_key),
346 last_visit(other.last_visit),
347 redirects(other.redirects) {}
348
349 ResourcePrefetchPredictorTables::RedirectData::~RedirectData() {}
350
351 bool ResourcePrefetchPredictorTables::RedirectData::operator==(
352 const RedirectData& rhs) const {
353 return key_type == rhs.key_type && primary_key == rhs.primary_key &&
354 redirects == rhs.redirects;
355 }
356
357 // static
358 void ResourcePrefetchPredictorTables::RedirectData::FromProto(
359 const RedirectProto& proto,
360 RedirectData* data) {
361 data->last_visit = base::Time::FromInternalValue(proto.last_visit_time());
362 data->redirects.clear();
363 for (const auto& stat : proto.redirects()) {
364 RedirectRow row;
365 RedirectRow::FromProto(stat, &row);
366 data->redirects.push_back(row);
367 }
368 }
369
370 void ResourcePrefetchPredictorTables::RedirectData::ToProto(
371 RedirectProto* proto) const {
372 proto->set_last_visit_time(last_visit.ToInternalValue());
373 proto->clear_redirects();
374 for (const auto& row : redirects) {
375 RedirectStat* stat = proto->add_redirects();
376 row.ToProto(stat);
377 }
378 }
379
234 void ResourcePrefetchPredictorTables::GetAllData( 380 void ResourcePrefetchPredictorTables::GetAllData(
235 PrefetchDataMap* url_data_map, 381 PrefetchDataMap* url_data_map,
236 PrefetchDataMap* host_data_map) { 382 PrefetchDataMap* host_data_map,
383 RedirectDataMap* url_redirect_data_map,
384 RedirectDataMap* host_redirect_data_map) {
237 DCHECK_CURRENTLY_ON(BrowserThread::DB); 385 DCHECK_CURRENTLY_ON(BrowserThread::DB);
238 if (CantAccessDatabase()) 386 if (CantAccessDatabase())
239 return; 387 return;
240 388
241 DCHECK(url_data_map); 389 DCHECK(url_data_map);
242 DCHECK(host_data_map); 390 DCHECK(host_data_map);
391 DCHECK(url_redirect_data_map);
392 DCHECK(host_redirect_data_map);
243 url_data_map->clear(); 393 url_data_map->clear();
244 host_data_map->clear(); 394 host_data_map->clear();
395 url_redirect_data_map->clear();
396 host_redirect_data_map->clear();
245 397
246 std::vector<std::string> urls_to_delete, hosts_to_delete; 398 std::vector<std::string> urls_to_delete, hosts_to_delete;
247 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); 399 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map,
248 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); 400 &urls_to_delete);
401 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map,
402 &hosts_to_delete);
403 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map);
404 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map);
249 405
250 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) 406 if (!urls_to_delete.empty() || !hosts_to_delete.empty())
251 DeleteData(urls_to_delete, hosts_to_delete); 407 DeleteResourceData(urls_to_delete, hosts_to_delete);
252 } 408 }
253 409
254 void ResourcePrefetchPredictorTables::UpdateData( 410 void ResourcePrefetchPredictorTables::UpdateData(
255 const PrefetchData& url_data, 411 const PrefetchData& url_data,
256 const PrefetchData& host_data) { 412 const PrefetchData& host_data,
413 const RedirectData& url_redirect_data,
414 const RedirectData& host_redirect_data) {
257 DCHECK_CURRENTLY_ON(BrowserThread::DB); 415 DCHECK_CURRENTLY_ON(BrowserThread::DB);
258 if (CantAccessDatabase()) 416 if (CantAccessDatabase())
259 return; 417 return;
260 418
261 DCHECK(!url_data.is_host() && host_data.is_host()); 419 DCHECK(!url_data.is_host() && host_data.is_host());
262 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty()); 420 DCHECK(!url_redirect_data.is_host() && host_redirect_data.is_host());
421 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty() ||
422 !url_redirect_data.primary_key.empty() ||
423 !host_redirect_data.primary_key.empty());
263 424
264 DB()->BeginTransaction(); 425 DB()->BeginTransaction();
265 426
266 bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && 427 bool success =
267 (host_data.primary_key.empty() || UpdateDataHelper(host_data)); 428 (url_data.primary_key.empty() || UpdateResourceDataHelper(url_data)) &&
429 (host_data.primary_key.empty() || UpdateResourceDataHelper(host_data)) &&
430 (url_redirect_data.primary_key.empty() ||
431 UpdateRedirectDataHelper(url_redirect_data)) &&
432 (host_redirect_data.primary_key.empty() ||
433 UpdateRedirectDataHelper(host_redirect_data));
268 if (!success) 434 if (!success)
269 DB()->RollbackTransaction(); 435 DB()->RollbackTransaction();
270 436 else
271 DB()->CommitTransaction(); 437 DB()->CommitTransaction();
272 } 438 }
273 439
274 void ResourcePrefetchPredictorTables::DeleteData( 440 void ResourcePrefetchPredictorTables::DeleteResourceData(
275 const std::vector<std::string>& urls, 441 const std::vector<std::string>& urls,
276 const std::vector<std::string>& hosts) { 442 const std::vector<std::string>& hosts) {
277 DCHECK_CURRENTLY_ON(BrowserThread::DB); 443 DCHECK_CURRENTLY_ON(BrowserThread::DB);
444 if (CantAccessDatabase())
445 return;
446
447 DCHECK(!urls.empty() || !hosts.empty());
448
449 if (!urls.empty())
450 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_URL, urls);
451 if (!hosts.empty())
452 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_HOST, hosts);
453 }
454
455 void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint(
456 const std::string& key,
457 PrefetchKeyType key_type) {
458 DCHECK_CURRENTLY_ON(BrowserThread::DB);
459 if (CantAccessDatabase())
460 return;
461
462 DeleteResourceDataHelper(key_type, {key});
463 }
464
465 void ResourcePrefetchPredictorTables::DeleteRedirectData(
466 const std::vector<std::string>& urls,
467 const std::vector<std::string>& hosts) {
468 DCHECK_CURRENTLY_ON(BrowserThread::DB);
278 if (CantAccessDatabase()) 469 if (CantAccessDatabase())
279 return; 470 return;
280 471
281 DCHECK(!urls.empty() || !hosts.empty()); 472 DCHECK(!urls.empty() || !hosts.empty());
282 473
283 if (!urls.empty()) 474 if (!urls.empty())
284 DeleteDataHelper(PREFETCH_KEY_TYPE_URL, urls); 475 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_URL, urls);
285 if (!hosts.empty()) 476 if (!hosts.empty())
286 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); 477 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, hosts);
287 } 478 }
288 479
289 void ResourcePrefetchPredictorTables::DeleteSingleDataPoint( 480 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint(
290 const std::string& key, 481 const std::string& key,
291 PrefetchKeyType key_type) { 482 PrefetchKeyType key_type) {
292 DCHECK_CURRENTLY_ON(BrowserThread::DB); 483 DCHECK_CURRENTLY_ON(BrowserThread::DB);
293 if (CantAccessDatabase()) 484 if (CantAccessDatabase())
294 return; 485 return;
295 486
296 DeleteDataHelper(key_type, std::vector<std::string>(1, key)); 487 DeleteRedirectDataHelper(key_type, {key});
297 } 488 }
298 489
299 void ResourcePrefetchPredictorTables::DeleteAllData() { 490 void ResourcePrefetchPredictorTables::DeleteAllData() {
300 if (CantAccessDatabase()) 491 if (CantAccessDatabase())
301 return; 492 return;
302 493
303 Statement deleter; 494 Statement deleter;
304 for (const char* table_name : 495 for (const char* table_name :
305 {kUrlResourceTableName, kUrlMetadataTableName, kHostResourceTableName, 496 {kUrlResourceTableName, kUrlMetadataTableName, kUrlRedirectTableName,
306 kHostMetadataTableName}) { 497 kHostResourceTableName, kHostMetadataTableName,
498 kHostRedirectTableName}) {
307 deleter.Assign(DB()->GetUniqueStatement( 499 deleter.Assign(DB()->GetUniqueStatement(
308 base::StringPrintf("DELETE FROM %s", table_name).c_str())); 500 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
309 deleter.Run(); 501 deleter.Run();
310 } 502 }
311 } 503 }
312 504
313 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() 505 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables()
314 : PredictorTableBase() { 506 : PredictorTableBase() {
315 } 507 }
316 508
317 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { 509 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {
318 } 510 }
319 511
320 void ResourcePrefetchPredictorTables::GetAllDataHelper( 512 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper(
321 PrefetchKeyType key_type, 513 PrefetchKeyType key_type,
322 PrefetchDataMap* data_map, 514 PrefetchDataMap* data_map,
323 std::vector<std::string>* to_delete) { 515 std::vector<std::string>* to_delete) {
324 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 516 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
325 517
326 // Read the resources table and organize it per primary key. 518 // Read the resources table and organize it per primary key.
327 const char* resource_table_name = is_host ? kHostResourceTableName : 519 const char* resource_table_name = is_host ? kHostResourceTableName :
328 kUrlResourceTableName; 520 kUrlResourceTableName;
329 Statement resource_reader(DB()->GetUniqueStatement( 521 Statement resource_reader(DB()->GetUniqueStatement(
330 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str())); 522 base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str()));
331 523
332 ResourceRow row; 524 ResourceRow row;
333 std::string primary_key; 525 std::string primary_key;
334 while (StepAndInitializeResourceRow(&resource_reader, &row, &primary_key)) { 526 while (StepAndInitializeResourceRow(&resource_reader, &row, &primary_key)) {
335 PrefetchDataMap::iterator it = data_map->find(primary_key); 527 PrefetchDataMap::iterator it = data_map->find(primary_key);
336 if (it == data_map->end()) { 528 if (it == data_map->end()) {
337 it = data_map->insert(std::make_pair( 529 it = data_map->insert(std::make_pair(
338 primary_key, PrefetchData(key_type, primary_key))).first; 530 primary_key, PrefetchData(key_type, primary_key))).first;
339 } 531 }
340 it->second.resources.push_back(row); 532 it->second.resources.push_back(row);
341 } 533 }
342 534
343 // Sort each of the resource row vectors by score. 535 // Sort each of the resource row vectors by score.
344 for (auto& kv : *data_map) 536 for (auto& kv : *data_map)
345 SortResourceRows(&(kv.second.resources)); 537 SortResourceRows(&(kv.second.resources));
346 538
347 // Read the metadata and keep track of entries that have metadata, but no 539 // Read the metadata and keep track of entries that have metadata, but no
348 // resource entries, so they can be deleted. 540 // resource entries, so they can be deleted.
349 const char* metadata_table_name = is_host ? kHostMetadataTableName : 541 const char* metadata_table_name =
350 kUrlMetadataTableName; 542 is_host ? kHostMetadataTableName : kUrlMetadataTableName;
351 Statement metadata_reader(DB()->GetUniqueStatement( 543 Statement metadata_reader(DB()->GetUniqueStatement(
352 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); 544 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str()));
353 545
354 while (metadata_reader.Step()) { 546 while (metadata_reader.Step()) {
355 std::string primary_key = metadata_reader.ColumnString(0); 547 std::string primary_key = metadata_reader.ColumnString(0);
356 548
357 PrefetchDataMap::iterator it = data_map->find(primary_key); 549 PrefetchDataMap::iterator it = data_map->find(primary_key);
358 if (it != data_map->end()) { 550 if (it != data_map->end()) {
359 int64_t last_visit = metadata_reader.ColumnInt64(1); 551 int64_t last_visit = metadata_reader.ColumnInt64(1);
360 it->second.last_visit = base::Time::FromInternalValue(last_visit); 552 it->second.last_visit = base::Time::FromInternalValue(last_visit);
361 } else { 553 } else {
362 to_delete->push_back(primary_key); 554 to_delete->push_back(primary_key);
363 } 555 }
364 } 556 }
365 } 557 }
366 558
367 bool ResourcePrefetchPredictorTables::UpdateDataHelper( 559 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper(
560 PrefetchKeyType key_type,
561 RedirectDataMap* redirect_map) {
562 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
563
564 const char* redirect_table_name =
565 is_host ? kHostRedirectTableName : kUrlRedirectTableName;
566 Statement redirect_reader(DB()->GetUniqueStatement(
567 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str()));
568
569 RedirectData data(key_type);
570 std::string primary_key;
571 while (StepAndInitializeRedirectData(&redirect_reader, &data, &primary_key)) {
572 auto result = redirect_map->insert(std::make_pair(primary_key, data));
573 DCHECK(result.second);
574 }
575 }
576
577 bool ResourcePrefetchPredictorTables::UpdateResourceDataHelper(
368 const PrefetchData& data) { 578 const PrefetchData& data) {
369 DCHECK(!data.primary_key.empty()); 579 DCHECK(!data.primary_key.empty());
370 580
371 if (!StringsAreSmallerThanDBLimit(data)) { 581 if (!StringsAreSmallerThanDBLimit(data)) {
372 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); 582 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
373 return false; 583 return false;
374 } 584 }
375 585
376 // Delete the older data from both the tables. 586 // Delete the older data from both the tables.
377 std::unique_ptr<Statement> deleter(data.is_host() 587 std::unique_ptr<Statement> deleter(data.is_host()
378 ? GetHostResourceDeleteStatement() 588 ? GetHostResourceDeleteStatement()
379 : GetUrlResourceDeleteStatement()); 589 : GetUrlResourceDeleteStatement());
380 deleter->BindString(0, data.primary_key); 590 deleter->BindString(0, data.primary_key);
381 if (!deleter->Run()) 591 if (!deleter->Run())
382 return false; 592 return false;
383 593
384 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : 594 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement()
385 GetUrlMetadataDeleteStatement()); 595 : GetUrlMetadataDeleteStatement());
386 deleter->BindString(0, data.primary_key); 596 deleter->BindString(0, data.primary_key);
387 if (!deleter->Run()) 597 if (!deleter->Run())
388 return false; 598 return false;
389 599
390 // Add the new data to the tables. 600 // Add the new data to the tables.
391 for (const ResourceRow& resource : data.resources) { 601 for (const ResourceRow& resource : data.resources) {
392 std::unique_ptr<Statement> resource_inserter( 602 std::unique_ptr<Statement> resource_inserter(
393 data.is_host() ? GetHostResourceUpdateStatement() 603 data.is_host() ? GetHostResourceUpdateStatement()
394 : GetUrlResourceUpdateStatement()); 604 : GetUrlResourceUpdateStatement());
395 BindResourceRowToStatement(resource, data.primary_key, 605 BindResourceRowToStatement(resource, data.primary_key,
396 resource_inserter.get()); 606 resource_inserter.get());
397 if (!resource_inserter->Run()) 607 if (!resource_inserter->Run())
398 return false; 608 return false;
399 } 609 }
400 610
401 std::unique_ptr<Statement> metadata_inserter( 611 std::unique_ptr<Statement> metadata_inserter(
402 data.is_host() ? GetHostMetadataUpdateStatement() 612 data.is_host() ? GetHostMetadataUpdateStatement()
403 : GetUrlMetadataUpdateStatement()); 613 : GetUrlMetadataUpdateStatement());
404 metadata_inserter->BindString(0, data.primary_key); 614 metadata_inserter->BindString(0, data.primary_key);
405 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); 615 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue());
406 if (!metadata_inserter->Run()) 616 if (!metadata_inserter->Run())
407 return false; 617 return false;
408 618
409 return true; 619 return true;
410 } 620 }
411 621
412 void ResourcePrefetchPredictorTables::DeleteDataHelper( 622 bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper(
623 const RedirectData& data) {
624 DCHECK(!data.primary_key.empty());
625
626 if (!StringsAreSmallerThanDBLimit(data)) {
627 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
628 return false;
629 }
630
631 // Delete the older data from the table.
632 std::unique_ptr<Statement> deleter(data.is_host()
633 ? GetHostRedirectDeleteStatement()
634 : GetUrlRedirectDeleteStatement());
635 deleter->BindString(0, data.primary_key);
636 if (!deleter->Run())
637 return false;
638
639 // Add the new data to the table.
640 std::unique_ptr<Statement> inserter(data.is_host()
641 ? GetHostRedirectUpdateStatement()
642 : GetUrlRedirectUpdateStatement());
643 BindRedirectDataToStatement(data, inserter.get());
644 if (!inserter->Run())
645 return false;
646
647 return true;
648 }
649
650 void ResourcePrefetchPredictorTables::DeleteResourceDataHelper(
413 PrefetchKeyType key_type, 651 PrefetchKeyType key_type,
414 const std::vector<std::string>& keys) { 652 const std::vector<std::string>& keys) {
415 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 653 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
416 654
417 for (const std::string& key : keys) { 655 for (const std::string& key : keys) {
418 std::unique_ptr<Statement> deleter(is_host 656 std::unique_ptr<Statement> deleter(is_host
419 ? GetHostResourceDeleteStatement() 657 ? GetHostResourceDeleteStatement()
420 : GetUrlResourceDeleteStatement()); 658 : GetUrlResourceDeleteStatement());
421 deleter->BindString(0, key); 659 deleter->BindString(0, key);
422 deleter->Run(); 660 deleter->Run();
423 661
424 deleter.reset(is_host ? GetHostMetadataDeleteStatement() : 662 deleter.reset(is_host ? GetHostMetadataDeleteStatement()
425 GetUrlMetadataDeleteStatement()); 663 : GetUrlMetadataDeleteStatement());
426 deleter->BindString(0, key); 664 deleter->BindString(0, key);
427 deleter->Run(); 665 deleter->Run();
428 } 666 }
667 }
668
669 void ResourcePrefetchPredictorTables::DeleteRedirectDataHelper(
670 PrefetchKeyType key_type,
671 const std::vector<std::string>& keys) {
672 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
673
674 for (const std::string& key : keys) {
675 std::unique_ptr<Statement> deleter(is_host
676 ? GetHostRedirectDeleteStatement()
677 : GetUrlRedirectDeleteStatement());
678 deleter->BindString(0, key);
679 deleter->Run();
680 }
429 } 681 }
430 682
431 // static 683 // static
432 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( 684 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
433 const PrefetchData& data) { 685 const PrefetchData& data) {
434 if (data.primary_key.length() > kMaxStringLength) 686 if (data.primary_key.length() > kMaxStringLength)
435 return false; 687 return false;
436 688
437 for (const ResourceRow& row : data.resources) { 689 for (const ResourceRow& row : data.resources) {
438 if (row.resource_url.spec().length() > kMaxStringLength) 690 if (row.resource_url.spec().length() > kMaxStringLength)
439 return false; 691 return false;
440 } 692 }
441 return true; 693 return true;
442 } 694 }
443 695
444 // static 696 // static
697 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
698 const RedirectData& data) {
699 if (data.primary_key.length() > kMaxStringLength)
700 return false;
701
702 for (const RedirectRow& row : data.redirects) {
703 if (row.url.length() > kMaxStringLength)
704 return false;
705 }
706 return true;
707 }
708
709 // static
445 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( 710 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
446 sql::Connection* db) { 711 sql::Connection* db) {
447 int version = GetDatabaseVersion(db); 712 int version = GetDatabaseVersion(db);
448 bool success = true; 713 bool success = true;
449 // Too new is also a problem. 714 // Too new is also a problem.
450 bool incompatible_version = version != kDatabaseVersion; 715 bool incompatible_version = version != kDatabaseVersion;
451 716
452 if (incompatible_version) { 717 if (incompatible_version) {
453 for (const char* table_name : 718 for (const char* table_name :
454 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, 719 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName,
455 kUrlMetadataTableName, kHostMetadataTableName}) { 720 kUrlRedirectTableName, kHostRedirectTableName, kUrlMetadataTableName,
721 kHostMetadataTableName}) {
456 success = 722 success =
457 success && 723 success &&
458 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) 724 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name)
459 .c_str()); 725 .c_str());
460 } 726 }
461 } 727 }
462 728
463 if (incompatible_version) { 729 if (incompatible_version) {
464 success = 730 success =
465 success && 731 success &&
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 success = 778 success =
513 success && 779 success &&
514 (db->DoesTableExist(kUrlResourceTableName) || 780 (db->DoesTableExist(kUrlResourceTableName) ||
515 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 781 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
516 kUrlResourceTableName) 782 kUrlResourceTableName)
517 .c_str())) && 783 .c_str())) &&
518 (db->DoesTableExist(kUrlMetadataTableName) || 784 (db->DoesTableExist(kUrlMetadataTableName) ||
519 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, 785 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
520 kUrlMetadataTableName) 786 kUrlMetadataTableName)
521 .c_str())) && 787 .c_str())) &&
788 (db->DoesTableExist(kUrlRedirectTableName) ||
789 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
790 kUrlRedirectTableName)
791 .c_str())) &&
522 (db->DoesTableExist(kHostResourceTableName) || 792 (db->DoesTableExist(kHostResourceTableName) ||
523 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 793 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
524 kHostResourceTableName) 794 kHostResourceTableName)
525 .c_str())) && 795 .c_str())) &&
526 (db->DoesTableExist(kHostMetadataTableName) || 796 (db->DoesTableExist(kHostMetadataTableName) ||
527 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, 797 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
528 kHostMetadataTableName) 798 kHostMetadataTableName)
799 .c_str())) &&
800 (db->DoesTableExist(kHostRedirectTableName) ||
801 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
802 kHostRedirectTableName)
529 .c_str())); 803 .c_str()));
530 804
531 if (success) 805 if (success)
532 success = transaction.Commit(); 806 success = transaction.Commit();
533 else 807 else
534 transaction.Rollback(); 808 transaction.Rollback();
535 809
536 if (!success) 810 if (!success)
537 ResetDB(); 811 ResetDB();
538 } 812 }
539 813
540 void ResourcePrefetchPredictorTables::LogDatabaseStats() { 814 void ResourcePrefetchPredictorTables::LogDatabaseStats() {
541 DCHECK_CURRENTLY_ON(BrowserThread::DB); 815 DCHECK_CURRENTLY_ON(BrowserThread::DB);
542 if (CantAccessDatabase()) 816 if (CantAccessDatabase())
543 return; 817 return;
544 818
545 Statement statement(DB()->GetUniqueStatement( 819 Statement statement(DB()->GetUniqueStatement(
546 base::StringPrintf("SELECT count(*) FROM %s", 820 base::StringPrintf("SELECT count(*) FROM %s",
547 kUrlResourceTableName).c_str())); 821 kUrlResourceTableName).c_str()));
548 if (statement.Step()) 822 if (statement.Step())
549 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", 823 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount",
550 statement.ColumnInt(0)); 824 statement.ColumnInt(0));
551 825
552 statement.Assign(DB()->GetUniqueStatement( 826 statement.Assign(DB()->GetUniqueStatement(
553 base::StringPrintf("SELECT count(*) FROM %s", 827 base::StringPrintf("SELECT count(*) FROM %s",
554 kHostResourceTableName).c_str())); 828 kHostResourceTableName).c_str()));
555 if (statement.Step()) 829 if (statement.Step())
556 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", 830 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount",
557 statement.ColumnInt(0)); 831 statement.ColumnInt(0));
832
833 statement.Assign(DB()->GetUniqueStatement(
834 base::StringPrintf("SELECT count(*) FROM %s", kUrlRedirectTableName)
835 .c_str()));
836 if (statement.Step())
837 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlRedirectTableRowCount",
838 statement.ColumnInt(0));
839
840 statement.Assign(DB()->GetUniqueStatement(
841 base::StringPrintf("SELECT count(*) FROM %s", kHostRedirectTableName)
842 .c_str()));
843 if (statement.Step())
844 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostRedirectTableRowCount",
845 statement.ColumnInt(0));
558 } 846 }
559 847
560 Statement* 848 Statement*
561 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { 849 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() {
562 return new Statement(DB()->GetCachedStatement( 850 return new Statement(DB()->GetCachedStatement(
563 SQL_FROM_HERE, 851 SQL_FROM_HERE,
564 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName) 852 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName)
565 .c_str())); 853 .c_str()));
566 } 854 }
567 855
568 Statement* 856 Statement*
569 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { 857 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() {
570 return new Statement(DB()->GetCachedStatement( 858 return new Statement(DB()->GetCachedStatement(
571 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, 859 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate,
572 kUrlResourceTableName) 860 kUrlResourceTableName)
573 .c_str())); 861 .c_str()));
574 } 862 }
575 863
576 Statement* 864 Statement* ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() {
577 ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() {
578 return new Statement(DB()->GetCachedStatement( 865 return new Statement(DB()->GetCachedStatement(
579 SQL_FROM_HERE, 866 SQL_FROM_HERE,
580 base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName) 867 base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName)
581 .c_str())); 868 .c_str()));
582 } 869 }
583 870
584 Statement* 871 Statement* ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() {
585 ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() {
586 return new Statement(DB()->GetCachedStatement( 872 return new Statement(DB()->GetCachedStatement(
587 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, 873 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
588 kUrlMetadataTableName) 874 kUrlMetadataTableName)
589 .c_str())); 875 .c_str()));
590 } 876 }
591 877
878 Statement* ResourcePrefetchPredictorTables::GetUrlRedirectDeleteStatement() {
879 return new Statement(DB()->GetCachedStatement(
880 SQL_FROM_HERE,
881 base::StringPrintf(kDeleteStatementTemplate, kUrlRedirectTableName)
882 .c_str()));
883 }
884
885 Statement* ResourcePrefetchPredictorTables::GetUrlRedirectUpdateStatement() {
886 return new Statement(DB()->GetCachedStatement(
887 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate,
888 kUrlRedirectTableName)
889 .c_str()));
890 }
891
592 Statement* 892 Statement*
593 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { 893 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() {
594 return new Statement(DB()->GetCachedStatement( 894 return new Statement(DB()->GetCachedStatement(
595 SQL_FROM_HERE, 895 SQL_FROM_HERE,
596 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName) 896 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName)
597 .c_str())); 897 .c_str()));
598 } 898 }
599 899
600 Statement* 900 Statement*
601 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { 901 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() {
602 return new Statement(DB()->GetCachedStatement( 902 return new Statement(DB()->GetCachedStatement(
603 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, 903 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate,
604 kHostResourceTableName) 904 kHostResourceTableName)
605 .c_str())); 905 .c_str()));
606 } 906 }
607 907
608 Statement* 908 Statement* ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() {
609 ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() {
610 return new Statement(DB()->GetCachedStatement( 909 return new Statement(DB()->GetCachedStatement(
611 SQL_FROM_HERE, 910 SQL_FROM_HERE,
612 base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName) 911 base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName)
613 .c_str())); 912 .c_str()));
614 } 913 }
615 914
616 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { 915 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() {
617 return new Statement(DB()->GetCachedStatement( 916 return new Statement(DB()->GetCachedStatement(
618 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, 917 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
619 kHostMetadataTableName) 918 kHostMetadataTableName)
620 .c_str())); 919 .c_str()));
621 } 920 }
622 921
922 Statement* ResourcePrefetchPredictorTables::GetHostRedirectDeleteStatement() {
923 return new Statement(DB()->GetCachedStatement(
924 SQL_FROM_HERE,
925 base::StringPrintf(kDeleteStatementTemplate, kHostRedirectTableName)
926 .c_str()));
927 }
928
929 Statement* ResourcePrefetchPredictorTables::GetHostRedirectUpdateStatement() {
930 return new Statement(DB()->GetCachedStatement(
931 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate,
932 kHostRedirectTableName)
933 .c_str()));
934 }
935
623 } // namespace predictors 936 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698