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

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

Issue 2321343002: Redirect handling in resource prefetch predictor (Closed)
Patch Set: Update some comments 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;
27 28
28 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; 29 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
29 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 30 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url_resource";
30 const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; 31 const char kUrlResourceMetadataTableName[] =
31 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 32 "resource_prefetch_predictor_url_resource_metadata";
32 const char kHostMetadataTableName[] = 33 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
33 "resource_prefetch_predictor_host_metadata"; 34 const char kUrlRedirectMetadataTableName[] =
35 "resource_prefetch_predictor_url_redirect_metadata";
36 const char kHostResourceTableName[] =
37 "resource_prefetch_predictor_host_resource";
38 const char kHostResourceMetadataTableName[] =
39 "resource_prefetch_predictor_host_resource_metadata";
40 const char kHostRedirectTableName[] =
41 "resource_prefetch_predictor_host_redirect";
42 const char kHostRedirectMetadataTableName[] =
43 "resource_prefetch_preditcor_host_redirect_metadata";
34 44
35 const char kCreateGlobalMetadataStatementTemplate[] = 45 const char kCreateGlobalMetadataStatementTemplate[] =
36 "CREATE TABLE %s ( " 46 "CREATE TABLE %s ( "
37 "key TEXT, value INTEGER, " 47 "key TEXT, value INTEGER, "
38 "PRIMARY KEY (key))"; 48 "PRIMARY KEY (key))";
39 const char kCreateResourceTableStatementTemplate[] = 49 const char kCreateResourceTableStatementTemplate[] =
40 "CREATE TABLE %s ( " 50 "CREATE TABLE %s ( "
41 "main_page_url TEXT, " 51 "main_page_url TEXT, "
42 "resource_url TEXT, " 52 "resource_url TEXT, "
43 "proto BLOB, " 53 "proto BLOB, "
44 "PRIMARY KEY(main_page_url, resource_url))"; 54 "PRIMARY KEY(main_page_url, resource_url))";
55 const char kCreateRedirectTableStatementTemplate[] =
56 "CREATE TABLE %s ( "
57 "main_page_url TEXT, "
58 "final_redirect TEXT, "
mattcary 2016/09/14 15:37:09 I'm not sure why final_redirect is part of the key
alexilin 2016/09/14 18:59:55 I just copied structure of resource table. It's a
mattcary 2016/09/15 09:04:34 Yeah, that's what I mean. If you always change mul
59 "proto BLOB, "
60 "PRIMARY KEY(main_page_url, final_redirect))";
45 const char kCreateMetadataTableStatementTemplate[] = 61 const char kCreateMetadataTableStatementTemplate[] =
46 "CREATE TABLE %s ( " 62 "CREATE TABLE %s ( "
47 "main_page_url TEXT, " 63 "main_page_url TEXT, "
48 "last_visit_time INTEGER, " 64 "last_visit_time INTEGER, "
49 "PRIMARY KEY(main_page_url))"; 65 "PRIMARY KEY(main_page_url))";
50 66
51 const char kInsertResourceTableStatementTemplate[] = 67 const char kInsertResourceTableStatementTemplate[] =
52 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; 68 "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)";
69 const char kInsertRedirectTableStatementTemplate[] =
70 "INSERT INTO %s (main_page_url, final_redirect, proto) VALUES (?,?,?)";
53 const char kInsertMetadataTableStatementTemplate[] = 71 const char kInsertMetadataTableStatementTemplate[] =
54 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; 72 "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)";
55 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; 73 const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?";
56 74
57 void BindResourceRowToStatement(const ResourceRow& row, 75 void BindResourceRowToStatement(const ResourceRow& row,
58 const std::string& primary_key, 76 const std::string& primary_key,
59 Statement* statement) { 77 Statement* statement) {
60 chrome_browser_predictors::ResourceData proto; 78 chrome_browser_predictors::ResourceData proto;
61 row.ToProto(&proto); 79 row.ToProto(&proto);
62 int size = proto.ByteSize(); 80 int size = proto.ByteSize();
63 std::vector<char> proto_buffer(size); 81 std::vector<char> proto_buffer(size);
64 proto.SerializeToArray(&proto_buffer[0], size); 82 proto.SerializeToArray(&proto_buffer[0], size);
65 83
66 statement->BindString(0, primary_key); 84 statement->BindString(0, primary_key);
67 statement->BindString(1, row.resource_url.spec()); 85 statement->BindString(1, row.resource_url.spec());
68 statement->BindBlob(2, &proto_buffer[0], size); 86 statement->BindBlob(2, &proto_buffer[0], size);
69 } 87 }
70 88
89 void BindRedirectRowToStatement(const RedirectRow& row,
90 const std::string& primary_key,
91 Statement* statement) {
92 chrome_browser_predictors::RedirectStat proto;
93 row.ToProto(&proto);
94 int size = proto.ByteSize();
95 std::vector<char> proto_buffer(size);
96 proto.SerializeToArray(&proto_buffer[0], size);
97
98 statement->BindString(0, primary_key);
99 statement->BindString(1, row.final_redirect);
100 statement->BindBlob(2, &proto_buffer[0], size);
101 }
102
71 bool StepAndInitializeResourceRow(Statement* statement, 103 bool StepAndInitializeResourceRow(Statement* statement,
72 ResourceRow* row, 104 ResourceRow* row,
73 std::string* primary_key) { 105 std::string* primary_key) {
74 if (!statement->Step()) 106 if (!statement->Step())
75 return false; 107 return false;
76 108
77 *primary_key = statement->ColumnString(0); 109 *primary_key = statement->ColumnString(0);
78 110
79 int size = statement->ColumnByteLength(2); 111 int size = statement->ColumnByteLength(2);
80 const void* data = statement->ColumnBlob(2); 112 const void* data = statement->ColumnBlob(2);
81 DCHECK(data); 113 DCHECK(data);
82 chrome_browser_predictors::ResourceData proto; 114 chrome_browser_predictors::ResourceData proto;
83 proto.ParseFromArray(data, size); 115 proto.ParseFromArray(data, size);
84 ResourceRow::FromProto(proto, row); 116 ResourceRow::FromProto(proto, row);
85 117
86 GURL resource_url(statement->ColumnString(1)); 118 GURL resource_url(statement->ColumnString(1));
87 DCHECK(resource_url == row->resource_url); 119 DCHECK(resource_url == row->resource_url);
88 120
89 return true; 121 return true;
90 } 122 }
91 123
124 bool StepAndInitializeRedirectRow(Statement* statement,
125 RedirectRow* row,
126 std::string* primary_key) {
127 if (!statement->Step())
128 return false;
129
130 *primary_key = statement->ColumnString(0);
131
132 int size = statement->ColumnByteLength(2);
133 const void* data = statement->ColumnBlob(2);
134 DCHECK(data);
135 chrome_browser_predictors::RedirectStat proto;
136 proto.ParseFromArray(data, size);
137 RedirectRow::FromProto(proto, row);
138
139 std::string final_redirect(statement->ColumnString(1));
140 DCHECK(final_redirect == row->final_redirect);
141
142 return true;
143 }
144
92 } // namespace 145 } // namespace
93 146
94 namespace predictors { 147 namespace predictors {
95 148
96 ResourceRow::ResourceRow() 149 ResourceRow::ResourceRow()
97 : resource_type(content::RESOURCE_TYPE_LAST_TYPE), 150 : resource_type(content::RESOURCE_TYPE_LAST_TYPE),
98 number_of_hits(0), 151 number_of_hits(0),
99 number_of_misses(0), 152 number_of_misses(0),
100 consecutive_misses(0), 153 consecutive_misses(0),
101 average_position(0.0), 154 average_position(0.0),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 return resource_url == rhs.resource_url && 214 return resource_url == rhs.resource_url &&
162 resource_type == rhs.resource_type && 215 resource_type == rhs.resource_type &&
163 number_of_hits == rhs.number_of_hits && 216 number_of_hits == rhs.number_of_hits &&
164 number_of_misses == rhs.number_of_misses && 217 number_of_misses == rhs.number_of_misses &&
165 consecutive_misses == rhs.consecutive_misses && 218 consecutive_misses == rhs.consecutive_misses &&
166 average_position == rhs.average_position && priority == rhs.priority && 219 average_position == rhs.average_position && priority == rhs.priority &&
167 has_validators == rhs.has_validators && 220 has_validators == rhs.has_validators &&
168 always_revalidate == rhs.always_revalidate && score == rhs.score; 221 always_revalidate == rhs.always_revalidate && score == rhs.score;
169 } 222 }
170 223
224 // static
225 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) {
226 row->resource_url = GURL(proto.resource_url());
227 row->resource_type =
228 static_cast<content::ResourceType>(proto.resource_type());
229 row->number_of_hits = proto.number_of_hits();
230 row->number_of_misses = proto.number_of_misses();
231 row->consecutive_misses = proto.consecutive_misses();
232 row->average_position = proto.average_position();
233 row->priority = static_cast<net::RequestPriority>(proto.priority());
234 row->has_validators = proto.has_validators();
235 row->always_revalidate = proto.always_revalidate();
236 row->UpdateScore();
237 }
238
171 void ResourceRow::ToProto(ResourceData* resource_data) const { 239 void ResourceRow::ToProto(ResourceData* resource_data) const {
172 using chrome_browser_predictors::ResourceData_Priority; 240 using chrome_browser_predictors::ResourceData_Priority;
173 using chrome_browser_predictors::ResourceData_ResourceType; 241 using chrome_browser_predictors::ResourceData_ResourceType;
174 242
175 resource_data->set_resource_url(resource_url.spec()); 243 resource_data->set_resource_url(resource_url.spec());
176 resource_data->set_resource_type( 244 resource_data->set_resource_type(
177 static_cast<ResourceData_ResourceType>(resource_type)); 245 static_cast<ResourceData_ResourceType>(resource_type));
178 resource_data->set_number_of_hits(number_of_hits); 246 resource_data->set_number_of_hits(number_of_hits);
179 resource_data->set_number_of_misses(number_of_misses); 247 resource_data->set_number_of_misses(number_of_misses);
180 resource_data->set_consecutive_misses(consecutive_misses); 248 resource_data->set_consecutive_misses(consecutive_misses);
181 resource_data->set_average_position(average_position); 249 resource_data->set_average_position(average_position);
182 resource_data->set_priority(static_cast<ResourceData_Priority>(priority)); 250 resource_data->set_priority(static_cast<ResourceData_Priority>(priority));
183 resource_data->set_has_validators(has_validators); 251 resource_data->set_has_validators(has_validators);
184 resource_data->set_always_revalidate(always_revalidate); 252 resource_data->set_always_revalidate(always_revalidate);
185 } 253 }
186 254
187 // static 255 // static
188 void ResourceRow::FromProto(const ResourceData& proto, ResourceRow* row) { 256 void ResourcePrefetchPredictorTables::SortResourceRows(
189 row->resource_url = GURL(proto.resource_url()); 257 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(), 258 std::sort(rows->begin(), rows->end(),
205 [](const ResourceRow& x, const ResourceRow& y) { 259 [](const ResourceRow& x, const ResourceRow& y) {
206 return x.score > y.score; 260 return x.score > y.score;
207 }); 261 });
208 } 262 }
209 263
210 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData( 264 ResourcePrefetchPredictorTables::PrefetchData::PrefetchData(
211 PrefetchKeyType i_key_type, 265 PrefetchKeyType i_key_type,
212 const std::string& i_primary_key) 266 const std::string& i_primary_key)
213 : key_type(i_key_type), 267 : key_type(i_key_type),
(...skipping 10 matching lines...) Expand all
224 278
225 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { 279 ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() {
226 } 280 }
227 281
228 bool ResourcePrefetchPredictorTables::PrefetchData::operator==( 282 bool ResourcePrefetchPredictorTables::PrefetchData::operator==(
229 const PrefetchData& rhs) const { 283 const PrefetchData& rhs) const {
230 return key_type == rhs.key_type && primary_key == rhs.primary_key && 284 return key_type == rhs.key_type && primary_key == rhs.primary_key &&
231 resources == rhs.resources; 285 resources == rhs.resources;
232 } 286 }
233 287
288 RedirectRow::RedirectRow()
289 : number_of_hits(0),
290 number_of_misses(0),
291 consecutive_misses(0),
292 score(0.0) {}
293
294 RedirectRow::RedirectRow(const RedirectRow& other)
295 : final_redirect(other.final_redirect),
296 number_of_hits(other.number_of_hits),
297 number_of_misses(other.number_of_misses),
298 consecutive_misses(other.consecutive_misses),
299 score(other.score) {}
300
301 RedirectRow::RedirectRow(
302 const std::string& i_final_redirect,
303 size_t i_number_of_hits,
304 size_t i_number_of_misses,
305 size_t i_consecutive_misses)
306 : final_redirect(i_final_redirect),
307 number_of_hits(i_number_of_hits),
308 number_of_misses(i_number_of_misses),
309 consecutive_misses(i_consecutive_misses),
310 score(0.0) {}
311
312 void RedirectRow::UpdateScore() {
313 // TODO(alexilin): invent some scoring
314 }
315
316 bool RedirectRow::operator==(const RedirectRow& rhs) const {
317 return final_redirect == rhs.final_redirect &&
318 number_of_hits == rhs.number_of_hits &&
319 number_of_misses == rhs.number_of_misses &&
320 consecutive_misses == rhs.consecutive_misses;
321 }
322
323 // static
324 void RedirectRow::FromProto(const RedirectStat& proto, RedirectRow* row) {
325 row->final_redirect = proto.final_redirect();
326 row->number_of_hits = proto.number_of_hits();
327 row->number_of_misses = proto.number_of_misses();
328 row->consecutive_misses = proto.consecutive_misses();
329 row->UpdateScore();
330 }
331
332 void RedirectRow::ToProto(RedirectStat* redirect_stat) const {
333 redirect_stat->set_final_redirect(final_redirect);
334 redirect_stat->set_number_of_hits(number_of_hits);
335 redirect_stat->set_number_of_misses(number_of_misses);
336 redirect_stat->set_consecutive_misses(consecutive_misses);
337 }
338
339 // static
340 void ResourcePrefetchPredictorTables::SortRedirectRows(
341 std::vector<RedirectRow>* rows) {
342 std::sort(rows->begin(), rows->end(),
343 [](const RedirectRow& x, const RedirectRow& y) {
344 return x.score > y.score;
345 });
346 }
347
348 ResourcePrefetchPredictorTables::RedirectData::RedirectData(
349 PrefetchKeyType i_key_type,
350 const std::string& i_primary_key)
351 : key_type(i_key_type),
352 primary_key(i_primary_key) {}
353
354 ResourcePrefetchPredictorTables::RedirectData::RedirectData(
355 const RedirectData& other)
356 : key_type(other.key_type),
357 primary_key(other.primary_key),
358 last_visit(other.last_visit),
359 redirects(other.redirects) {}
360
361 ResourcePrefetchPredictorTables::RedirectData::~RedirectData() {
362 }
363
364 bool ResourcePrefetchPredictorTables::RedirectData::operator==(
365 const RedirectData& rhs) const {
366 return key_type == rhs.key_type && primary_key == rhs.primary_key &&
367 redirects == rhs.redirects;
368 }
369
234 void ResourcePrefetchPredictorTables::GetAllData( 370 void ResourcePrefetchPredictorTables::GetAllData(
235 PrefetchDataMap* url_data_map, 371 PrefetchDataMap* url_data_map,
236 PrefetchDataMap* host_data_map) { 372 PrefetchDataMap* host_data_map,
373 RedirectDataMap* url_redirect_data_map,
374 RedirectDataMap* host_redirect_data_map) {
237 DCHECK_CURRENTLY_ON(BrowserThread::DB); 375 DCHECK_CURRENTLY_ON(BrowserThread::DB);
238 if (CantAccessDatabase()) 376 if (CantAccessDatabase())
239 return; 377 return;
240 378
241 DCHECK(url_data_map); 379 DCHECK(url_data_map);
242 DCHECK(host_data_map); 380 DCHECK(host_data_map);
381 DCHECK(url_redirect_data_map);
382 DCHECK(host_redirect_data_map);
243 url_data_map->clear(); 383 url_data_map->clear();
244 host_data_map->clear(); 384 host_data_map->clear();
385 url_redirect_data_map->clear();
386 host_redirect_data_map->clear();
245 387
246 std::vector<std::string> urls_to_delete, hosts_to_delete; 388 std::vector<std::string> urls_to_delete, hosts_to_delete;
389 std::vector<std::string> url_redirects_to_delete, host_redirects_to_delete;
247 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); 390 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete);
248 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); 391 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete);
392 GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map,
393 &url_redirects_to_delete);
394 GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map,
395 &host_redirects_to_delete);
249 396
250 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) 397 if (!urls_to_delete.empty() || !hosts_to_delete.empty())
251 DeleteData(urls_to_delete, hosts_to_delete); 398 DeleteResourceData(urls_to_delete, hosts_to_delete);
399
400 if (!url_redirects_to_delete.empty() || !host_redirects_to_delete.empty())
401 DeleteRedirectData(url_redirects_to_delete, host_redirects_to_delete);
252 } 402 }
253 403
254 void ResourcePrefetchPredictorTables::UpdateData( 404 void ResourcePrefetchPredictorTables::UpdateData(
255 const PrefetchData& url_data, 405 const PrefetchData& url_data,
256 const PrefetchData& host_data) { 406 const PrefetchData& host_data,
407 const RedirectData& url_redirect_data,
408 const RedirectData& host_redirect_data) {
257 DCHECK_CURRENTLY_ON(BrowserThread::DB); 409 DCHECK_CURRENTLY_ON(BrowserThread::DB);
258 if (CantAccessDatabase()) 410 if (CantAccessDatabase())
259 return; 411 return;
260 412
261 DCHECK(!url_data.is_host() && host_data.is_host()); 413 DCHECK(!url_data.is_host() && host_data.is_host());
262 DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty()); 414 DCHECK(!url_redirect_data.is_host() && host_redirect_data.is_host());
415 DCHECK(!url_data.primary_key.empty() ||
416 !host_data.primary_key.empty() ||
417 !url_redirect_data.primary_key.empty() ||
418 !host_redirect_data.primary_key.empty());
263 419
264 DB()->BeginTransaction(); 420 DB()->BeginTransaction();
265 421
266 bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && 422 bool success =
267 (host_data.primary_key.empty() || UpdateDataHelper(host_data)); 423 (url_data.primary_key.empty() ||
424 UpdateDataHelper(url_data)) &&
425 (host_data.primary_key.empty() ||
426 UpdateDataHelper(host_data)) &&
427 (url_redirect_data.primary_key.empty() ||
428 UpdateDataHelper(url_redirect_data)) &&
429 (host_redirect_data.primary_key.empty() ||
430 UpdateDataHelper(host_redirect_data));
268 if (!success) 431 if (!success)
269 DB()->RollbackTransaction(); 432 DB()->RollbackTransaction();
270 433
271 DB()->CommitTransaction(); 434 DB()->CommitTransaction();
272 } 435 }
273 436
274 void ResourcePrefetchPredictorTables::DeleteData( 437 void ResourcePrefetchPredictorTables::DeleteResourceData(
275 const std::vector<std::string>& urls, 438 const std::vector<std::string>& urls,
276 const std::vector<std::string>& hosts) { 439 const std::vector<std::string>& hosts) {
277 DCHECK_CURRENTLY_ON(BrowserThread::DB); 440 DCHECK_CURRENTLY_ON(BrowserThread::DB);
441 if (CantAccessDatabase())
442 return;
443
444 DCHECK(!urls.empty() || !hosts.empty());
445
446 if (!urls.empty())
447 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_URL, urls);
448 if (!hosts.empty())
449 DeleteResourceDataHelper(PREFETCH_KEY_TYPE_HOST, hosts);
450 }
451
452 void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint(
453 const std::string& key,
454 PrefetchKeyType key_type) {
455 DCHECK_CURRENTLY_ON(BrowserThread::DB);
456 if (CantAccessDatabase())
457 return;
458
459 DeleteResourceDataHelper(key_type, std::vector<std::string>(1, key));
460 }
461
462 void ResourcePrefetchPredictorTables::DeleteRedirectData(
463 const std::vector<std::string>& urls,
464 const std::vector<std::string>& hosts) {
465 DCHECK_CURRENTLY_ON(BrowserThread::DB);
278 if (CantAccessDatabase()) 466 if (CantAccessDatabase())
279 return; 467 return;
280 468
281 DCHECK(!urls.empty() || !hosts.empty()); 469 DCHECK(!urls.empty() || !hosts.empty());
282 470
283 if (!urls.empty()) 471 if (!urls.empty())
284 DeleteDataHelper(PREFETCH_KEY_TYPE_URL, urls); 472 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_URL, urls);
285 if (!hosts.empty()) 473 if (!hosts.empty())
286 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); 474 DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, hosts);
287 } 475 }
288 476
289 void ResourcePrefetchPredictorTables::DeleteSingleDataPoint( 477 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint(
290 const std::string& key, 478 const std::string& key,
291 PrefetchKeyType key_type) { 479 PrefetchKeyType key_type) {
292 DCHECK_CURRENTLY_ON(BrowserThread::DB); 480 DCHECK_CURRENTLY_ON(BrowserThread::DB);
293 if (CantAccessDatabase()) 481 if (CantAccessDatabase())
294 return; 482 return;
295 483
296 DeleteDataHelper(key_type, std::vector<std::string>(1, key)); 484 DeleteRedirectDataHelper(key_type, std::vector<std::string>(1, key));
mattcary 2016/09/14 15:37:08 wouldn't std::vector<std::string>{key} be a little
alexilin 2016/09/14 18:59:55 Actually, we could use just {key}. Or do we need m
mattcary 2016/09/15 09:04:34 {key} works even better. I'm still a little weak o
297 } 485 }
298 486
299 void ResourcePrefetchPredictorTables::DeleteAllData() { 487 void ResourcePrefetchPredictorTables::DeleteAllData() {
300 if (CantAccessDatabase()) 488 if (CantAccessDatabase())
301 return; 489 return;
302 490
303 Statement deleter; 491 Statement deleter;
304 for (const char* table_name : 492 for (const char* table_name :
305 {kUrlResourceTableName, kUrlMetadataTableName, kHostResourceTableName, 493 {kUrlResourceTableName, kUrlRedirectTableName,
306 kHostMetadataTableName}) { 494 kUrlResourceMetadataTableName, kUrlRedirectMetadataTableName,
495 kHostResourceTableName, kHostRedirectTableName,
496 kHostResourceMetadataTableName, kHostRedirectMetadataTableName}) {
307 deleter.Assign(DB()->GetUniqueStatement( 497 deleter.Assign(DB()->GetUniqueStatement(
308 base::StringPrintf("DELETE FROM %s", table_name).c_str())); 498 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
309 deleter.Run(); 499 deleter.Run();
310 } 500 }
311 } 501 }
312 502
313 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() 503 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables()
314 : PredictorTableBase() { 504 : PredictorTableBase() {
315 } 505 }
316 506
(...skipping 22 matching lines...) Expand all
339 } 529 }
340 it->second.resources.push_back(row); 530 it->second.resources.push_back(row);
341 } 531 }
342 532
343 // Sort each of the resource row vectors by score. 533 // Sort each of the resource row vectors by score.
344 for (auto& kv : *data_map) 534 for (auto& kv : *data_map)
345 SortResourceRows(&(kv.second.resources)); 535 SortResourceRows(&(kv.second.resources));
346 536
347 // Read the metadata and keep track of entries that have metadata, but no 537 // Read the metadata and keep track of entries that have metadata, but no
348 // resource entries, so they can be deleted. 538 // resource entries, so they can be deleted.
349 const char* metadata_table_name = is_host ? kHostMetadataTableName : 539 const char* metadata_table_name = is_host ? kHostResourceMetadataTableName :
350 kUrlMetadataTableName; 540 kUrlResourceMetadataTableName;
351 Statement metadata_reader(DB()->GetUniqueStatement( 541 Statement metadata_reader(DB()->GetUniqueStatement(
352 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); 542 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str()));
353 543
354 while (metadata_reader.Step()) { 544 while (metadata_reader.Step()) {
355 std::string primary_key = metadata_reader.ColumnString(0); 545 std::string primary_key = metadata_reader.ColumnString(0);
356 546
357 PrefetchDataMap::iterator it = data_map->find(primary_key); 547 PrefetchDataMap::iterator it = data_map->find(primary_key);
358 if (it != data_map->end()) { 548 if (it != data_map->end()) {
359 int64_t last_visit = metadata_reader.ColumnInt64(1); 549 int64_t last_visit = metadata_reader.ColumnInt64(1);
360 it->second.last_visit = base::Time::FromInternalValue(last_visit); 550 it->second.last_visit = base::Time::FromInternalValue(last_visit);
361 } else { 551 } else {
362 to_delete->push_back(primary_key); 552 to_delete->push_back(primary_key);
363 } 553 }
364 } 554 }
365 } 555 }
366 556
557 void ResourcePrefetchPredictorTables::GetAllDataHelper(
558 PrefetchKeyType key_type,
mattcary 2016/09/14 15:37:09 I think I'd prefer to rename the function rather t
alexilin 2016/09/14 18:59:55 Done.
559 RedirectDataMap* redirect_map,
560 std::vector<std::string>* to_delete) {
561 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
562
563 const char* redirect_table_name = is_host ? kHostRedirectTableName :
564 kUrlRedirectTableName;
565 Statement redirect_reader(DB()->GetUniqueStatement(
566 base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str()));
567
568 RedirectRow row;
569 std::string primary_key;
570 while (StepAndInitializeRedirectRow(&redirect_reader, &row, &primary_key)) {
571 RedirectDataMap::iterator it = redirect_map->find(primary_key);
572 if (it == redirect_map->end()) {
573 it = redirect_map->insert(std::make_pair(
574 primary_key, RedirectData(key_type, primary_key))).first;
575 }
576 it->second.redirects.push_back(row);
577 }
578
579 // Sort each of the redirect row vectors by score.
580 for (auto& kv : *redirect_map)
581 SortRedirectRows(&(kv.second.redirects));
582
583 // Read the metadata and keep track of entries that have metadata, but no
584 // redirect entries, so they can be deleted
585 const char* metadata_table_name = is_host ? kHostRedirectMetadataTableName :
586 kUrlRedirectMetadataTableName;
587 Statement metadata_reader(DB()->GetUniqueStatement(
588 base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str()));
589
590 while (metadata_reader.Step()) {
591 std::string primary_key = metadata_reader.ColumnString(0);
592
593 RedirectDataMap::iterator it = redirect_map->find(primary_key);
594 if (it != redirect_map->end()) {
595 int64_t last_visit = metadata_reader.ColumnInt64(1);
596 it->second.last_visit = base::Time::FromInternalValue(last_visit);
597 } else {
598 to_delete->push_back(primary_key);
599 }
600 }
601 }
602
367 bool ResourcePrefetchPredictorTables::UpdateDataHelper( 603 bool ResourcePrefetchPredictorTables::UpdateDataHelper(
368 const PrefetchData& data) { 604 const PrefetchData& data) {
369 DCHECK(!data.primary_key.empty()); 605 DCHECK(!data.primary_key.empty());
370 606
371 if (!StringsAreSmallerThanDBLimit(data)) { 607 if (!StringsAreSmallerThanDBLimit(data)) {
372 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); 608 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
373 return false; 609 return false;
374 } 610 }
375 611
376 // Delete the older data from both the tables. 612 // Delete the older data from both the tables.
377 std::unique_ptr<Statement> deleter(data.is_host() 613 std::unique_ptr<Statement> deleter(data.is_host()
378 ? GetHostResourceDeleteStatement() 614 ? GetHostResourceDeleteStatement()
379 : GetUrlResourceDeleteStatement()); 615 : GetUrlResourceDeleteStatement());
380 deleter->BindString(0, data.primary_key); 616 deleter->BindString(0, data.primary_key);
381 if (!deleter->Run()) 617 if (!deleter->Run())
382 return false; 618 return false;
383 619
384 deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : 620 deleter.reset(data.is_host() ? GetHostResourceMetadataDeleteStatement() :
385 GetUrlMetadataDeleteStatement()); 621 GetUrlResourceMetadataDeleteStatement());
386 deleter->BindString(0, data.primary_key); 622 deleter->BindString(0, data.primary_key);
387 if (!deleter->Run()) 623 if (!deleter->Run())
388 return false; 624 return false;
389 625
390 // Add the new data to the tables. 626 // Add the new data to the tables.
391 for (const ResourceRow& resource : data.resources) { 627 for (const ResourceRow& resource : data.resources) {
392 std::unique_ptr<Statement> resource_inserter( 628 std::unique_ptr<Statement> resource_inserter(
393 data.is_host() ? GetHostResourceUpdateStatement() 629 data.is_host() ? GetHostResourceUpdateStatement()
394 : GetUrlResourceUpdateStatement()); 630 : GetUrlResourceUpdateStatement());
395 BindResourceRowToStatement(resource, data.primary_key, 631 BindResourceRowToStatement(resource, data.primary_key,
396 resource_inserter.get()); 632 resource_inserter.get());
397 if (!resource_inserter->Run()) 633 if (!resource_inserter->Run())
398 return false; 634 return false;
399 } 635 }
400 636
401 std::unique_ptr<Statement> metadata_inserter( 637 std::unique_ptr<Statement> metadata_inserter(
402 data.is_host() ? GetHostMetadataUpdateStatement() 638 data.is_host() ? GetHostResourceMetadataUpdateStatement()
403 : GetUrlMetadataUpdateStatement()); 639 : GetUrlResourceMetadataUpdateStatement());
404 metadata_inserter->BindString(0, data.primary_key); 640 metadata_inserter->BindString(0, data.primary_key);
405 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); 641 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue());
406 if (!metadata_inserter->Run()) 642 if (!metadata_inserter->Run())
643 return false;
644
645 return true;
646 }
647
648 bool ResourcePrefetchPredictorTables::UpdateDataHelper(
649 const RedirectData& data) {
650 DCHECK(!data.primary_key.empty());
651
652 if (!StringsAreSmallerThanDBLimit(data)) {
653 UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true);
654 return false;
655 }
656
657 // Delete the older data from the table.
658 std::unique_ptr<Statement> deleter(data.is_host()
659 ? GetHostRedirectDeleteStatement()
660 : GetUrlRedirectDeleteStatement());
661 deleter->BindString(0, data.primary_key);
662 if (!deleter->Run())
663 return false;
664
665 deleter.reset(data.is_host() ? GetHostRedirectMetadataDeleteStatement() :
666 GetUrlRedirectMetadataDeleteStatement());
667 deleter->BindString(0, data.primary_key);
668 if (!deleter->Run())
669 return false;
670
671 // Add the new data to the table.
672 for (const RedirectRow& row : data.redirects) {
673 std::unique_ptr<Statement> row_inserter(
674 data.is_host() ? GetHostRedirectUpdateStatement()
675 : GetUrlRedirectUpdateStatement());
676 BindRedirectRowToStatement(row, data.primary_key, row_inserter.get());
677 if (!row_inserter->Run())
678 return false;
679 }
680
681 std::unique_ptr<Statement> metadata_inserter(
682 data.is_host() ? GetHostRedirectMetadataUpdateStatement()
683 : GetUrlRedirectMetadataUpdateStatement());
684 metadata_inserter->BindString(0, data.primary_key);
685 metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue());
686 if (!metadata_inserter->Run())
407 return false; 687 return false;
408 688
409 return true; 689 return true;
410 } 690 }
411 691
412 void ResourcePrefetchPredictorTables::DeleteDataHelper( 692 void ResourcePrefetchPredictorTables::DeleteResourceDataHelper(
413 PrefetchKeyType key_type, 693 PrefetchKeyType key_type,
414 const std::vector<std::string>& keys) { 694 const std::vector<std::string>& keys) {
415 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 695 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
416 696
417 for (const std::string& key : keys) { 697 for (const std::string& key : keys) {
418 std::unique_ptr<Statement> deleter(is_host 698 std::unique_ptr<Statement> deleter(is_host
419 ? GetHostResourceDeleteStatement() 699 ? GetHostResourceDeleteStatement()
420 : GetUrlResourceDeleteStatement()); 700 : GetUrlResourceDeleteStatement());
421 deleter->BindString(0, key); 701 deleter->BindString(0, key);
422 deleter->Run(); 702 deleter->Run();
423 703
424 deleter.reset(is_host ? GetHostMetadataDeleteStatement() : 704 deleter.reset(is_host ? GetHostResourceMetadataDeleteStatement() :
425 GetUrlMetadataDeleteStatement()); 705 GetUrlResourceMetadataDeleteStatement());
426 deleter->BindString(0, key); 706 deleter->BindString(0, key);
427 deleter->Run(); 707 deleter->Run();
428 } 708 }
709 }
710
711 void ResourcePrefetchPredictorTables::DeleteRedirectDataHelper(
712 PrefetchKeyType key_type,
713 const std::vector<std::string>& keys) {
714 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
715
716 for (const std::string& key : keys) {
717 std::unique_ptr<Statement> deleter(is_host
718 ? GetHostRedirectDeleteStatement()
719 : GetUrlRedirectDeleteStatement());
720 deleter->BindString(0, key);
721 deleter->Run();
722
723 deleter.reset(is_host ? GetHostRedirectMetadataDeleteStatement() :
724 GetUrlRedirectMetadataDeleteStatement());
725 deleter->BindString(0, key);
726 deleter->Run();
727 }
429 } 728 }
430 729
431 // static 730 // static
432 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( 731 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
433 const PrefetchData& data) { 732 const PrefetchData& data) {
434 if (data.primary_key.length() > kMaxStringLength) 733 if (data.primary_key.length() > kMaxStringLength)
435 return false; 734 return false;
436 735
437 for (const ResourceRow& row : data.resources) { 736 for (const ResourceRow& row : data.resources) {
438 if (row.resource_url.spec().length() > kMaxStringLength) 737 if (row.resource_url.spec().length() > kMaxStringLength)
439 return false; 738 return false;
440 } 739 }
441 return true; 740 return true;
442 } 741 }
443 742
444 // static 743 // static
744 bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
745 const RedirectData& data) {
746 if (data.primary_key.length() > kMaxStringLength)
747 return false;
748
749 for (const RedirectRow& row : data.redirects) {
750 if (row.final_redirect.length() > kMaxStringLength)
751 return false;
752 }
753 return true;
754 }
755
756 // static
445 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( 757 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
446 sql::Connection* db) { 758 sql::Connection* db) {
447 int version = GetDatabaseVersion(db); 759 int version = GetDatabaseVersion(db);
448 bool success = true; 760 bool success = true;
449 // Too new is also a problem. 761 // Too new is also a problem.
450 bool incompatible_version = version != kDatabaseVersion; 762 bool incompatible_version = version != kDatabaseVersion;
451 763
452 if (incompatible_version) { 764 if (incompatible_version) {
453 for (const char* table_name : 765 for (const char* table_name :
454 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, 766 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName,
455 kUrlMetadataTableName, kHostMetadataTableName}) { 767 kUrlRedirectTableName, kHostRedirectTableName,
768 kUrlResourceMetadataTableName, kHostResourceMetadataTableName,
769 kUrlRedirectMetadataTableName, kHostRedirectMetadataTableName}) {
456 success = 770 success =
457 success && 771 success &&
458 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) 772 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name)
459 .c_str()); 773 .c_str());
460 } 774 }
461 } 775 }
462 776
463 if (incompatible_version) { 777 if (incompatible_version) {
464 success = 778 success =
465 success && 779 success &&
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 bool success = transaction.Begin(); 822 bool success = transaction.Begin();
509 823
510 success = success && DropTablesIfOutdated(db); 824 success = success && DropTablesIfOutdated(db);
511 825
512 success = 826 success =
513 success && 827 success &&
514 (db->DoesTableExist(kUrlResourceTableName) || 828 (db->DoesTableExist(kUrlResourceTableName) ||
515 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 829 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
516 kUrlResourceTableName) 830 kUrlResourceTableName)
517 .c_str())) && 831 .c_str())) &&
518 (db->DoesTableExist(kUrlMetadataTableName) || 832 (db->DoesTableExist(kUrlRedirectTableName) ||
833 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
834 kUrlRedirectTableName)
835 .c_str())) &&
836 (db->DoesTableExist(kUrlResourceMetadataTableName) ||
519 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, 837 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
520 kUrlMetadataTableName) 838 kUrlResourceMetadataTableName)
839 .c_str())) &&
840 (db->DoesTableExist(kUrlRedirectMetadataTableName) ||
841 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
842 kUrlRedirectMetadataTableName)
521 .c_str())) && 843 .c_str())) &&
522 (db->DoesTableExist(kHostResourceTableName) || 844 (db->DoesTableExist(kHostResourceTableName) ||
523 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, 845 db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate,
524 kHostResourceTableName) 846 kHostResourceTableName)
525 .c_str())) && 847 .c_str())) &&
526 (db->DoesTableExist(kHostMetadataTableName) || 848 (db->DoesTableExist(kHostRedirectTableName) ||
849 db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate,
850 kHostRedirectTableName)
851 .c_str())) &&
852 (db->DoesTableExist(kHostResourceMetadataTableName) ||
527 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, 853 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
528 kHostMetadataTableName) 854 kHostResourceMetadataTableName)
855 .c_str()));
856 (db->DoesTableExist(kHostRedirectMetadataTableName) ||
857 db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate,
858 kHostRedirectMetadataTableName)
529 .c_str())); 859 .c_str()));
530 860
531 if (success) 861 if (success)
532 success = transaction.Commit(); 862 success = transaction.Commit();
533 else 863 else
534 transaction.Rollback(); 864 transaction.Rollback();
535 865
536 if (!success) 866 if (!success)
537 ResetDB(); 867 ResetDB();
538 } 868 }
539 869
540 void ResourcePrefetchPredictorTables::LogDatabaseStats() { 870 void ResourcePrefetchPredictorTables::LogDatabaseStats() {
541 DCHECK_CURRENTLY_ON(BrowserThread::DB); 871 DCHECK_CURRENTLY_ON(BrowserThread::DB);
542 if (CantAccessDatabase()) 872 if (CantAccessDatabase())
543 return; 873 return;
544 874
545 Statement statement(DB()->GetUniqueStatement( 875 Statement statement(DB()->GetUniqueStatement(
546 base::StringPrintf("SELECT count(*) FROM %s", 876 base::StringPrintf("SELECT count(*) FROM %s",
547 kUrlResourceTableName).c_str())); 877 kUrlResourceTableName).c_str()));
548 if (statement.Step()) 878 if (statement.Step())
549 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", 879 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount",
550 statement.ColumnInt(0)); 880 statement.ColumnInt(0));
551 881
552 statement.Assign(DB()->GetUniqueStatement( 882 statement.Assign(DB()->GetUniqueStatement(
553 base::StringPrintf("SELECT count(*) FROM %s", 883 base::StringPrintf("SELECT count(*) FROM %s",
554 kHostResourceTableName).c_str())); 884 kHostResourceTableName).c_str()));
555 if (statement.Step()) 885 if (statement.Step())
556 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", 886 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount",
557 statement.ColumnInt(0)); 887 statement.ColumnInt(0));
888
889 statement.Assign(DB()->GetUniqueStatement(
890 base::StringPrintf("SELECT count(*) FROM %s",
891 kUrlRedirectTableName).c_str()));
892 if (statement.Step())
893 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlRedirectTableRowCount",
894 statement.ColumnInt(0));
895
896 statement.Assign(DB()->GetUniqueStatement(
897 base::StringPrintf("SELECT count(*) FROM %s",
898 kHostRedirectTableName).c_str()));
899 if (statement.Step())
900 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostRedirectTableRowCount",
901 statement.ColumnInt(0));
558 } 902 }
559 903
560 Statement* 904 Statement*
561 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { 905 ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() {
562 return new Statement(DB()->GetCachedStatement( 906 return new Statement(DB()->GetCachedStatement(
563 SQL_FROM_HERE, 907 SQL_FROM_HERE,
564 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName) 908 base::StringPrintf(kDeleteStatementTemplate, kUrlResourceTableName)
565 .c_str())); 909 .c_str()));
566 } 910 }
567 911
568 Statement* 912 Statement*
569 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { 913 ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() {
570 return new Statement(DB()->GetCachedStatement( 914 return new Statement(DB()->GetCachedStatement(
571 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, 915 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate,
572 kUrlResourceTableName) 916 kUrlResourceTableName)
573 .c_str())); 917 .c_str()));
574 } 918 }
575 919
576 Statement* 920 Statement*
577 ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { 921 ResourcePrefetchPredictorTables::GetUrlResourceMetadataDeleteStatement() {
578 return new Statement(DB()->GetCachedStatement( 922 return new Statement(DB()->GetCachedStatement(
579 SQL_FROM_HERE, 923 SQL_FROM_HERE,
580 base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName) 924 base::StringPrintf(kDeleteStatementTemplate,
925 kUrlResourceMetadataTableName)
581 .c_str())); 926 .c_str()));
582 } 927 }
583 928
584 Statement* 929 Statement*
585 ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { 930 ResourcePrefetchPredictorTables::GetUrlResourceMetadataUpdateStatement() {
586 return new Statement(DB()->GetCachedStatement( 931 return new Statement(DB()->GetCachedStatement(
587 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, 932 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
588 kUrlMetadataTableName) 933 kUrlResourceMetadataTableName)
589 .c_str())); 934 .c_str()));
590 } 935 }
591 936
937 Statement*
938 ResourcePrefetchPredictorTables::GetUrlRedirectDeleteStatement() {
939 return new Statement(DB()->GetCachedStatement(
940 SQL_FROM_HERE,
941 base::StringPrintf(kDeleteStatementTemplate, kUrlRedirectTableName)
942 .c_str()));
943 }
944
945 Statement*
946 ResourcePrefetchPredictorTables::GetUrlRedirectUpdateStatement() {
947 return new Statement(DB()->GetCachedStatement(
948 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate,
949 kUrlRedirectTableName)
950 .c_str()));
951 }
952
953 Statement*
954 ResourcePrefetchPredictorTables::GetUrlRedirectMetadataDeleteStatement() {
955 return new Statement(DB()->GetCachedStatement(
956 SQL_FROM_HERE,
957 base::StringPrintf(kDeleteStatementTemplate,
958 kUrlRedirectMetadataTableName)
959 .c_str()));
960 }
961
962 Statement*
963 ResourcePrefetchPredictorTables::GetUrlRedirectMetadataUpdateStatement() {
964 return new Statement(DB()->GetCachedStatement(
965 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
966 kUrlRedirectMetadataTableName)
967 .c_str()));
968 }
969
592 Statement* 970 Statement*
593 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { 971 ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() {
594 return new Statement(DB()->GetCachedStatement( 972 return new Statement(DB()->GetCachedStatement(
595 SQL_FROM_HERE, 973 SQL_FROM_HERE,
596 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName) 974 base::StringPrintf(kDeleteStatementTemplate, kHostResourceTableName)
597 .c_str())); 975 .c_str()));
598 } 976 }
599 977
600 Statement* 978 Statement*
601 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { 979 ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() {
602 return new Statement(DB()->GetCachedStatement( 980 return new Statement(DB()->GetCachedStatement(
603 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate, 981 SQL_FROM_HERE, base::StringPrintf(kInsertResourceTableStatementTemplate,
604 kHostResourceTableName) 982 kHostResourceTableName)
605 .c_str())); 983 .c_str()));
606 } 984 }
607 985
608 Statement* 986 Statement*
609 ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { 987 ResourcePrefetchPredictorTables::GetHostResourceMetadataDeleteStatement() {
610 return new Statement(DB()->GetCachedStatement( 988 return new Statement(DB()->GetCachedStatement(
611 SQL_FROM_HERE, 989 SQL_FROM_HERE, base::StringPrintf(kDeleteStatementTemplate,
612 base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName) 990 kHostResourceMetadataTableName)
613 .c_str())); 991 .c_str()));
614 } 992 }
615 993
616 Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { 994 Statement*
995 ResourcePrefetchPredictorTables::GetHostResourceMetadataUpdateStatement() {
617 return new Statement(DB()->GetCachedStatement( 996 return new Statement(DB()->GetCachedStatement(
618 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, 997 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
619 kHostMetadataTableName) 998 kHostResourceMetadataTableName)
620 .c_str())); 999 .c_str()));
621 } 1000 }
622 1001
1002 Statement*
1003 ResourcePrefetchPredictorTables::GetHostRedirectDeleteStatement() {
1004 return new Statement(DB()->GetCachedStatement(
1005 SQL_FROM_HERE,
1006 base::StringPrintf(kDeleteStatementTemplate, kHostRedirectTableName)
1007 .c_str()));
1008 }
1009
1010 Statement*
1011 ResourcePrefetchPredictorTables::GetHostRedirectUpdateStatement() {
1012 return new Statement(DB()->GetCachedStatement(
1013 SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate,
1014 kHostRedirectTableName)
1015 .c_str()));
1016 }
1017
1018 Statement*
1019 ResourcePrefetchPredictorTables::GetHostRedirectMetadataDeleteStatement() {
1020 return new Statement(DB()->GetCachedStatement(
1021 SQL_FROM_HERE, base::StringPrintf(kDeleteStatementTemplate,
1022 kHostRedirectMetadataTableName)
1023 .c_str()));
1024 }
1025
1026 Statement*
1027 ResourcePrefetchPredictorTables::GetHostRedirectMetadataUpdateStatement() {
1028 return new Statement(DB()->GetCachedStatement(
1029 SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate,
1030 kHostRedirectMetadataTableName)
1031 .c_str()));
1032 }
1033
623 } // namespace predictors 1034 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698