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

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

Issue 2796783004: predictors: Add origin learning. (Closed)
Patch Set: , Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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 <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "sql/statement.h" 15 #include "sql/statement.h"
16 16
17 using google::protobuf::MessageLite; 17 using google::protobuf::MessageLite;
18 18
19 namespace { 19 namespace {
20 20
21 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; 21 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
22 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 22 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url";
23 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; 23 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
24 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 24 const char kHostResourceTableName[] = "resource_prefetch_predictor_host";
25 const char kHostRedirectTableName[] = 25 const char kHostRedirectTableName[] =
26 "resource_prefetch_predictor_host_redirect"; 26 "resource_prefetch_predictor_host_redirect";
27 const char kManifestTableName[] = "resource_prefetch_predictor_manifest"; 27 const char kManifestTableName[] = "resource_prefetch_predictor_manifest";
28 const char kOriginTableName[] = "resource_prefetch_predictor_origin";
28 29
29 const char kCreateGlobalMetadataStatementTemplate[] = 30 const char kCreateGlobalMetadataStatementTemplate[] =
30 "CREATE TABLE %s ( " 31 "CREATE TABLE %s ( "
31 "key TEXT, value INTEGER, " 32 "key TEXT, value INTEGER, "
32 "PRIMARY KEY (key))"; 33 "PRIMARY KEY (key))";
33 const char kCreateProtoTableStatementTemplate[] = 34 const char kCreateProtoTableStatementTemplate[] =
34 "CREATE TABLE %s ( " 35 "CREATE TABLE %s ( "
35 "key TEXT, " 36 "key TEXT, "
36 "proto BLOB, " 37 "proto BLOB, "
37 "PRIMARY KEY(key))"; 38 "PRIMARY KEY(key))";
38 const char kInsertProtoTableStatementTemplate[] = 39 const char kInsertProtoStatementTemplate[] =
39 "INSERT INTO %s (key, proto) VALUES (?,?)"; 40 "INSERT INTO %s (key, proto) VALUES (?,?)";
40 const char kDeleteProtoTableStatementTemplate[] = "DELETE FROM %s WHERE key=?"; 41 const char kDeleteProtoStatementTemplate[] = "DELETE FROM %s WHERE key=?";
42 const char kSelectAllStatementTemplate[] = "SELECT * FROM %s";
41 43
42 void BindProtoDataToStatement(const std::string& key, 44 void BindProtoDataToStatement(const std::string& key,
43 const MessageLite& data, 45 const MessageLite& data,
44 sql::Statement* statement) { 46 sql::Statement* statement) {
45 int size = data.ByteSize(); 47 int size = data.ByteSize();
46 DCHECK_GT(size, 0); 48 DCHECK_GT(size, 0);
47 std::vector<char> proto_buffer(size); 49 std::vector<char> proto_buffer(size);
48 data.SerializeToArray(&proto_buffer[0], size); 50 data.SerializeToArray(&proto_buffer[0], size);
49 51
50 statement->BindString(0, key); 52 statement->BindString(0, key);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 auto new_end = 104 auto new_end =
103 std::remove_if(data->mutable_redirect_endpoints()->begin(), 105 std::remove_if(data->mutable_redirect_endpoints()->begin(),
104 data->mutable_redirect_endpoints()->end(), 106 data->mutable_redirect_endpoints()->end(),
105 [max_consecutive_misses](const RedirectStat& x) { 107 [max_consecutive_misses](const RedirectStat& x) {
106 return x.consecutive_misses() >= max_consecutive_misses; 108 return x.consecutive_misses() >= max_consecutive_misses;
107 }); 109 });
108 data->mutable_redirect_endpoints()->erase( 110 data->mutable_redirect_endpoints()->erase(
109 new_end, data->mutable_redirect_endpoints()->end()); 111 new_end, data->mutable_redirect_endpoints()->end());
110 } 112 }
111 113
114 // static
115 void ResourcePrefetchPredictorTables::TrimOrigins(
116 OriginData* data,
117 size_t max_consecutive_misses) {
118 auto* origins = data->mutable_origins();
119 auto new_end = std::remove_if(
120 origins->begin(), origins->end(), [=](const OriginStat& x) {
121 return x.consecutive_misses() >= max_consecutive_misses;
122 });
123 origins->erase(new_end, origins->end());
124 }
125
126 // static
127 void ResourcePrefetchPredictorTables::SortOrigins(OriginData* data) {
128 std::sort(data->mutable_origins()->begin(), data->mutable_origins()->end(),
129 [](const OriginStat& x, const OriginStat& y) {
130 // Decreasing score ordering.
131 return ComputeOriginScore(x) > ComputeOriginScore(y);
132 });
133 }
134
112 void ResourcePrefetchPredictorTables::GetAllData( 135 void ResourcePrefetchPredictorTables::GetAllData(
113 PrefetchDataMap* url_data_map, 136 PrefetchDataMap* url_data_map,
114 PrefetchDataMap* host_data_map, 137 PrefetchDataMap* host_data_map,
115 RedirectDataMap* url_redirect_data_map, 138 RedirectDataMap* url_redirect_data_map,
116 RedirectDataMap* host_redirect_data_map, 139 RedirectDataMap* host_redirect_data_map,
117 ManifestDataMap* manifest_map) { 140 ManifestDataMap* manifest_map,
141 OriginDataMap* origin_data_map) {
118 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::GetAllData"); 142 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::GetAllData");
119 DCHECK_CURRENTLY_ON(BrowserThread::DB); 143 DCHECK_CURRENTLY_ON(BrowserThread::DB);
120 if (CantAccessDatabase()) 144 if (CantAccessDatabase())
121 return; 145 return;
122 146
123 DCHECK(url_data_map); 147 DCHECK(url_data_map);
124 DCHECK(host_data_map); 148 DCHECK(host_data_map);
125 DCHECK(url_redirect_data_map); 149 DCHECK(url_redirect_data_map);
126 DCHECK(host_redirect_data_map); 150 DCHECK(host_redirect_data_map);
151 DCHECK(manifest_map);
152 DCHECK(origin_data_map);
127 url_data_map->clear(); 153 url_data_map->clear();
128 host_data_map->clear(); 154 host_data_map->clear();
129 url_redirect_data_map->clear(); 155 url_redirect_data_map->clear();
130 host_redirect_data_map->clear(); 156 host_redirect_data_map->clear();
131 manifest_map->clear(); 157 manifest_map->clear();
158 origin_data_map->clear();
132 159
133 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); 160 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map);
134 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); 161 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map);
135 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); 162 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map);
136 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); 163 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map);
137 GetAllManifestDataHelper(manifest_map); 164 GetAllManifestDataHelper(manifest_map);
165 GetAllOriginDataHelper(origin_data_map);
138 } 166 }
139 167
140 void ResourcePrefetchPredictorTables::UpdateData( 168 void ResourcePrefetchPredictorTables::UpdateData(
141 const PrefetchData& url_data, 169 const PrefetchData& url_data,
142 const PrefetchData& host_data, 170 const PrefetchData& host_data,
143 const RedirectData& url_redirect_data, 171 const RedirectData& url_redirect_data,
144 const RedirectData& host_redirect_data) { 172 const RedirectData& host_redirect_data) {
145 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateData"); 173 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateData");
146 DCHECK_CURRENTLY_ON(BrowserThread::DB); 174 DCHECK_CURRENTLY_ON(BrowserThread::DB);
147 if (CantAccessDatabase()) 175 if (CantAccessDatabase())
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 DB()->BeginTransaction(); 210 DB()->BeginTransaction();
183 bool success = UpdateDataHelper( 211 bool success = UpdateDataHelper(
184 PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, manifest_data); 212 PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, manifest_data);
185 213
186 if (!success) 214 if (!success)
187 DB()->RollbackTransaction(); 215 DB()->RollbackTransaction();
188 else 216 else
189 DB()->CommitTransaction(); 217 DB()->CommitTransaction();
190 } 218 }
191 219
220 void ResourcePrefetchPredictorTables::UpdateOriginData(
221 const OriginData& origin_data) {
222 DCHECK_CURRENTLY_ON(BrowserThread::DB);
223 if (CantAccessDatabase())
224 return;
225
226 std::string host = origin_data.host();
227 DB()->BeginTransaction();
228 bool success = UpdateDataHelper(PREFETCH_KEY_TYPE_HOST,
229 PrefetchDataType::ORIGIN, host, origin_data);
230
231 if (!success)
232 DB()->RollbackTransaction();
233 else
234 DB()->CommitTransaction();
235 }
236
192 void ResourcePrefetchPredictorTables::DeleteResourceData( 237 void ResourcePrefetchPredictorTables::DeleteResourceData(
193 const std::vector<std::string>& urls, 238 const std::vector<std::string>& urls,
194 const std::vector<std::string>& hosts) { 239 const std::vector<std::string>& hosts) {
195 DCHECK_CURRENTLY_ON(BrowserThread::DB); 240 DCHECK_CURRENTLY_ON(BrowserThread::DB);
196 if (CantAccessDatabase()) 241 if (CantAccessDatabase())
197 return; 242 return;
198 243
199 DCHECK(!urls.empty() || !hosts.empty()); 244 DCHECK(!urls.empty() || !hosts.empty());
200 245
201 if (!urls.empty()) 246 if (!urls.empty())
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 286
242 void ResourcePrefetchPredictorTables::DeleteManifestData( 287 void ResourcePrefetchPredictorTables::DeleteManifestData(
243 const std::vector<std::string>& hosts) { 288 const std::vector<std::string>& hosts) {
244 DCHECK_CURRENTLY_ON(BrowserThread::DB); 289 DCHECK_CURRENTLY_ON(BrowserThread::DB);
245 if (CantAccessDatabase()) 290 if (CantAccessDatabase())
246 return; 291 return;
247 292
248 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, hosts); 293 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, hosts);
249 } 294 }
250 295
296 void ResourcePrefetchPredictorTables::DeleteOriginData(
297 const std::vector<std::string>& hosts) {
298 DCHECK_CURRENTLY_ON(BrowserThread::DB);
299 if (CantAccessDatabase())
300 return;
301
302 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN, hosts);
303 }
304
251 void ResourcePrefetchPredictorTables::DeleteAllData() { 305 void ResourcePrefetchPredictorTables::DeleteAllData() {
252 DCHECK_CURRENTLY_ON(BrowserThread::DB); 306 DCHECK_CURRENTLY_ON(BrowserThread::DB);
253 if (CantAccessDatabase()) 307 if (CantAccessDatabase())
254 return; 308 return;
255 309
256 sql::Statement deleter; 310 sql::Statement deleter;
257 for (const char* table_name : 311 for (const char* table_name :
258 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName, 312 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName,
259 kHostRedirectTableName, kManifestTableName}) { 313 kHostRedirectTableName, kManifestTableName}) {
260 deleter.Assign(DB()->GetUniqueStatement( 314 deleter.Assign(DB()->GetUniqueStatement(
261 base::StringPrintf("DELETE FROM %s", table_name).c_str())); 315 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
262 deleter.Run(); 316 deleter.Run();
263 } 317 }
264 } 318 }
265 319
266 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() {} 320 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() {}
267 321
268 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {} 322 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {}
269 323
270 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( 324 void ResourcePrefetchPredictorTables::GetAllResourceDataHelper(
271 PrefetchKeyType key_type, 325 PrefetchKeyType key_type,
272 PrefetchDataMap* data_map) { 326 PrefetchDataMap* data_map) {
273 // Read the resources table and organize it per primary key. 327 // Read the resources table and organize it per primary key.
274 const char* table_name = GetTableName(key_type, PrefetchDataType::RESOURCE); 328 const char* table_name = GetTableName(key_type, PrefetchDataType::RESOURCE);
275 sql::Statement resource_reader(DB()->GetUniqueStatement( 329 sql::Statement resource_reader(DB()->GetUniqueStatement(
276 base::StringPrintf("SELECT * FROM %s", table_name).c_str())); 330 base::StringPrintf(kSelectAllStatementTemplate, table_name).c_str()));
277 331
278 PrefetchData data; 332 PrefetchData data;
279 std::string key; 333 std::string key;
280 while (StepAndInitializeProtoData(&resource_reader, &key, &data)) { 334 while (StepAndInitializeProtoData(&resource_reader, &key, &data)) {
281 data_map->insert(std::make_pair(key, data)); 335 data_map->insert(std::make_pair(key, data));
282 DCHECK_EQ(data.primary_key(), key); 336 DCHECK_EQ(data.primary_key(), key);
283 } 337 }
284 338
285 // Sort each of the resource vectors by score. 339 // Sort each of the resource vectors by score.
286 for (auto& kv : *data_map) { 340 for (auto& kv : *data_map) {
287 SortResources(&(kv.second)); 341 SortResources(&(kv.second));
288 } 342 }
289 } 343 }
290 344
291 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( 345 void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper(
292 PrefetchKeyType key_type, 346 PrefetchKeyType key_type,
293 RedirectDataMap* data_map) { 347 RedirectDataMap* data_map) {
294 // Read the redirects table and organize it per primary key. 348 // Read the redirects table and organize it per primary key.
295 const char* table_name = GetTableName(key_type, PrefetchDataType::REDIRECT); 349 const char* table_name = GetTableName(key_type, PrefetchDataType::REDIRECT);
296 sql::Statement redirect_reader(DB()->GetUniqueStatement( 350 sql::Statement redirect_reader(DB()->GetUniqueStatement(
297 base::StringPrintf("SELECT * FROM %s", table_name).c_str())); 351 base::StringPrintf(kSelectAllStatementTemplate, table_name).c_str()));
298 352
299 RedirectData data; 353 RedirectData data;
300 std::string key; 354 std::string key;
301 while (StepAndInitializeProtoData(&redirect_reader, &key, &data)) { 355 while (StepAndInitializeProtoData(&redirect_reader, &key, &data)) {
302 data_map->insert(std::make_pair(key, data)); 356 data_map->insert(std::make_pair(key, data));
303 DCHECK_EQ(data.primary_key(), key); 357 DCHECK_EQ(data.primary_key(), key);
304 } 358 }
305 } 359 }
306 360
307 void ResourcePrefetchPredictorTables::GetAllManifestDataHelper( 361 void ResourcePrefetchPredictorTables::GetAllManifestDataHelper(
308 ManifestDataMap* manifest_map) { 362 ManifestDataMap* manifest_map) {
309 sql::Statement manifest_reader(DB()->GetUniqueStatement( 363 sql::Statement manifest_reader(DB()->GetUniqueStatement(
310 base::StringPrintf("SELECT * FROM %s", kManifestTableName).c_str())); 364 base::StringPrintf(kSelectAllStatementTemplate, kManifestTableName)
365 .c_str()));
311 366
312 precache::PrecacheManifest data; 367 precache::PrecacheManifest data;
313 std::string key; 368 std::string key;
314 while (StepAndInitializeProtoData(&manifest_reader, &key, &data)) { 369 while (StepAndInitializeProtoData(&manifest_reader, &key, &data)) {
315 manifest_map->insert(std::make_pair(key, data)); 370 manifest_map->insert(std::make_pair(key, data));
316 } 371 }
317 } 372 }
318 373
374 void ResourcePrefetchPredictorTables::GetAllOriginDataHelper(
375 OriginDataMap* origin_map) {
376 sql::Statement reader(DB()->GetUniqueStatement(
377 base::StringPrintf(kSelectAllStatementTemplate, kOriginTableName)
378 .c_str()));
379
380 OriginData data;
381 std::string key;
382 while (StepAndInitializeProtoData(&reader, &key, &data)) {
383 origin_map->insert({key, data});
384 DCHECK_EQ(data.host(), key);
385 }
386 }
387
319 bool ResourcePrefetchPredictorTables::UpdateDataHelper( 388 bool ResourcePrefetchPredictorTables::UpdateDataHelper(
320 PrefetchKeyType key_type, 389 PrefetchKeyType key_type,
321 PrefetchDataType data_type, 390 PrefetchDataType data_type,
322 const std::string& key, 391 const std::string& key,
323 const MessageLite& data) { 392 const MessageLite& data) {
324 // Delete the older data from the table. 393 // Delete the older data from the table.
325 std::unique_ptr<sql::Statement> deleter( 394 std::unique_ptr<sql::Statement> deleter(
326 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); 395 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE));
327 deleter->BindString(0, key); 396 deleter->BindString(0, key);
328 if (!deleter->Run()) 397 if (!deleter->Run())
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 default: 454 default:
386 type_multiplier = 1; 455 type_multiplier = 1;
387 } 456 }
388 457
389 constexpr int kMaxResourcesPerType = 100; 458 constexpr int kMaxResourcesPerType = 100;
390 return kMaxResourcesPerType * 459 return kMaxResourcesPerType *
391 (priority_multiplier * 100 + type_multiplier * 10) - 460 (priority_multiplier * 100 + type_multiplier * 10) -
392 data.average_position(); 461 data.average_position();
393 } 462 }
394 463
464 float ResourcePrefetchPredictorTables::ComputeOriginScore(
465 const OriginStat& origin) {
466 // The ranking is done by considering, in this order:
467 // 1. High confidence resources (>75% and more than 10 hits)
468 // 2. Mandatory network access
469 // 3. Network accessed
470 // 4. Average position (decreasing)
471 float score = 0;
472 float confidence = static_cast<float>(origin.number_of_hits()) /
473 (origin.number_of_hits() + origin.number_of_misses());
474
475 bool is_high_confidence = confidence > .75 && origin.number_of_hits() > 10;
476 score += is_high_confidence * 1e6;
477
478 score += origin.always_access_network() * 1e4;
479 score += origin.accessed_network() * 1e2;
480 score += 1e2 - origin.average_position();
481
482 return score;
483 }
484
395 // static 485 // static
396 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( 486 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
397 sql::Connection* db) { 487 sql::Connection* db) {
398 int version = GetDatabaseVersion(db); 488 int version = GetDatabaseVersion(db);
399 bool success = true; 489 bool success = true;
400 // Too new is also a problem. 490 // Too new is also a problem.
401 bool incompatible_version = version != kDatabaseVersion; 491 bool incompatible_version = version != kDatabaseVersion;
402 492
403 // These are deprecated tables but they still have to be removed if present. 493 // These are deprecated tables but they still have to be removed if present.
404 static const char kUrlMetadataTableName[] = 494 static const char kUrlMetadataTableName[] =
405 "resource_prefetch_predictor_url_metadata"; 495 "resource_prefetch_predictor_url_metadata";
406 static const char kHostMetadataTableName[] = 496 static const char kHostMetadataTableName[] =
407 "resource_prefetch_predictor_host_metadata"; 497 "resource_prefetch_predictor_host_metadata";
408 498
409 if (incompatible_version) { 499 if (incompatible_version) {
410 for (const char* table_name : 500 for (const char* table_name :
411 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, 501 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName,
412 kUrlRedirectTableName, kHostRedirectTableName, kManifestTableName, 502 kUrlRedirectTableName, kHostRedirectTableName, kManifestTableName,
413 kUrlMetadataTableName, kHostMetadataTableName}) { 503 kUrlMetadataTableName, kHostMetadataTableName, kOriginTableName}) {
414 success = 504 success =
415 success && 505 success &&
416 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) 506 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name)
417 .c_str()); 507 .c_str());
418 } 508 }
419 } 509 }
420 510
421 if (incompatible_version) { 511 if (incompatible_version) {
422 success = 512 success =
423 success && 513 success &&
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 if (CantAccessDatabase()) 550 if (CantAccessDatabase())
461 return; 551 return;
462 552
463 // Database initialization is all-or-nothing. 553 // Database initialization is all-or-nothing.
464 sql::Connection* db = DB(); 554 sql::Connection* db = DB();
465 bool success = db->BeginTransaction(); 555 bool success = db->BeginTransaction();
466 success = success && DropTablesIfOutdated(db); 556 success = success && DropTablesIfOutdated(db);
467 557
468 for (const char* table_name : 558 for (const char* table_name :
469 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName, 559 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName,
470 kHostRedirectTableName, kManifestTableName}) { 560 kHostRedirectTableName, kManifestTableName, kOriginTableName}) {
471 success = success && 561 success = success &&
472 (db->DoesTableExist(table_name) || 562 (db->DoesTableExist(table_name) ||
473 db->Execute(base::StringPrintf( 563 db->Execute(base::StringPrintf(
474 kCreateProtoTableStatementTemplate, table_name) 564 kCreateProtoTableStatementTemplate, table_name)
475 .c_str())); 565 .c_str()));
476 } 566 }
477 567
478 if (success) 568 if (success)
479 success = db->CommitTransaction(); 569 success = db->CommitTransaction();
480 else 570 else
(...skipping 23 matching lines...) Expand all
504 statement.ColumnInt(0)); 594 statement.ColumnInt(0));
505 } 595 }
506 596
507 std::unique_ptr<sql::Statement> 597 std::unique_ptr<sql::Statement>
508 ResourcePrefetchPredictorTables::GetTableUpdateStatement( 598 ResourcePrefetchPredictorTables::GetTableUpdateStatement(
509 PrefetchKeyType key_type, 599 PrefetchKeyType key_type,
510 PrefetchDataType data_type, 600 PrefetchDataType data_type,
511 TableOperationType op_type) { 601 TableOperationType op_type) {
512 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | 602 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) |
513 (static_cast<int>(op_type) << 3)); 603 (static_cast<int>(op_type) << 3));
514 const char* statement_template = (op_type == TableOperationType::REMOVE 604 const char* statement_template =
515 ? kDeleteProtoTableStatementTemplate 605 (op_type == TableOperationType::REMOVE ? kDeleteProtoStatementTemplate
516 : kInsertProtoTableStatementTemplate); 606 : kInsertProtoStatementTemplate);
517 const char* table_name = GetTableName(key_type, data_type); 607 const char* table_name = GetTableName(key_type, data_type);
518 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement( 608 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement(
519 id, base::StringPrintf(statement_template, table_name).c_str())); 609 id, base::StringPrintf(statement_template, table_name).c_str()));
520 } 610 }
521 611
522 // static 612 // static
523 const char* ResourcePrefetchPredictorTables::GetTableName( 613 const char* ResourcePrefetchPredictorTables::GetTableName(
524 PrefetchKeyType key_type, 614 PrefetchKeyType key_type,
525 PrefetchDataType data_type) { 615 PrefetchDataType data_type) {
526 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 616 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
527 switch (data_type) { 617 switch (data_type) {
528 case PrefetchDataType::RESOURCE: 618 case PrefetchDataType::RESOURCE:
529 return is_host ? kHostResourceTableName : kUrlResourceTableName; 619 return is_host ? kHostResourceTableName : kUrlResourceTableName;
530 case PrefetchDataType::REDIRECT: 620 case PrefetchDataType::REDIRECT:
531 return is_host ? kHostRedirectTableName : kUrlRedirectTableName; 621 return is_host ? kHostRedirectTableName : kUrlRedirectTableName;
532 case PrefetchDataType::MANIFEST: 622 case PrefetchDataType::MANIFEST:
533 return kManifestTableName; 623 return kManifestTableName;
624 case PrefetchDataType::ORIGIN:
625 return kOriginTableName;
534 } 626 }
535 627
536 NOTREACHED(); 628 NOTREACHED();
537 return nullptr; 629 return nullptr;
538 } 630 }
539 631
540 } // namespace predictors 632 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698